gfx: pvr: Lock gPVRSRVLock in PVRSRVMISR()
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Wed, 15 Feb 2012 13:02:27 +0000 (15:02 +0200)
committerMarkus Lehtonen <markus.lehtonen@linux.intel.com>
Tue, 3 Jul 2012 09:29:56 +0000 (12:29 +0300)
It's totally unclear how various data are protected in the driver.
Currently the MISR work is exectuted without holding the gPVRSRVLock
mutex, which is held across bridge ioctls. To play things safe,
take the same lock in MISR work.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Reviewed-by: Imre Deak <imre.deak@intel.com>
Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
drivers/staging/mrst/pvr/services4/srvkm/common/pvrsrv.c

index da4115d..6a13838 100644 (file)
@@ -1121,6 +1121,8 @@ static IMG_VOID PVRSRVMISR_ForEachCb(PVRSRV_DEVICE_NODE *psDeviceNode)
        }
 }
 
+extern struct mutex gPVRSRVLock;
+
 IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData)
 {
        SYS_DATA                        *psSysData = pvSysData;
@@ -1130,6 +1132,7 @@ IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData)
                return;
        }
 
+       mutex_lock(&gPVRSRVLock);
        
        List_PVRSRV_DEVICE_NODE_ForEach(psSysData->psDeviceNodeList,
                                                                        &PVRSRVMISR_ForEachCb);
@@ -1150,6 +1153,8 @@ IMG_VOID IMG_CALLCONV PVRSRVMISR(IMG_VOID *pvSysData)
                }
        }
 
+       mutex_unlock(&gPVRSRVLock);
+
        PVRSRVCheckPendingSyncs();
 }