From: Fernando Guzman Lugo <[EMAIL PROTECTED]>
Date: Mon, 17 Nov 2008 15:49:56 -0600
Subject: [PATCH] DSPBRIDGE: Free resources when user fails to do so

Added error protection in bridge driver to handle
the cases where user applications detach the
processor without releasing DMM resources.

Signed-off-by: Fernando Guzman Lugo <[EMAIL PROTECTED]>
---
 arch/arm/plat-omap/include/dspbridge/drv.h |   13 +++++++++++
 drivers/dsp/bridge/rmgr/drv.c              |    3 +-
 drivers/dsp/bridge/rmgr/proc.c             |   31 +++++++++++++++------------
 3 files changed, 31 insertions(+), 16 deletions(-)

diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h 
b/arch/arm/plat-omap/include/dspbridge/drv.h
index 0a8fb7e..4345b56 100644
--- a/arch/arm/plat-omap/include/dspbridge/drv.h
+++ b/arch/arm/plat-omap/include/dspbridge/drv.h
@@ -427,4 +427,17 @@ struct PROCESS_CONTEXT{
        extern DSP_STATUS DRV_ReleaseResources(IN u32 dwContext,
                                               struct DRV_OBJECT *hDrvObject);
 
+/*
+ *  ======== DRV_ProcFreeDMMRes ========
+ *  Purpose:
+ *       Actual DMM De-Allocation.
+ *  Parameters:
+ *      hPCtxt:      Path to the driver Registry Key.
+ *  Returns:
+ *      DSP_SOK if success;
+ */
+
+
+       extern DSP_STATUS  DRV_ProcFreeDMMRes(HANDLE hPCtxt);
+
 #endif                         /* DRV_ */
diff --git a/drivers/dsp/bridge/rmgr/drv.c b/drivers/dsp/bridge/rmgr/drv.c
index 2614103..22faf49 100644
--- a/drivers/dsp/bridge/rmgr/drv.c
+++ b/drivers/dsp/bridge/rmgr/drv.c
@@ -162,7 +162,6 @@ static DSP_STATUS RequestBridgeResourcesDSP(u32 dwContext, 
s32 fRequest);
 
 static DSP_STATUS PrintProcessInformation(void);
 static DSP_STATUS DRV_ProcFreeNodeRes(HANDLE hPCtxt);
-static DSP_STATUS  DRV_ProcFreeDMMRes(HANDLE hPCtxt);
 static DSP_STATUS  DRV_ProcFreeSTRMRes(HANDLE hPCtxt);
 extern enum NODE_STATE NODE_GetState(HANDLE hNode);
 
@@ -559,7 +558,7 @@ DSP_STATUS DRV_UpdateDMMResElement(HANDLE hDMMRes, u32 
pMpuAddr, u32 ulSize,
 }
 
 /* Actual DMM De-Allocation */
-static DSP_STATUS  DRV_ProcFreeDMMRes(HANDLE hPCtxt)
+DSP_STATUS  DRV_ProcFreeDMMRes(HANDLE hPCtxt)
 {
        struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
        DSP_STATUS status = DSP_SOK;
diff --git a/drivers/dsp/bridge/rmgr/proc.c b/drivers/dsp/bridge/rmgr/proc.c
index eb7781d..d7798e7 100644
--- a/drivers/dsp/bridge/rmgr/proc.c
+++ b/drivers/dsp/bridge/rmgr/proc.c
@@ -140,6 +140,7 @@
 #include <dspbridge/dbreg.h>
 #include <dspbridge/msg.h>
 #include <dspbridge/wmdioctl.h>
+#include <dspbridge/drv.h>
 
 /*  ----------------------------------- This */
 #include <dspbridge/proc.h>
@@ -646,25 +647,27 @@ DSP_STATUS PROC_Detach(DSP_HPROCESSOR hProcessor)
                        pProcObject->g_pszLastCoff = NULL;
                }
 
+#ifndef RES_CLEANUP_DISABLE
+               /* Return PID instead of process handle */
+               hProcess = current->pid;
+
+               res_status = CFG_GetObject((u32 *)&hDRVObject, REG_DRV_OBJECT);
+               if (DSP_SUCCEEDED(res_status)) {
+                       DRV_GetProcContext(hProcess,
+                               (struct DRV_OBJECT *)hDRVObject, &pPctxt,
+                                        NULL, 0);
+                       if (pPctxt != NULL) {
+                               DRV_ProcFreeDMMRes(pPctxt);
+                               pPctxt->hProcessor = NULL;
+                       }
+               }
+#endif
+
                /* Remove the Proc from the DEV List */
                (void)DEV_RemoveProcObject(pProcObject->hDevObject,
                        (u32)pProcObject);
                /* Free the Processor Object */
                MEM_FreeObject(pProcObject);
-#ifndef RES_CLEANUP_DISABLE
-       /* Return PID instead of process handle */
-       hProcess = current->pid;
-
-       res_status = CFG_GetObject((u32 *)&hDRVObject, REG_DRV_OBJECT);
-       /* res_status = CFG_GetObject(REG_DRV_OBJECT, (u32*)&hDRVObject); */
-       if (DSP_SUCCEEDED(res_status)) {
-               DRV_GetProcContext(hProcess,
-                                (struct DRV_OBJECT *)hDRVObject, &pPctxt,
-                                NULL, 0);
-               if (pPctxt != NULL)
-                       pPctxt->hProcessor = NULL;
-       }
-#endif
        } else {
                status = DSP_EHANDLE;
                GT_0trace(PROC_DebugMask, GT_7CLASS,
-- 
1.6.0
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to