From: Ameya Palande <ameya.pala...@nokia.com>

Remove old resource cleanup implementation, and use the process
context pointer stored in filp->private.

Signed-off-by: Ameya Palande <ameya.pala...@nokia.com>
[ orl: split into logical patch set, patch description ]
Signed-off-by: Omar Ramirez Luna <omar.rami...@ti.com>
Acked-by: Fernando Guzman Lugo <x0095...@ti.com>
---
 arch/arm/plat-omap/include/dspbridge/drv.h         |    5 +-
 arch/arm/plat-omap/include/dspbridge/proc.h        |   24 +++
 .../plat-omap/include/dspbridge/resourcecleanup.h  |    7 +-
 drivers/dsp/bridge/rmgr/drv.c                      |  126 ++++------------
 drivers/dsp/bridge/rmgr/drv_interface.c            |   18 ++-
 drivers/dsp/bridge/rmgr/node.c                     |   65 +-------
 drivers/dsp/bridge/rmgr/proc.c                     |  158 ++++---------------
 drivers/dsp/bridge/rmgr/strm.c                     |  104 +++-----------
 8 files changed, 134 insertions(+), 373 deletions(-)

diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h 
b/arch/arm/plat-omap/include/dspbridge/drv.h
index c468461..efc3a92 100644
--- a/arch/arm/plat-omap/include/dspbridge/drv.h
+++ b/arch/arm/plat-omap/include/dspbridge/drv.h
@@ -180,8 +180,9 @@ struct PROCESS_CONTEXT{
        * (To maintain a linked list of process contexts) */
        struct PROCESS_CONTEXT *next;
 
-       /* Processor info to which the process is related */
-       DSP_HPROCESSOR hProcessor;
+       /* List of Processors */
+       struct list_head processor_list;
+       spinlock_t proc_list_lock;
 
        /* DSP Node resources */
        struct NODE_RES_OBJECT *pNodeList;
diff --git a/arch/arm/plat-omap/include/dspbridge/proc.h 
b/arch/arm/plat-omap/include/dspbridge/proc.h
index f5b0c50..d4896d5 100644
--- a/arch/arm/plat-omap/include/dspbridge/proc.h
+++ b/arch/arm/plat-omap/include/dspbridge/proc.h
@@ -66,6 +66,30 @@
 #include <dspbridge/devdefs.h>
 #include <dspbridge/drv.h>
 
+/* The PROC_OBJECT structure.   */
+struct PROC_OBJECT {
+       struct LST_ELEM link;           /* Link to next PROC_OBJECT */
+       u32 dwSignature;                /* Used for object validation */
+       struct DEV_OBJECT *hDevObject;  /* Device this PROC represents */
+       u32 hProcess;                   /* Process owning this Processor */
+       struct MGR_OBJECT *hMgrObject;  /* Manager Object Handle */
+       u32 uAttachCount;               /* Processor attach count */
+       u32 uProcessor;                 /* Processor number */
+       u32 uTimeout;                   /* Time out count */
+       enum DSP_PROCSTATE sState;      /* Processor state */
+       u32 ulUnit;                     /* DDSP unit number */
+       bool bIsAlreadyAttached;        /*
+                                        * True if the Device below has
+                                        * GPP Client attached
+                                        */
+       struct NTFY_OBJECT *hNtfy;      /* Manages  notifications */
+       struct WMD_DEV_CONTEXT *hWmdContext;    /* WMD Context Handle */
+       struct WMD_DRV_INTERFACE *pIntfFxns;    /* Function interface to WMD */
+       char *g_pszLastCoff;
+       struct list_head proc_object;
+};
+
+
 /*
  *  ======== PROC_Attach ========
  *  Purpose:
diff --git a/arch/arm/plat-omap/include/dspbridge/resourcecleanup.h 
b/arch/arm/plat-omap/include/dspbridge/resourcecleanup.h
index b43fa16..f32da22 100644
--- a/arch/arm/plat-omap/include/dspbridge/resourcecleanup.h
+++ b/arch/arm/plat-omap/include/dspbridge/resourcecleanup.h
@@ -35,15 +35,10 @@ extern DSP_STATUS DRV_ProcUpdatestate(HANDLE pCtxt,
 
 extern DSP_STATUS DRV_ProcSetPID(HANDLE pCtxt, s32 hProcess);
 
-extern DSP_STATUS DRV_GetProcContext(u32 phProcess,
-                               struct DRV_OBJECT *hDrvObject,
-                               HANDLE hPCtxt, DSP_HNODE hNode,
-                               u32 pMapAddr);
-
 extern DSP_STATUS DRV_RemoveAllResources(HANDLE pPctxt);
 
 extern DSP_STATUS DRV_RemoveProcContext(struct DRV_OBJECT *hDRVObject,
-                                    HANDLE hPCtxt, HANDLE hProcess);
+                                    HANDLE pr_ctxt);
 
 extern DSP_STATUS DRV_GetNodeResElement(HANDLE hNode, HANDLE nodeRes,
                                        HANDLE pCtxt);
diff --git a/drivers/dsp/bridge/rmgr/drv.c b/drivers/dsp/bridge/rmgr/drv.c
index a00598b..92e2a62 100644
--- a/drivers/dsp/bridge/rmgr/drv.c
+++ b/drivers/dsp/bridge/rmgr/drv.c
@@ -194,77 +194,6 @@ DSP_STATUS DRV_GetProcCtxtList(struct PROCESS_CONTEXT 
**pPctxt,
        return status;
 }
 
-
-
-/* Get a particular process context based on process handle (phProcess) */
-DSP_STATUS DRV_GetProcContext(u32 phProcess,
-                               struct DRV_OBJECT *hDrvObject,
-                               HANDLE hPCtxt, DSP_HNODE hNode,
-                               u32 pMapAddr)
-{
-       struct PROCESS_CONTEXT **pCtxt = (struct PROCESS_CONTEXT **)hPCtxt;
-       DSP_STATUS status = DSP_SOK;
-       struct PROCESS_CONTEXT *pCtxtList = NULL;
-       struct DRV_OBJECT *pDrvObject = (struct DRV_OBJECT *)hDrvObject;
-       struct NODE_RES_OBJECT *pTempNode2 = NULL;
-       struct NODE_RES_OBJECT *pTempNode = NULL;
-       struct DMM_RES_OBJECT *pTempDMM2 = NULL;
-       struct DMM_RES_OBJECT *pTempDMM = NULL;
-       s32 pCtxtFound = 0;
-
-       DBC_Assert(pDrvObject != NULL);
-       pCtxtList = pDrvObject->procCtxtList;
-       GT_0trace(curTrace, GT_ENTER, "2DRV_GetProcContext: 2");
-       while ((pCtxtList != NULL) && (pCtxtList->pid != phProcess)) {
-               pCtxtList = pCtxtList->next;
-               GT_0trace(curTrace, GT_ENTER, "2DRV_GetProcContext: 3");
-       }
-       if (pCtxtList == NULL) {
-               if (hNode != NULL) {
-                       pCtxtList = pDrvObject->procCtxtList;
-                       while ((pCtxtList != NULL) && (pCtxtFound == 0)) {
-                               pTempNode = pCtxtList->pNodeList;
-                               while ((pTempNode != NULL) &&
-                                     (pTempNode->hNode != hNode)) {
-                                       pTempNode2 = pTempNode;
-                                       pTempNode = pTempNode->next;
-                               }
-                               if (pTempNode != NULL) {
-                                       pCtxtFound = 1;
-                                       status = DSP_SOK;
-                               } else {
-                                       pCtxtList = pCtxtList->next;
-                               }
-                       }
-               } else if ((pMapAddr != 0) && (pCtxtFound == 0)) {
-                       pCtxtList = pDrvObject->procCtxtList;
-                       while ((pCtxtList != NULL) && (pCtxtFound == 0)) {
-                               pTempDMM = pCtxtList->pDMMList;
-                               while ((pTempDMM != NULL) &&
-                                    (pTempDMM->ulDSPAddr != pMapAddr)) {
-                                       pTempDMM2 = pTempDMM;
-                                       pTempDMM = pTempDMM->next;
-                               }
-                               if (pTempDMM != NULL) {
-                                       pCtxtFound = 1;
-                                       status = DSP_SOK;
-                               } else {
-                                       pCtxtList = pCtxtList->next;
-                               }
-                       }
-                       if (pCtxtList == NULL)
-                               status = DSP_ENOTFOUND;
-
-               }
-       } else{
-               status = DSP_SOK;
-       }
-       GT_0trace(curTrace, GT_ENTER, "2DRV_GetProcContext: 4");
-       *pCtxt = pCtxtList;
-       return status;
-}
-
-
 /* Add a new process context to process context list */
 DSP_STATUS DRV_InsertProcContext(struct DRV_OBJECT *hDrVObject, HANDLE hPCtxt)
 {
@@ -274,9 +203,19 @@ DSP_STATUS DRV_InsertProcContext(struct DRV_OBJECT 
*hDrVObject, HANDLE hPCtxt)
        struct DRV_OBJECT            *hDRVObject;
 
        GT_0trace(curTrace, GT_ENTER, "\n In DRV_InsertProcContext\n");
+
        status = CFG_GetObject((u32 *)&hDRVObject, REG_DRV_OBJECT);
        DBC_Assert(hDRVObject != NULL);
+
        *pCtxt = MEM_Calloc(1 * sizeof(struct PROCESS_CONTEXT), MEM_PAGED);
+       if (!*pCtxt) {
+               pr_err("DSP: MEM_Calloc failed in DRV_InsertProcContext\n");
+               return DSP_EMEMORY;
+       }
+
+       spin_lock_init(&(*pCtxt)->proc_list_lock);
+       INIT_LIST_HEAD(&(*pCtxt)->processor_list);
+
        GT_0trace(curTrace, GT_ENTER,
                 "\n In DRV_InsertProcContext Calling "
                 "DRV_GetProcCtxtList\n");
@@ -303,36 +242,36 @@ DSP_STATUS DRV_InsertProcContext(struct DRV_OBJECT 
*hDrVObject, HANDLE hPCtxt)
 
 /* Delete a process context from process resource context list */
 DSP_STATUS DRV_RemoveProcContext(struct DRV_OBJECT *hDRVObject,
-                                    HANDLE hPCtxt, HANDLE hProcess)
+               HANDLE pr_ctxt)
 {
        DSP_STATUS status = DSP_SOK;
-       struct PROCESS_CONTEXT    *pCtxt2 = NULL;
-       struct PROCESS_CONTEXT    *pTmp = NULL;
-       struct PROCESS_CONTEXT    *pCtxtList = NULL;
+       struct PROCESS_CONTEXT *pr_ctxt_list = NULL;
+       struct PROCESS_CONTEXT *ptr_prev;
 
        DBC_Assert(hDRVObject != NULL);
-       DRV_GetProcContext((u32)hProcess, hDRVObject, &pCtxt2, NULL, 0);
 
        GT_0trace(curTrace, GT_ENTER, "DRV_RemoveProcContext: 12");
-       DRV_GetProcCtxtList(&pCtxtList, hDRVObject);
+       DRV_GetProcCtxtList(&pr_ctxt_list, hDRVObject);
+       ptr_prev = pr_ctxt_list;
+
        GT_0trace(curTrace, GT_ENTER, "DRV_RemoveProcContext: 13");
-       pTmp = pCtxtList;
-       while ((pCtxtList != NULL) && (pCtxtList != pCtxt2)) {
-               pTmp = pCtxtList;
-               pCtxtList = pCtxtList->next;
+       while (pr_ctxt_list && (pr_ctxt_list != pr_ctxt)) {
+               ptr_prev = pr_ctxt_list;
+               pr_ctxt_list = pr_ctxt_list->next;
                GT_0trace(curTrace, GT_ENTER,
                         "DRV_RemoveProcContext: 2");
        }
+
        GT_0trace(curTrace, GT_ENTER, "DRV_RemoveProcContext: 3");
-       if (hDRVObject->procCtxtList == pCtxt2)
-               hDRVObject->procCtxtList = pCtxt2->next;
 
-       if (pCtxtList == NULL)
+       if (!pr_ctxt_list)
                return DSP_ENOTFOUND;
-       else if (pTmp->next != NULL)
-               pTmp->next = pTmp->next->next;
+       else if (hDRVObject->procCtxtList == pr_ctxt_list)
+               hDRVObject->procCtxtList = pr_ctxt_list->next;
+       else
+               ptr_prev->next = pr_ctxt_list->next;
 
-       MEM_Free(pCtxt2);
+       MEM_Free(pr_ctxt);
        GT_0trace(curTrace, GT_ENTER, "DRV_RemoveProcContext: 7");
 
        return status;
@@ -1000,6 +939,7 @@ static DSP_STATUS PrintProcessInformation(void)
        struct PROCESS_CONTEXT *pCtxtList = NULL;
        struct NODE_RES_OBJECT *pNodeRes = NULL;
        struct DMM_RES_OBJECT *pDMMRes = NULL;
+       struct PROC_OBJECT *proc_obj_ptr;
        struct STRM_RES_OBJECT *pSTRMRes = NULL;
        struct DSPHEAP_RES_OBJECT *pDSPHEAPRes = NULL;
        DSP_STATUS status = DSP_SOK;
@@ -1028,11 +968,11 @@ static DSP_STATUS PrintProcessInformation(void)
                        GT_0trace(curTrace, GT_4CLASS, "\nThe Process"
                                        " is in DeAllocated state\n");
                }
-               GT_1trace(curTrace, GT_4CLASS, "\nThe  hProcessor"
-                               " handle is: 0X%x\n",
-                               (u32)pCtxtList->hProcessor);
-               if (pCtxtList->hProcessor != NULL) {
-                       PROC_GetProcessorId(pCtxtList->hProcessor, &procID);
+
+               spin_lock(&pCtxtList->proc_list_lock);
+               list_for_each_entry(proc_obj_ptr, &pCtxtList->processor_list,
+                               proc_object) {
+                       PROC_GetProcessorId(proc_obj_ptr, &procID);
                        if (procID == DSP_UNIT) {
                                GT_0trace(curTrace, GT_4CLASS,
                                        "\nProcess connected to"
@@ -1046,6 +986,8 @@ static DSP_STATUS PrintProcessInformation(void)
                                        "\n***ERROR:Invalid Processor Id***\n");
                        }
                }
+               spin_unlock(&pCtxtList->proc_list_lock);
+
                pNodeRes = pCtxtList->pNodeList;
                tempCount = 1;
                while (pNodeRes != NULL) {
diff --git a/drivers/dsp/bridge/rmgr/drv_interface.c 
b/drivers/dsp/bridge/rmgr/drv_interface.c
index a8ddf7c..22e81bd 100644
--- a/drivers/dsp/bridge/rmgr/drv_interface.c
+++ b/drivers/dsp/bridge/rmgr/drv_interface.c
@@ -423,6 +423,7 @@ static int __devexit omap34xx_bridge_remove(struct 
platform_device *pdev)
        HANDLE       hDrvObject = NULL;
        struct PROCESS_CONTEXT  *pTmp = NULL;
        struct PROCESS_CONTEXT    *pCtxtclosed = NULL;
+       struct PROC_OBJECT *proc_obj_ptr, *temp;
 
        GT_0trace(driverTrace, GT_ENTER, "-> driver_exit\n");
 
@@ -445,10 +446,13 @@ static int __devexit omap34xx_bridge_remove(struct 
platform_device *pdev)
                GT_1trace(driverTrace, GT_5CLASS, "***Cleanup of "
                         "process***%d\n", pCtxtclosed->pid);
                DRV_RemoveAllResources(pCtxtclosed);
-               PROC_Detach(pCtxtclosed->hProcessor, pCtxtclosed);
+               list_for_each_entry_safe(proc_obj_ptr, temp,
+                               &pCtxtclosed->processor_list, proc_object) {
+                       PROC_Detach(proc_obj_ptr, pCtxtclosed);
+               }
                pTmp = pCtxtclosed->next;
                DRV_RemoveProcContext((struct DRV_OBJECT *)hDrvObject,
-                                    pCtxtclosed, (void *)pCtxtclosed->pid);
+                                    pCtxtclosed);
                pCtxtclosed = pTmp;
        }
 
@@ -581,6 +585,7 @@ static int bridge_release(struct inode *ip, struct file 
*filp)
        DSP_STATUS dsp_status;
        HANDLE hDrvObject;
        struct PROCESS_CONTEXT *pr_ctxt;
+       struct PROC_OBJECT *proc_obj_ptr, *temp;
 
        GT_0trace(driverTrace, GT_ENTER, "-> bridge_release\n");
 
@@ -592,10 +597,13 @@ static int bridge_release(struct inode *ip, struct file 
*filp)
                if (DSP_SUCCEEDED(dsp_status)) {
                        flush_signals(current);
                        DRV_RemoveAllResources(pr_ctxt);
-                       if (pr_ctxt->hProcessor)
-                               PROC_Detach(pr_ctxt->hProcessor, pr_ctxt);
+                       list_for_each_entry_safe(proc_obj_ptr, temp,
+                                       &pr_ctxt->processor_list,
+                                       proc_object) {
+                               PROC_Detach(proc_obj_ptr, pr_ctxt);
+                       }
                        DRV_RemoveProcContext((struct DRV_OBJECT *)hDrvObject,
-                                       pr_ctxt, (void *)pr_ctxt->pid);
+                                       pr_ctxt);
                } else {
                        status = -EIO;
                }
diff --git a/drivers/dsp/bridge/rmgr/node.c b/drivers/dsp/bridge/rmgr/node.c
index d36dccc..9127751 100644
--- a/drivers/dsp/bridge/rmgr/node.c
+++ b/drivers/dsp/bridge/rmgr/node.c
@@ -417,11 +417,7 @@ DSP_STATUS NODE_Allocate(struct PROC_OBJECT *hProcessor,
 #endif
 
 #ifndef RES_CLEANUP_DISABLE
-       HANDLE       hDrvObject;
        HANDLE       nodeRes;
-       u32                  hProcess;
-       struct PROCESS_CONTEXT   *pPctxt = NULL;
-       DSP_STATUS res_status = DSP_SOK;
 #endif
 
        DBC_Require(cRefs > 0);
@@ -782,45 +778,9 @@ func_cont2:
 
 #ifndef RES_CLEANUP_DISABLE
        if (DSP_SUCCEEDED(status)) {
-               /* Return TGID instead of process handle */
-               hProcess = current->tgid;
-
-               res_status = CFG_GetObject((u32 *)&hDrvObject,
-                                         REG_DRV_OBJECT);
-               if (DSP_SUCCEEDED(res_status)) {
-                       DRV_GetProcContext(hProcess,
-                                        (struct DRV_OBJECT *)hDrvObject,
-                                        &pPctxt, *phNode, 0);
-                       if (pPctxt == NULL) {
-                               DRV_InsertProcContext(
-                                       (struct DRV_OBJECT *)hDrvObject,
-                                       &pPctxt);
-                               if (pPctxt != NULL) {
-                                       DRV_ProcUpdatestate(pPctxt,
-                                                       PROC_RES_ALLOCATED);
-                                       DRV_ProcSetPID(pPctxt, hProcess);
-                                       pPctxt->hProcessor =
-                                                (DSP_HPROCESSOR)hProcessor;
-                               }
-                       }
-               }
-       }
-       if (DSP_SUCCEEDED(status)) {
-               /* Return TGID instead of process handle */
-               hProcess = current->tgid;
-               res_status = CFG_GetObject((u32 *)&hDrvObject,
-                                       REG_DRV_OBJECT);
-               if (DSP_SUCCEEDED(res_status)) {
-                       DRV_GetProcContext(hProcess,
-                                        (struct DRV_OBJECT *)hDrvObject,
-                                        &pPctxt, *phNode, 0);
-                       if (pPctxt != NULL) {
-                               DRV_InsertNodeResElement(*phNode, &nodeRes,
-                                                        pPctxt);
-                               DRV_ProcNodeUpdateHeapStatus(nodeRes, true);
-                               DRV_ProcNodeUpdateStatus(nodeRes, true);
-                       }
-               }
+               DRV_InsertNodeResElement(*phNode, &nodeRes, pr_ctxt);
+               DRV_ProcNodeUpdateHeapStatus(nodeRes, true);
+               DRV_ProcNodeUpdateStatus(nodeRes, true);
        }
 #endif
        DBC_Ensure((DSP_FAILED(status) && (*phNode == NULL)) ||
@@ -1640,11 +1600,7 @@ DSP_STATUS NODE_Delete(struct NODE_OBJECT *hNode,
        struct WMD_DRV_INTERFACE *pIntfFxns;
 
 #ifndef RES_CLEANUP_DISABLE
-       u32                     hProcess;
        HANDLE          nodeRes;
-       HANDLE          hDrvObject;
-       struct PROCESS_CONTEXT *pCtxt = NULL;
-       DSP_STATUS res_status = DSP_SOK;
 #endif
        struct DSP_PROCESSORSTATE procStatus;
        DBC_Require(cRefs > 0);
@@ -1770,16 +1726,9 @@ func_cont1:
         /*  Free host-side resources allocated by NODE_Create()
         *  DeleteNode() fails if SM buffers not freed by client!  */
 #ifndef RES_CLEANUP_DISABLE
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-       res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
-       if (DSP_FAILED(res_status))
-               goto func_cont;
-       DRV_GetProcContext(0, (struct DRV_OBJECT *)hDrvObject,
-                                               &pCtxt, hNode, 0);
-       if (pCtxt == NULL)
+       if (!pr_ctxt)
                goto func_cont;
-       if (DRV_GetNodeResElement(hNode, &nodeRes, pCtxt) != DSP_ENOTFOUND) {
+       if (DRV_GetNodeResElement(hNode, &nodeRes, pr_ctxt) != DSP_ENOTFOUND) {
                GT_0trace(NODE_debugMask, GT_5CLASS, "\nNODE_Delete12:\n");
                DRV_ProcNodeUpdateStatus(nodeRes, false);
        }
@@ -1789,8 +1738,8 @@ func_cont:
        DeleteNode(hNode, pr_ctxt);
 #ifndef RES_CLEANUP_DISABLE
        GT_0trace(NODE_debugMask, GT_5CLASS, "\nNODE_Delete2:\n ");
-       if (pCtxt != NULL)
-               DRV_RemoveNodeResElement(nodeRes, (HANDLE)pCtxt);
+       if (pr_ctxt)
+               DRV_RemoveNodeResElement(nodeRes, pr_ctxt);
 #endif
        GT_0trace(NODE_debugMask, GT_ENTER, "\nNODE_Delete3:\n ");
        /* Exit critical section */
diff --git a/drivers/dsp/bridge/rmgr/proc.c b/drivers/dsp/bridge/rmgr/proc.c
index 270d022..6f46a36 100644
--- a/drivers/dsp/bridge/rmgr/proc.c
+++ b/drivers/dsp/bridge/rmgr/proc.c
@@ -160,27 +160,6 @@
 #define EXTEND       "_EXT_END"        /* Extmem end addr in DSP binary */
 
 extern char *iva_img;
-/* The PROC_OBJECT structure.   */
-struct PROC_OBJECT {
-       struct LST_ELEM link;           /* Link to next PROC_OBJECT */
-       u32 dwSignature;        /* Used for object validation */
-       struct DEV_OBJECT *hDevObject;  /* Device this PROC represents */
-       u32 hProcess;   /* Process owning this Processor */
-       struct MGR_OBJECT *hMgrObject;  /* Manager Object Handle */
-       u32 uAttachCount;       /* Processor attach count */
-       u32 uProcessor; /* Processor number */
-       u32 uTimeout;           /* Time out count */
-       enum DSP_PROCSTATE sState;      /* Processor state */
-       u32 ulUnit;             /* DDSP unit number */
-       bool bIsAlreadyAttached;        /*
-                                        * True if the Device below has
-                                        * GPP Client attached
-                                        */
-       struct NTFY_OBJECT *hNtfy;      /* Manages  notifications */
-       struct WMD_DEV_CONTEXT *hWmdContext;    /* WMD Context Handle */
-       struct WMD_DRV_INTERFACE *pIntfFxns;    /* Function interface to WMD */
-       char *g_pszLastCoff;
-} ;
 
 /*  ----------------------------------- Globals */
 #if GT_TRACE
@@ -207,24 +186,32 @@ static char **PrependEnvp(char **newEnvp, char **envp, 
s32 cEnvp, s32 cNewEnvp,
 DSP_STATUS PROC_CleanupAllResources(void)
 {
        DSP_STATUS dsp_status = DSP_SOK;
-       HANDLE       hDrvObject = NULL;
-       struct PROCESS_CONTEXT    *pCtxtclosed = NULL;
+       HANDLE hDrvObject = NULL;
+       struct PROCESS_CONTEXT *pCtxtclosed = NULL;
+       struct PROC_OBJECT *proc_obj_ptr, *temp;
+
        GT_0trace(PROC_DebugMask, GT_ENTER, "PROC_CleanupAllResources\n");
+
        dsp_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
        if (DSP_FAILED(dsp_status))
                goto func_end;
+
        DRV_GetProcCtxtList(&pCtxtclosed, (struct DRV_OBJECT *)hDrvObject);
+
        while (pCtxtclosed != NULL) {
                if (current->tgid != pCtxtclosed->pid) {
                        GT_1trace(PROC_DebugMask, GT_5CLASS,
                                 "***Cleanup of "
                                 "process***%d\n", pCtxtclosed->pid);
-                       if (pCtxtclosed->hProcessor)
-                               PROC_Detach(pCtxtclosed->hProcessor,
-                                               pCtxtclosed);
+                       list_for_each_entry_safe(proc_obj_ptr, temp,
+                                       &pCtxtclosed->processor_list,
+                                       proc_object) {
+                               PROC_Detach(proc_obj_ptr, pCtxtclosed);
+                       }
                }
                pCtxtclosed = pCtxtclosed->next;
        }
+
        WMD_DEH_ReleaseDummyMem();
 func_end:
        return dsp_status;
@@ -247,19 +234,13 @@ PROC_Attach(u32 uProcessor, OPTIONAL CONST struct 
DSP_PROCESSORATTRIN *pAttrIn,
        struct DRV_OBJECT *hDrvObject = NULL;
        u32 devType;
 
-#ifndef RES_CLEANUP_DISABLE
-       HANDLE       hDRVObject;
-       u32                  hProcess;
-       DSP_STATUS res_status = DSP_SOK;
-       struct PROCESS_CONTEXT   *pPctxt = NULL;
-#endif
-
        DBC_Require(cRefs > 0);
        DBC_Require(phProcessor != NULL);
 
        GT_3trace(PROC_DebugMask, GT_ENTER, "Entered PROC_Attach, args:\n\t"
                 "uProcessor:  0x%x\n\tpAttrIn:  0x%x\n\tphProcessor:"
                 "0x%x\n", uProcessor, pAttrIn, phProcessor);
+
        /* Get the Driver and Manager Object Handles */
        status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
        if (DSP_SUCCEEDED(status)) {
@@ -308,9 +289,10 @@ PROC_Attach(u32 uProcessor, OPTIONAL CONST struct 
DSP_PROCESSORATTRIN *pAttrIn,
        pProcObject->hDevObject = hDevObject;
        pProcObject->hMgrObject = hMgrObject;
        pProcObject->uProcessor = devType;
-       /* Get Caller Process and store it */
-       /* Return TGID instead of process handle */
-       pProcObject->hProcess = current->tgid;
+       /* Store TGID instead of process handle */
+       pProcObject->hProcess = current->tgid;
+
+       INIT_LIST_HEAD(&pProcObject->proc_object);
 
        if (pAttrIn)
                pProcObject->uTimeout = pAttrIn->uTimeout;
@@ -381,41 +363,12 @@ PROC_Attach(u32 uProcessor, OPTIONAL CONST struct 
DSP_PROCESSORATTRIN *pAttrIn,
                         "storage for notification \n");
                MEM_FreeObject(pProcObject);
        }
-func_end:
 #ifndef RES_CLEANUP_DISABLE
-       if (DSP_FAILED(status))
-               goto func_cont;
-
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       res_status = CFG_GetObject((u32 *)&hDRVObject, REG_DRV_OBJECT);
-       if (DSP_FAILED(res_status))
-               goto func_cont;
-
-       DRV_GetProcContext(hProcess, (struct DRV_OBJECT *)hDRVObject,
-                        &pPctxt, NULL, 0);
-       if (pPctxt == NULL) {
-               DRV_InsertProcContext((struct DRV_OBJECT *)hDRVObject, &pPctxt);
-               if (pPctxt != NULL) {
-                       DRV_ProcUpdatestate(pPctxt, PROC_RES_ALLOCATED);
-                       DRV_ProcSetPID(pPctxt, hProcess);
-               }
-       }
-func_cont:
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       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)
-                       pPctxt->hProcessor = (DSP_HPROCESSOR)*phProcessor;
-
-       }
+       spin_lock(&pr_ctxt->proc_list_lock);
+       list_add(&pProcObject->proc_object, &pr_ctxt->processor_list);
+       spin_unlock(&pr_ctxt->proc_list_lock);
 #endif
+func_end:
        DBC_Ensure((status == DSP_EFAIL && *phProcessor == NULL) ||
                  (DSP_SUCCEEDED(status) &&
                  MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) ||
@@ -641,27 +594,17 @@ DSP_STATUS PROC_Detach(DSP_HPROCESSOR hProcessor,
 {
        DSP_STATUS status = DSP_SOK;
        struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProcessor;
-#ifndef RES_CLEANUP_DISABLE
-       HANDLE hDRVObject;
-       u32 hProcess;
-       DSP_STATUS res_status = DSP_SOK;
-       struct PROCESS_CONTEXT   *pPctxt = NULL;
-#endif
+
        DBC_Require(cRefs > 0);
        GT_1trace(PROC_DebugMask, GT_ENTER, "Entered PROC_Detach, args:\n\t"
                 "hProcessor:  0x%x\n", hProcessor);
 
        if (MEM_IsValidHandle(pProcObject, PROC_SIGNATURE)) {
 #ifndef RES_CLEANUP_DISABLE
-               /* Return TGID instead of process handle */
-               hProcess = pProcObject->hProcess;
-               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)
-                               pPctxt->hProcessor = NULL;
+               if (pr_ctxt) {
+                       spin_lock(&pr_ctxt->proc_list_lock);
+                       list_del(&pProcObject->proc_object);
+                       spin_unlock(&pr_ctxt->proc_list_lock);
                }
 #endif
                /* Notify the Client */
@@ -1429,11 +1372,7 @@ DSP_STATUS PROC_Map(DSP_HPROCESSOR hProcessor, void 
*pMpuAddr, u32 ulSize,
        struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProcessor;
 
 #ifndef RES_CLEANUP_DISABLE
-       u32               hProcess;
-       HANDLE        pCtxt = NULL;
-       HANDLE        hDrvObject;
        HANDLE        dmmRes;
-       DSP_STATUS res_status = DSP_SOK;
 #endif
 
        GT_6trace(PROC_DebugMask, GT_ENTER, "Entered PROC_Map, args:\n\t"
@@ -1483,22 +1422,9 @@ DSP_STATUS PROC_Map(DSP_HPROCESSOR hProcessor, void 
*pMpuAddr, u32 ulSize,
 
 #ifndef RES_CLEANUP_DISABLE
        if (DSP_SUCCEEDED(status)) {
-               /* Update the node and stream resource status */
-               /* Return TGID instead of process handle */
-               hProcess = current->tgid;
-
-               res_status = CFG_GetObject((u32 *)&hDrvObject,
-                                         REG_DRV_OBJECT);
-               if (DSP_SUCCEEDED(res_status)) {
-                       if (DRV_GetProcContext(hProcess,
-                               (struct DRV_OBJECT *)hDrvObject, &pCtxt, NULL,
-                                       (u32)pMpuAddr) != DSP_ENOTFOUND) {
-                               DRV_InsertDMMResElement(&dmmRes, pCtxt);
-                               DRV_UpdateDMMResElement(dmmRes, (u32)pMpuAddr,
-                                               ulSize, (u32)pReqAddr,
-                                               (u32)*ppMapAddr, hProcessor);
-                       }
-               }
+               DRV_InsertDMMResElement(&dmmRes, pr_ctxt);
+               DRV_UpdateDMMResElement(dmmRes, (u32)pMpuAddr, ulSize,
+                               (u32)pReqAddr, (u32)*ppMapAddr, hProcessor);
        }
 #endif
 func_end:
@@ -1821,11 +1747,7 @@ DSP_STATUS PROC_UnMap(DSP_HPROCESSOR hProcessor, void 
*pMapAddr,
        u32 vaAlign;
        u32 sizeAlign;
 #ifndef RES_CLEANUP_DISABLE
-       u32                   hProcess;
-       HANDLE        pCtxt = NULL;
-       HANDLE        hDrvObject;
        HANDLE        dmmRes;
-       DSP_STATUS res_status = DSP_SOK;
 #endif
        GT_2trace(PROC_DebugMask, GT_ENTER,
                 "Entered PROC_UnMap, args:\n\thProcessor:"
@@ -1866,23 +1788,11 @@ DSP_STATUS PROC_UnMap(DSP_HPROCESSOR hProcessor, void 
*pMapAddr,
        if (DSP_FAILED(status))
                goto func_end;
 
-       /* Update the node and stream resource status */
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
-       if (DSP_FAILED(res_status))
-               goto func_end;
-
-       DRV_GetProcContext(hProcess, (struct DRV_OBJECT *)hDrvObject,
-                        &pCtxt, NULL, (u32)pMapAddr);
-       if (pCtxt != NULL) {
-               if (DRV_GetDMMResElement((u32)pMapAddr, &dmmRes, pCtxt) !=
-                  DSP_ENOTFOUND)
-                       DRV_RemoveDMMResElement(dmmRes, pCtxt);
-       }
-func_end:
+       if (pr_ctxt && DRV_GetDMMResElement((u32)pMapAddr, &dmmRes, pr_ctxt)
+                                                       != DSP_ENOTFOUND)
+               DRV_RemoveDMMResElement(dmmRes, pr_ctxt);
 #endif
+func_end:
        GT_1trace(PROC_DebugMask, GT_ENTER,
                 "Leaving PROC_UnMap [0x%x]", status);
        return status;
diff --git a/drivers/dsp/bridge/rmgr/strm.c b/drivers/dsp/bridge/rmgr/strm.c
index d0bbf6a..7413dc6 100644
--- a/drivers/dsp/bridge/rmgr/strm.c
+++ b/drivers/dsp/bridge/rmgr/strm.c
@@ -159,13 +159,9 @@ DSP_STATUS STRM_AllocateBuffer(struct STRM_OBJECT *hStrm, 
u32 uSize,
        DSP_STATUS status = DSP_SOK;
        u32 uAllocated = 0;
        u32 i;
-       #ifndef RES_CLEANUP_DISABLE
-       DSP_STATUS res_status = DSP_SOK;
-       u32                  hProcess;
-       HANDLE       pCtxt = NULL;
-       HANDLE       hDrvObject;
+#ifndef RES_CLEANUP_DISABLE
        HANDLE hSTRMRes;
-       #endif
+#endif
        DBC_Require(cRefs > 0);
        DBC_Require(apBuffer != NULL);
 
@@ -203,21 +199,9 @@ DSP_STATUS STRM_AllocateBuffer(struct STRM_OBJECT *hStrm, 
u32 uSize,
        if (DSP_FAILED(status))
                goto func_end;
 
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
-       if (DSP_FAILED(res_status))
-               goto func_end;
-
-       DRV_GetProcContext(hProcess, (struct DRV_OBJECT *)hDrvObject,
-                        &pCtxt, NULL, 0);
-       if (pCtxt != NULL) {
-               if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pCtxt) !=
-                  DSP_ENOTFOUND) {
-                       DRV_ProcUpdateSTRMRes(uNumBufs, hSTRMRes, pCtxt);
-               }
-       }
+       if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pr_ctxt) !=
+                       DSP_ENOTFOUND)
+               DRV_ProcUpdateSTRMRes(uNumBufs, hSTRMRes, pr_ctxt);
 #endif
 func_end:
        return status;
@@ -235,16 +219,10 @@ DSP_STATUS STRM_Close(struct STRM_OBJECT *hStrm,
        struct CHNL_INFO chnlInfo;
        DSP_STATUS status = DSP_SOK;
 
-
 #ifndef RES_CLEANUP_DISABLE
-    u32                      hProcess;
-    HANDLE           pCtxt = NULL;
-    HANDLE           hDrvObject;
     HANDLE           hSTRMRes;
-    DSP_STATUS   res_status = DSP_SOK;
 #endif
 
-
        DBC_Require(cRefs > 0);
 
        GT_1trace(STRM_debugMask, GT_ENTER, "STRM_Close: hStrm: 0x%x\n", hStrm);
@@ -277,22 +255,9 @@ DSP_STATUS STRM_Close(struct STRM_OBJECT *hStrm,
        if (DSP_FAILED(status))
                goto func_end;
 
-       /* Update the node and stream resource status */
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
-       if (DSP_FAILED(res_status))
-               goto func_end;
-
-       DRV_GetProcContext(hProcess, (struct DRV_OBJECT *)hDrvObject,
-                        &pCtxt, NULL, 0);
-       if (pCtxt != NULL) {
-               if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pCtxt) !=
-                  DSP_ENOTFOUND) {
-                       DRV_ProcRemoveSTRMResElement(hSTRMRes, pCtxt);
-               }
-       }
+       if (DRV_GetSTRMResElement(hStrm, &hSTRMRes, pr_ctxt) !=
+                       DSP_ENOTFOUND)
+               DRV_ProcRemoveSTRMResElement(hSTRMRes, pr_ctxt);
 func_end:
 #endif
        DBC_Ensure(status == DSP_SOK || status == DSP_EHANDLE ||
@@ -400,13 +365,9 @@ DSP_STATUS STRM_FreeBuffer(struct STRM_OBJECT *hStrm, u8 
**apBuffer,
        DSP_STATUS status = DSP_SOK;
        u32 i = 0;
 
-       #ifndef RES_CLEANUP_DISABLE
-       DSP_STATUS res_status = DSP_SOK;
-       u32                  hProcess;
-       HANDLE       pCtxt = NULL;
-       HANDLE       hDrvObject;
-       HANDLE              hSTRMRes = NULL;
-       #endif
+#ifndef RES_CLEANUP_DISABLE
+       HANDLE hSTRMRes = NULL;
+#endif
        DBC_Require(cRefs > 0);
        DBC_Require(apBuffer != NULL);
 
@@ -430,23 +391,9 @@ DSP_STATUS STRM_FreeBuffer(struct STRM_OBJECT *hStrm, u8 
**apBuffer,
                }
        }
 #ifndef RES_CLEANUP_DISABLE
-       /* Update the node and stream resource status */
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
-       if (DSP_SUCCEEDED(res_status)) {
-               DRV_GetProcContext(hProcess,
-                                (struct DRV_OBJECT *)hDrvObject, &pCtxt,
-                                NULL, 0);
-               if (pCtxt != NULL) {
-                       if (DRV_GetSTRMResElement(hStrm, hSTRMRes, pCtxt) !=
-                          DSP_ENOTFOUND) {
-                               DRV_ProcUpdateSTRMRes(uNumBufs-i, hSTRMRes,
-                                                    pCtxt);
-                       }
-               }
-       }
+       if (DRV_GetSTRMResElement(hStrm, hSTRMRes, pr_ctxt) !=
+                       DSP_ENOTFOUND)
+               DRV_ProcUpdateSTRMRes(uNumBufs-i, hSTRMRes, pr_ctxt);
 #endif
        return status;
 }
@@ -640,13 +587,9 @@ DSP_STATUS STRM_Open(struct NODE_OBJECT *hNode, u32 uDir, 
u32 uIndex,
        DSP_STATUS status = DSP_SOK;
        struct CMM_OBJECT *hCmmMgr = NULL;      /* Shared memory manager hndl */
 
-       #ifndef RES_CLEANUP_DISABLE
-       DSP_STATUS res_status = DSP_SOK;
-       u32                  hProcess;
-       HANDLE       pCtxt = NULL;
-       HANDLE       hDrvObject;
-       HANDLE              hSTRMRes;
-       #endif
+#ifndef RES_CLEANUP_DISABLE
+       HANDLE hSTRMRes;
+#endif
        DBC_Require(cRefs > 0);
        DBC_Require(phStrm != NULL);
        DBC_Require(pAttr != NULL);
@@ -782,18 +725,7 @@ func_cont:
                (void)DeleteStrm(pStrm);
 
 #ifndef RES_CLEANUP_DISABLE
-       /* Return TGID instead of process handle */
-       hProcess = current->tgid;
-
-       res_status = CFG_GetObject((u32 *)&hDrvObject, REG_DRV_OBJECT);
-       if (DSP_SUCCEEDED(res_status)) {
-               DRV_GetProcContext(hProcess,
-                                (struct DRV_OBJECT *)hDrvObject, &pCtxt,
-                                hNode, 0);
-               if (pCtxt != NULL)
-                       DRV_ProcInsertSTRMResElement(*phStrm, &hSTRMRes, pCtxt);
-
-       }
+       DRV_ProcInsertSTRMResElement(*phStrm, &hSTRMRes, pr_ctxt);
 #endif
 
         /* ensure we return a documented error code */
-- 
1.6.2.4

--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to