@@ -690,8 +690,6 @@ static int memory_check_vma(unsigned long start, u32 len)
if (end <= start)
return -EINVAL;
- down_read(¤t->mm->mmap_sem);
-
while ((vma = find_vma(current->mm, start)) != NULL) {
if (vma->vm_start > start) {
@@ -708,8 +706,6 @@ static int memory_check_vma(unsigned long start, u32 len)
if (!vma)
err = -EINVAL;
- up_read(¤t->mm->mmap_sem);
-
return err;
}
@@ -734,18 +730,22 @@ static DSP_STATUS proc_memory_sync(DSP_HPROCESSOR hProcessor, void *pMpuAddr,
goto err_out;
}
+ down_read(¤t->mm->mmap_sem);
+
if (memory_check_vma((u32)pMpuAddr, ulSize)) {
GT_3trace(PROC_DebugMask, GT_7CLASS,
"%s: InValid address parameters\n",
__func__, pMpuAddr, ulSize);
status = DSP_EHANDLE;
- goto err_out;
+ goto err_mem_check;
}
(void)SYNC_EnterCS(hProcLock);
MEM_FlushCache(pMpuAddr, ulSize, FlushMemType);
(void)SYNC_LeaveCS(hProcLock);
+err_mem_check:
+ up_read(¤t->mm->mmap_sem);
err_out:
GT_2trace(PROC_DebugMask, GT_ENTER,
"Leaving %s [0x%x]", __func__, status);