From: Fernando Guzman Lugo <x0095840@xxxxxx> 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 <x0095840@xxxxxx> --- 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html