diff mbox

[1/1] DSPBRIDGE: protect cache operation with mmap read semaphore

Message ID 1253862581-22173-1-git-send-email-Hiroshi.DOYU@nokia.com (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Hiroshi DOYU Sept. 25, 2009, 7:09 a.m. UTC
None
diff mbox

Patch

diff --git a/drivers/dsp/bridge/rmgr/proc.c b/drivers/dsp/bridge/rmgr/proc.c
index a75b64a..45cd04b 100644
--- a/drivers/dsp/bridge/rmgr/proc.c
+++ b/drivers/dsp/bridge/rmgr/proc.c
@@ -690,8 +690,6 @@  static int memory_check_vma(unsigned long start, u32 len)
 	if (end <= start)
 		return -EINVAL;
 
-	down_read(&current->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(&current->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(&current->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(&current->mm->mmap_sem);
 err_out:
 	GT_2trace(PROC_DebugMask, GT_ENTER,
 		  "Leaving %s [0x%x]", __func__, status);