diff options
Diffstat (limited to 'pvr-source/services4/srvkm/env/linux')
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/event.c | 2 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/ion.c | 2 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/mmap.c | 20 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/module.c | 8 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/mutex.c | 10 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/mutex.h | 7 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/osfunc.c | 6 | ||||
-rw-r--r-- | pvr-source/services4/srvkm/env/linux/pvr_bridge_k.c | 4 |
8 files changed, 38 insertions, 21 deletions
diff --git a/pvr-source/services4/srvkm/env/linux/event.c b/pvr-source/services4/srvkm/env/linux/event.c index b70a79d..c335640 100644 --- a/pvr-source/services4/srvkm/env/linux/event.c +++ b/pvr-source/services4/srvkm/env/linux/event.c @@ -396,7 +396,7 @@ PVRSRV_ERROR LinuxEventObjectWait(IMG_HANDLE hOSEventObject, IMG_UINT32 ui32MSTi ui32TimeOutJiffies = (IMG_UINT32)schedule_timeout((IMG_INT32)ui32TimeOutJiffies); - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); #if defined(DEBUG) psLinuxEventObject->ui32Stats++; #endif diff --git a/pvr-source/services4/srvkm/env/linux/ion.c b/pvr-source/services4/srvkm/env/linux/ion.c index 3e772bc..e84fdc4 100644 --- a/pvr-source/services4/srvkm/env/linux/ion.c +++ b/pvr-source/services4/srvkm/env/linux/ion.c @@ -74,7 +74,7 @@ int PVRSRVExportFDToIONHandles(int fd, struct ion_client **client, int ret = -EINVAL; /* Take the bridge mutex so the handle won't be freed underneath us */ - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); psFile = fget(fd); if(!psFile) diff --git a/pvr-source/services4/srvkm/env/linux/mmap.c b/pvr-source/services4/srvkm/env/linux/mmap.c index 1a485c4..495031a 100644 --- a/pvr-source/services4/srvkm/env/linux/mmap.c +++ b/pvr-source/services4/srvkm/env/linux/mmap.c @@ -408,7 +408,7 @@ PVRMMapOSMemHandleToMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, IMG_HANDLE hOSMemHandle; PVRSRV_ERROR eError; - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); PVR_ASSERT(PVRSRVGetMaxHandle(psPerProc->psHandleBase) <= MAX_MMAP_HANDLE); @@ -567,7 +567,7 @@ PVRMMapReleaseMMapData(PVRSRV_PER_PROCESS_DATA *psPerProc, PVRSRV_ERROR eError; IMG_UINT32 ui32PID = OSGetCurrentProcessIDKM(); - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); PVR_ASSERT(PVRSRVGetMaxHandle(psPerProc->psHandleBase) <= MAX_MMAP_HANDLE); @@ -869,7 +869,7 @@ MMapVOpenNoLock(struct vm_area_struct* ps_vma) static void MMapVOpen(struct vm_area_struct* ps_vma) { - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); MMapVOpenNoLock(ps_vma); @@ -914,7 +914,7 @@ MMapVCloseNoLock(struct vm_area_struct* ps_vma) static void MMapVClose(struct vm_area_struct* ps_vma) { - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); MMapVCloseNoLock(ps_vma); @@ -936,7 +936,7 @@ static int MMapVAccess(struct vm_area_struct *ps_vma, unsigned long addr, int iRetVal = -EINVAL; IMG_VOID *pvKernelAddr; - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); psOffsetStruct = (PKV_OFFSET_STRUCT)ps_vma->vm_private_data; psLinuxMemArea = psOffsetStruct->psLinuxMemArea; @@ -1022,7 +1022,7 @@ PVRMMap(struct file* pFile, struct vm_area_struct* ps_vma) PVR_UNREFERENCED_PARAMETER(pFile); - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); ui32ByteSize = ps_vma->vm_end - ps_vma->vm_start; @@ -1200,7 +1200,7 @@ static void ProcSeqStartstopMMapRegistations(struct seq_file *sfile,IMG_BOOL sta { if(start) { - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); } else { @@ -1361,7 +1361,7 @@ PVRMMapRegisterArea(LinuxMemArea *psLinuxMemArea) const IMG_CHAR *pszName = LinuxMemAreaTypeToString(LinuxMemAreaRootType(psLinuxMemArea)); #endif - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); #if defined(DEBUG) || defined(DEBUG_LINUX_MMAP_AREAS) PVR_DPF((PVR_DBG_MESSAGE, @@ -1426,7 +1426,7 @@ PVRMMapRemoveRegisteredArea(LinuxMemArea *psLinuxMemArea) PVRSRV_ERROR eError; PKV_OFFSET_STRUCT psOffsetStruct, psTmpOffsetStruct; - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); PVR_ASSERT(psLinuxMemArea->bMMapRegistered); @@ -1519,7 +1519,7 @@ LinuxMMapPerProcessDisconnect(PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc) PVR_UNREFERENCED_PARAMETER(psEnvPerProc); - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); list_for_each_entry_safe(psOffsetStruct, psTmpOffsetStruct, &g_sMMapOffsetStructList, sMMapItem) { diff --git a/pvr-source/services4/srvkm/env/linux/module.c b/pvr-source/services4/srvkm/env/linux/module.c index 487069d..4465f36 100644 --- a/pvr-source/services4/srvkm/env/linux/module.c +++ b/pvr-source/services4/srvkm/env/linux/module.c @@ -482,7 +482,7 @@ PVR_MOD_STATIC void PVRSRVDriverShutdown(LDM_DEV *pDevice) * processes trying to use the driver after it has been * shutdown. */ - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); (void) PVRSRVSetPowerStateKM(PVRSRV_SYS_POWER_STATE_D3); } @@ -543,7 +543,7 @@ PVR_MOD_STATIC int PVRSRVDriverSuspend(LDM_DEV *pDevice, pm_message_t state) if (!bDriverIsSuspended && !bDriverIsShutdown) { - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); if (PVRSRVSetPowerStateKM(PVRSRV_SYS_POWER_STATE_D3) == PVRSRV_OK) { @@ -734,7 +734,7 @@ static int PVRSRVOpen(struct inode unref__ * pInode, struct file *pFile) PVRSRV_ENV_PER_PROCESS_DATA *psEnvPerProc; #endif - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); ui32PID = OSGetCurrentProcessIDKM(); @@ -805,7 +805,7 @@ static int PVRSRVRelease(struct inode unref__ * pInode, struct file *pFile) PVRSRV_FILE_PRIVATE_DATA *psPrivateData; int err = 0; - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); #if defined(SUPPORT_DRI_DRM) psPrivateData = (PVRSRV_FILE_PRIVATE_DATA *)pvPrivData; diff --git a/pvr-source/services4/srvkm/env/linux/mutex.c b/pvr-source/services4/srvkm/env/linux/mutex.c index 2cd666f..a7e6c12 100644 --- a/pvr-source/services4/srvkm/env/linux/mutex.c +++ b/pvr-source/services4/srvkm/env/linux/mutex.c @@ -66,6 +66,11 @@ IMG_VOID LinuxLockMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex) mutex_lock(psPVRSRVMutex); } +IMG_VOID LinuxLockMutexNested(PVRSRV_LINUX_MUTEX *psPVRSRVMutex, unsigned int uiLockClass) +{ + mutex_lock_nested(psPVRSRVMutex, uiLockClass); +} + PVRSRV_ERROR LinuxLockMutexInterruptible(PVRSRV_LINUX_MUTEX *psPVRSRVMutex) { if(mutex_lock_interruptible(psPVRSRVMutex) == -EINTR) @@ -109,6 +114,11 @@ IMG_VOID LinuxLockMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex) atomic_dec(&psPVRSRVMutex->Count); } +IMG_VOID LinuxLockMutexNested(PVRSRV_LINUX_MUTEX *psPVRSRVMutex, unsigned int uiLockClass) +{ + LinuxLockMutex(psPVRSRVMutex); +} + PVRSRV_ERROR LinuxLockMutexInterruptible(PVRSRV_LINUX_MUTEX *psPVRSRVMutex) { if(down_interruptible(&psPVRSRVMutex->sSemaphore) == -EINTR) diff --git a/pvr-source/services4/srvkm/env/linux/mutex.h b/pvr-source/services4/srvkm/env/linux/mutex.h index c590da1..816cf4a 100644 --- a/pvr-source/services4/srvkm/env/linux/mutex.h +++ b/pvr-source/services4/srvkm/env/linux/mutex.h @@ -72,11 +72,18 @@ typedef struct { #endif +enum PVRSRV_MUTEX_LOCK_CLASS +{ + PVRSRV_LOCK_CLASS_BRIDGE, + PVRSRV_LOCK_CLASS_MMAP, +}; extern IMG_VOID LinuxInitMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex); extern IMG_VOID LinuxLockMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex); +extern IMG_VOID LinuxLockMutexNested(PVRSRV_LINUX_MUTEX *psPVRSRVMutex, unsigned int uiLockClass); + extern PVRSRV_ERROR LinuxLockMutexInterruptible(PVRSRV_LINUX_MUTEX *psPVRSRVMutex); extern IMG_INT32 LinuxTryLockMutex(PVRSRV_LINUX_MUTEX *psPVRSRVMutex); diff --git a/pvr-source/services4/srvkm/env/linux/osfunc.c b/pvr-source/services4/srvkm/env/linux/osfunc.c index ac03185..4c39621 100644 --- a/pvr-source/services4/srvkm/env/linux/osfunc.c +++ b/pvr-source/services4/srvkm/env/linux/osfunc.c @@ -4079,7 +4079,7 @@ IMG_BOOL CheckExecuteCacheOp(IMG_HANDLE hOSMemHandle, PVR_ASSERT(psLinuxMemArea != IMG_NULL); - LinuxLockMutex(&g_sMMapMutex); + LinuxLockMutexNested(&g_sMMapMutex, PVRSRV_LOCK_CLASS_MMAP); psMMapOffsetStructList = &psLinuxMemArea->sMMapOffsetStructList; ui32AreaLength = psLinuxMemArea->ui32ByteSize; @@ -4609,7 +4609,7 @@ IMG_VOID OSReleaseBridgeLock(IMG_VOID) IMG_VOID OSReacquireBridgeLock(IMG_VOID) { - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); } typedef struct _OSTime @@ -4627,7 +4627,7 @@ PVRSRV_ERROR OSTimeCreateWithUSOffset(IMG_PVOID *pvRet, IMG_UINT32 ui32USOffset) return PVRSRV_ERROR_OUT_OF_MEMORY; } - psOSTime->ulTime = usecs_to_jiffies(jiffies_to_usecs(jiffies) + ui32USOffset); + psOSTime->ulTime = jiffies + usecs_to_jiffies(ui32USOffset); *pvRet = psOSTime; return PVRSRV_OK; } diff --git a/pvr-source/services4/srvkm/env/linux/pvr_bridge_k.c b/pvr-source/services4/srvkm/env/linux/pvr_bridge_k.c index 5d1ad8c..23379b9 100644 --- a/pvr-source/services4/srvkm/env/linux/pvr_bridge_k.c +++ b/pvr-source/services4/srvkm/env/linux/pvr_bridge_k.c @@ -141,7 +141,7 @@ static void ProcSeqStartstopBridgeStats(struct seq_file *sfile,IMG_BOOL start) { if(start) { - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); } else { @@ -253,7 +253,7 @@ PVRSRV_BridgeDispatchKM(struct file *pFile, unsigned int unref__ ioctlCmd, unsig PVRSRV_PER_PROCESS_DATA *psPerProc; IMG_INT err = -EFAULT; - LinuxLockMutex(&gPVRSRVLock); + LinuxLockMutexNested(&gPVRSRVLock, PVRSRV_LOCK_CLASS_BRIDGE); #if defined(SUPPORT_DRI_DRM) psBridgePackageKM = (PVRSRV_BRIDGE_PACKAGE *)arg; |