* [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
@ 2010-02-10 8:32 Guzman Lugo, Fernando
2010-02-16 23:56 ` Omar Ramirez Luna
2010-02-17 10:55 ` Ameya Palande
0 siblings, 2 replies; 4+ messages in thread
From: Guzman Lugo, Fernando @ 2010-02-10 8:32 UTC (permalink / raw)
To: linux-omap@vger.kernel.org
Cc: Ameya Palande, Hiroshi Doyu, felipe.contreras@nokia.com
Please discard previous one.
Regards,
Fernando.
>From 6bcdc02f6265246e385194433775e75db7ad44cf Mon Sep 17 00:00:00 2001
From: Fernando Guzman Lugo <x0095840@ti.com>
Date: Wed, 10 Feb 2010 02:31:40 -0600
Subject: [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
This patch protects the Resorce cleanup lists from
concurrent access
Signed-off-by: Fernando Guzman Lugo <x0095840@ti.com>
---
arch/arm/plat-omap/include/dspbridge/drv.h | 3 +
drivers/dsp/bridge/pmgr/wcd.c | 16 ++++++-
drivers/dsp/bridge/rmgr/drv.c | 71 +++++++++++++++++++++++----
drivers/dsp/bridge/rmgr/drv_interface.c | 8 ++-
4 files changed, 83 insertions(+), 15 deletions(-)
diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h b/arch/arm/plat-omap/include/dspbridge/drv.h
index b6a5fd2..b044291 100644
--- a/arch/arm/plat-omap/include/dspbridge/drv.h
+++ b/arch/arm/plat-omap/include/dspbridge/drv.h
@@ -137,15 +137,18 @@ struct PROCESS_CONTEXT{
/* DSP Node resources */
struct NODE_RES_OBJECT *pNodeList;
+ struct mutex node_mutex;
/* DMM resources */
struct DMM_RES_OBJECT *pDMMList;
+ struct mutex dmm_mutex;
/* DSP Heap resources */
struct DSPHEAP_RES_OBJECT *pDSPHEAPList;
/* Stream resources */
struct STRM_RES_OBJECT *pSTRMList;
+ struct mutex strm_mutex;
} ;
diff --git a/drivers/dsp/bridge/pmgr/wcd.c b/drivers/dsp/bridge/pmgr/wcd.c
index b086c0f..bd2bfa3 100644
--- a/drivers/dsp/bridge/pmgr/wcd.c
+++ b/drivers/dsp/bridge/pmgr/wcd.c
@@ -1121,17 +1121,23 @@ bool validate_node_handle(struct NODE_OBJECT *hNode, void *pr_ctxt)
{
bool retVal = false;
struct PROCESS_CONTEXT *pCtxt = pr_ctxt;
- struct NODE_RES_OBJECT *pNode = pCtxt->pNodeList;
+ struct NODE_RES_OBJECT *pNode;
if (hNode == (struct NODE_OBJECT *) DSP_HGPPNODE)
retVal = true;
+ if (mutex_lock_interruptible(&pCtxt->node_mutex))
+ return DSP_EFAIL;
+
+ pNode = pCtxt->pNodeList;
while (pNode && !retVal) {
if (hNode == pNode->hNode)
retVal = true;
pNode = pNode->next;
}
+ mutex_unlock(&pCtxt->node_mutex);
+
return retVal;
}
@@ -1570,14 +1576,20 @@ bool validate_strm_handle(struct STRM_OBJECT *hStrm, void *pr_ctxt)
{
bool retVal = false;
struct PROCESS_CONTEXT *pCtxt = pr_ctxt;
- struct STRM_RES_OBJECT *pStrm = pCtxt->pSTRMList;
+ struct STRM_RES_OBJECT *pStrm;
+ if (mutex_lock_interruptible(&pCtxt->strm_mutex))
+ return DSP_EFAIL;
+
+ pStrm = pCtxt->pSTRMList;
while (pStrm && !retVal) {
if (hStrm == pStrm->hStream)
retVal = true;
pStrm = pStrm->next;
}
+ mutex_unlock(&pCtxt->strm_mutex);
+
return retVal;
}
diff --git a/drivers/dsp/bridge/rmgr/drv.c b/drivers/dsp/bridge/rmgr/drv.c
index 36bab9f..e8b2c58 100644
--- a/drivers/dsp/bridge/rmgr/drv.c
+++ b/drivers/dsp/bridge/rmgr/drv.c
@@ -97,6 +97,10 @@ DSP_STATUS DRV_InsertNodeResElement(HANDLE hNode, HANDLE hNodeRes,
status = DSP_EHANDLE;
}
if (DSP_SUCCEEDED(status)) {
+ if (mutex_lock_interruptible(&pCtxt->node_mutex)) {
+ kfree(*pNodeRes);
+ return DSP_EFAIL;
+ }
(*pNodeRes)->hNode = hNode;
if (pCtxt->pNodeList != NULL) {
pTempNodeRes = pCtxt->pNodeList;
@@ -111,6 +115,7 @@ DSP_STATUS DRV_InsertNodeResElement(HANDLE hNode, HANDLE hNodeRes,
GT_0trace(curTrace, GT_ENTER,
"DRV_InsertNodeResElement: 3");
}
+ mutex_unlock(&pCtxt->node_mutex);
}
GT_0trace(curTrace, GT_ENTER, "DRV_InsertNodeResElement: 4");
return status;
@@ -123,7 +128,10 @@ DSP_STATUS DRV_RemoveNodeResElement(HANDLE hNodeRes, HANDLE hPCtxt)
struct NODE_RES_OBJECT *pNodeRes = (struct NODE_RES_OBJECT *)hNodeRes;
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
struct NODE_RES_OBJECT *pTempNode;
+ DSP_STATUS status = DSP_SOK;
+ if (mutex_lock_interruptible(&pCtxt->node_mutex))
+ return DSP_EFAIL;
pTempNode = pCtxt->pNodeList;
if (pTempNode == pNodeRes) {
pCtxt->pNodeList = pNodeRes->next;
@@ -131,11 +139,13 @@ DSP_STATUS DRV_RemoveNodeResElement(HANDLE hNodeRes, HANDLE hPCtxt)
while (pTempNode && pTempNode->next != pNodeRes)
pTempNode = pTempNode->next;
if (!pTempNode)
- return DSP_ENOTFOUND;
- pTempNode->next = pNodeRes->next;
+ status = DSP_ENOTFOUND;
+ else
+ pTempNode->next = pNodeRes->next;
}
+ mutex_unlock(&pCtxt->node_mutex);
kfree(pNodeRes);
- return DSP_SOK;
+ return status;
}
/* Actual Node De-Allocation */
@@ -200,6 +210,11 @@ DSP_STATUS DRV_InsertDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
status = DSP_EHANDLE;
}
if (DSP_SUCCEEDED(status)) {
+ if (mutex_lock_interruptible(&pCtxt->dmm_mutex)) {
+ kfree(*pDMMRes);
+ return DSP_EFAIL;
+ }
+
if (pCtxt->pDMMList != NULL) {
GT_0trace(curTrace, GT_5CLASS,
"DRV_InsertDMMResElement: 3");
@@ -213,6 +228,7 @@ DSP_STATUS DRV_InsertDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
GT_0trace(curTrace, GT_5CLASS,
"DRV_InsertDMMResElement: 4");
}
+ mutex_unlock(&pCtxt->dmm_mutex);
}
GT_0trace(curTrace, GT_ENTER, "DRV_InsertDMMResElement: 5");
return status;
@@ -225,7 +241,10 @@ DSP_STATUS DRV_RemoveDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
struct DMM_RES_OBJECT *pDMMRes = (struct DMM_RES_OBJECT *)hDMMRes;
struct DMM_RES_OBJECT *pTempDMMRes = NULL;
+ DSP_STATUS status = DSP_SOK;
+ if (mutex_lock_interruptible(&pCtxt->dmm_mutex))
+ return DSP_EFAIL;
pTempDMMRes = pCtxt->pDMMList;
if (pCtxt->pDMMList == pDMMRes) {
pCtxt->pDMMList = pDMMRes->next;
@@ -233,11 +252,13 @@ DSP_STATUS DRV_RemoveDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
while (pTempDMMRes && pTempDMMRes->next != pDMMRes)
pTempDMMRes = pTempDMMRes->next;
if (!pTempDMMRes)
- return DSP_ENOTFOUND;
- pTempDMMRes->next = pDMMRes->next;
+ status = DSP_ENOTFOUND;
+ else
+ pTempDMMRes->next = pDMMRes->next;
}
+ mutex_unlock(&pCtxt->dmm_mutex);
kfree(pDMMRes);
- return DSP_SOK;
+ return status;
}
/* Update DMM resource status */
@@ -315,6 +336,9 @@ DSP_STATUS DRV_GetDMMResElement(u32 pMapAddr, HANDLE hDMMRes, HANDLE hPCtxt)
DSP_STATUS status = DSP_SOK;
struct DMM_RES_OBJECT *pTempDMM = NULL;
+ if (mutex_lock_interruptible(&pCtxt->dmm_mutex))
+ return DSP_EFAIL;
+
pTempDMM = pCtxt->pDMMList;
while ((pTempDMM != NULL) && (pTempDMM->ulDSPAddr != pMapAddr)) {
GT_3trace(curTrace, GT_ENTER,
@@ -323,6 +347,9 @@ DSP_STATUS DRV_GetDMMResElement(u32 pMapAddr, HANDLE hDMMRes, HANDLE hPCtxt)
pTempDMM->ulDSPAddr, pMapAddr);
pTempDMM = pTempDMM->next;
}
+
+ mutex_unlock(&pCtxt->dmm_mutex);
+
if (pTempDMM != NULL) {
GT_0trace(curTrace, GT_ENTER, "DRV_GetDMMResElement: 3");
*pDMMRes = pTempDMM;
@@ -378,12 +405,18 @@ DSP_STATUS DRV_GetNodeResElement(HANDLE hNode, HANDLE hNodeRes, HANDLE hPCtxt)
struct NODE_RES_OBJECT *pTempNode2 = NULL;
struct NODE_RES_OBJECT *pTempNode = NULL;
+ if (mutex_lock_interruptible(&pCtxt->node_mutex))
+ return DSP_EFAIL;
+
pTempNode = pCtxt->pNodeList;
GT_0trace(curTrace, GT_ENTER, "DRV_GetNodeResElement: 1");
while ((pTempNode != NULL) && (pTempNode->hNode != hNode)) {
pTempNode2 = pTempNode;
pTempNode = pTempNode->next;
}
+
+ mutex_unlock(&pCtxt->node_mutex);
+
if (pTempNode != NULL)
*nodeRes = pTempNode;
else
@@ -410,6 +443,10 @@ DSP_STATUS DRV_ProcInsertSTRMResElement(HANDLE hStreamHandle, HANDLE hSTRMRes,
status = DSP_EHANDLE;
}
if (DSP_SUCCEEDED(status)) {
+ if (mutex_lock_interruptible(&pCtxt->strm_mutex)) {
+ kfree(*pSTRMRes);
+ return DSP_EFAIL;
+ }
(*pSTRMRes)->hStream = hStreamHandle;
if (pCtxt->pSTRMList != NULL) {
GT_0trace(curTrace, GT_ENTER,
@@ -424,6 +461,7 @@ DSP_STATUS DRV_ProcInsertSTRMResElement(HANDLE hStreamHandle, HANDLE hSTRMRes,
GT_0trace(curTrace, GT_ENTER,
"DRV_InsertSTRMResElement: 4");
}
+ mutex_unlock(&pCtxt->strm_mutex);
}
return status;
}
@@ -436,7 +474,10 @@ DSP_STATUS DRV_ProcRemoveSTRMResElement(HANDLE hSTRMRes, HANDLE hPCtxt)
struct STRM_RES_OBJECT *pSTRMRes = (struct STRM_RES_OBJECT *)hSTRMRes;
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
struct STRM_RES_OBJECT *pTempSTRMRes;
+ DSP_STATUS status = DSP_SOK;
+ if (mutex_lock_interruptible(&pCtxt->strm_mutex))
+ return DSP_EFAIL;
pTempSTRMRes = pCtxt->pSTRMList;
if (pCtxt->pSTRMList == pSTRMRes) {
@@ -445,12 +486,13 @@ DSP_STATUS DRV_ProcRemoveSTRMResElement(HANDLE hSTRMRes, HANDLE hPCtxt)
while (pTempSTRMRes && pTempSTRMRes->next != pSTRMRes)
pTempSTRMRes = pTempSTRMRes->next;
if (pTempSTRMRes == NULL)
- return DSP_ENOTFOUND;
- pTempSTRMRes->next = pSTRMRes->next;
+ status = DSP_ENOTFOUND;
+ else
+ pTempSTRMRes->next = pSTRMRes->next;
}
-
+ mutex_unlock(&pCtxt->strm_mutex);
kfree(pSTRMRes);
- return DSP_SOK;
+ return status;
}
/* Actual Stream De-Allocation */
@@ -522,13 +564,20 @@ DSP_STATUS DRV_GetSTRMResElement(HANDLE hStrm, HANDLE hSTRMRes, HANDLE hPCtxt)
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
DSP_STATUS status = DSP_SOK;
struct STRM_RES_OBJECT *pTempSTRM2 = NULL;
- struct STRM_RES_OBJECT *pTempSTRM = pCtxt->pSTRMList;
+ struct STRM_RES_OBJECT *pTempSTRM;
+
+ if (mutex_lock_interruptible(&pCtxt->strm_mutex))
+ return DSP_EFAIL;
+ pTempSTRM = pCtxt->pSTRMList;
while ((pTempSTRM != NULL) && (pTempSTRM->hStream != hStrm)) {
GT_0trace(curTrace, GT_ENTER, "DRV_GetSTRMResElement: 2");
pTempSTRM2 = pTempSTRM;
pTempSTRM = pTempSTRM->next;
}
+
+ mutex_unlock(&pCtxt->strm_mutex);
+
if (pTempSTRM != NULL) {
GT_0trace(curTrace, GT_ENTER, "DRV_GetSTRMResElement: 3");
*STRMRes = pTempSTRM;
diff --git a/drivers/dsp/bridge/rmgr/drv_interface.c b/drivers/dsp/bridge/rmgr/drv_interface.c
index 1676c78..3fd3665 100644
--- a/drivers/dsp/bridge/rmgr/drv_interface.c
+++ b/drivers/dsp/bridge/rmgr/drv_interface.c
@@ -492,10 +492,14 @@ static int bridge_open(struct inode *ip, struct file *filp)
* process context list.
*/
pr_ctxt = MEM_Calloc(sizeof(struct PROCESS_CONTEXT), MEM_PAGED);
- if (pr_ctxt)
+ if (pr_ctxt) {
pr_ctxt->resState = PROC_RES_ALLOCATED;
- else
+ mutex_init(&pr_ctxt->dmm_mutex);
+ mutex_init(&pr_ctxt->node_mutex);
+ mutex_init(&pr_ctxt->strm_mutex);
+ } else {
status = -ENOMEM;
+ }
filp->private_data = pr_ctxt;
--
1.6.0.4
^ permalink raw reply related [flat|nested] 4+ messages in thread* Re: [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
2010-02-10 8:32 [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists Guzman Lugo, Fernando
@ 2010-02-16 23:56 ` Omar Ramirez Luna
2010-02-17 10:55 ` Ameya Palande
1 sibling, 0 replies; 4+ messages in thread
From: Omar Ramirez Luna @ 2010-02-16 23:56 UTC (permalink / raw)
To: Guzman Lugo, Fernando
Cc: linux-omap@vger.kernel.org, Ameya Palande, Hiroshi Doyu,
felipe.contreras@nokia.com
On 2/10/2010 2:32 AM, Guzman Lugo, Fernando wrote:
>
> Please discard previous one.
>
> Regards,
> Fernando.
>
> From 6bcdc02f6265246e385194433775e75db7ad44cf Mon Sep 17 00:00:00 2001
> From: Fernando Guzman Lugo<x0095840@ti.com>
> Date: Wed, 10 Feb 2010 02:31:40 -0600
> Subject: [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
>
> This patch protects the Resorce cleanup lists from
> concurrent access
>
> Signed-off-by: Fernando Guzman Lugo<x0095840@ti.com>
Removed wcd.c changes as functions affected doesn't exist.
Acked-by: Omar Ramirez Luna <omar.ramirez@ti.com>
Pushed to dspbridge
- omar
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
2010-02-10 8:32 [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists Guzman Lugo, Fernando
2010-02-16 23:56 ` Omar Ramirez Luna
@ 2010-02-17 10:55 ` Ameya Palande
2010-02-18 1:56 ` Guzman Lugo, Fernando
1 sibling, 1 reply; 4+ messages in thread
From: Ameya Palande @ 2010-02-17 10:55 UTC (permalink / raw)
To: ext Guzman Lugo, Fernando
Cc: linux-omap@vger.kernel.org, Doyu Hiroshi (Nokia-D/Helsinki),
Contreras Felipe (Nokia-D/Helsinki)
Hi Fernando,
On Wed, 2010-02-10 at 09:32 +0100, ext Guzman Lugo, Fernando wrote:
> Please discard previous one.
>
> Regards,
> Fernando.
>
> From 6bcdc02f6265246e385194433775e75db7ad44cf Mon Sep 17 00:00:00 2001
> From: Fernando Guzman Lugo <x0095840@ti.com>
> Date: Wed, 10 Feb 2010 02:31:40 -0600
> Subject: [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
>
> This patch protects the Resorce cleanup lists from
> concurrent access
>
> Signed-off-by: Fernando Guzman Lugo <x0095840@ti.com>
> ---
> arch/arm/plat-omap/include/dspbridge/drv.h | 3 +
> drivers/dsp/bridge/pmgr/wcd.c | 16 ++++++-
> drivers/dsp/bridge/rmgr/drv.c | 71 +++++++++++++++++++++++----
> drivers/dsp/bridge/rmgr/drv_interface.c | 8 ++-
> 4 files changed, 83 insertions(+), 15 deletions(-)
>
> diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h b/arch/arm/plat-omap/include/dspbridge/drv.h
> index b6a5fd2..b044291 100644
> --- a/arch/arm/plat-omap/include/dspbridge/drv.h
> +++ b/arch/arm/plat-omap/include/dspbridge/drv.h
> @@ -137,15 +137,18 @@ struct PROCESS_CONTEXT{
>
> /* DSP Node resources */
> struct NODE_RES_OBJECT *pNodeList;
> + struct mutex node_mutex;
>
> /* DMM resources */
> struct DMM_RES_OBJECT *pDMMList;
> + struct mutex dmm_mutex;
>
> /* DSP Heap resources */
> struct DSPHEAP_RES_OBJECT *pDSPHEAPList;
>
> /* Stream resources */
> struct STRM_RES_OBJECT *pSTRMList;
> + struct mutex strm_mutex;
> } ;
Is there a specific reason for using mutex instead of spin_lock?
AFAIU these locks are help for very short time, for inserting / removing
elements from linked list, or traversing a linked list.
Cheers,
Ameya.
^ permalink raw reply [flat|nested] 4+ messages in thread* RE: [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists
2010-02-17 10:55 ` Ameya Palande
@ 2010-02-18 1:56 ` Guzman Lugo, Fernando
0 siblings, 0 replies; 4+ messages in thread
From: Guzman Lugo, Fernando @ 2010-02-18 1:56 UTC (permalink / raw)
To: Ameya Palande
Cc: linux-omap@vger.kernel.org, Doyu Hiroshi (Nokia-D/Helsinki),
Contreras Felipe (Nokia-D/Helsinki)
Hi,
>-----Original Message-----
>From: Ameya Palande [mailto:ameya.palande@Nokia.com]
>Sent: Wednesday, February 17, 2010 4:55 AM
>To: Guzman Lugo, Fernando
>Cc: linux-omap@vger.kernel.org; Doyu Hiroshi (Nokia-D/Helsinki); Contreras
>Felipe (Nokia-D/Helsinki)
>Subject: Re: [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup
>linked lists
>
>Hi Fernando,
>
>On Wed, 2010-02-10 at 09:32 +0100, ext Guzman Lugo, Fernando wrote:
>> Please discard previous one.
>>
>> Regards,
>> Fernando.
>>
>> From 6bcdc02f6265246e385194433775e75db7ad44cf Mon Sep 17 00:00:00 2001
>> From: Fernando Guzman Lugo <x0095840@ti.com>
>> Date: Wed, 10 Feb 2010 02:31:40 -0600
>> Subject: [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked
>lists
>>
>> This patch protects the Resorce cleanup lists from
>> concurrent access
>>
>> Signed-off-by: Fernando Guzman Lugo <x0095840@ti.com>
>> ---
>> arch/arm/plat-omap/include/dspbridge/drv.h | 3 +
>> drivers/dsp/bridge/pmgr/wcd.c | 16 ++++++-
>> drivers/dsp/bridge/rmgr/drv.c | 71
>+++++++++++++++++++++++----
>> drivers/dsp/bridge/rmgr/drv_interface.c | 8 ++-
>> 4 files changed, 83 insertions(+), 15 deletions(-)
>>
>> diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h b/arch/arm/plat-
>omap/include/dspbridge/drv.h
>> index b6a5fd2..b044291 100644
>> --- a/arch/arm/plat-omap/include/dspbridge/drv.h
>> +++ b/arch/arm/plat-omap/include/dspbridge/drv.h
>> @@ -137,15 +137,18 @@ struct PROCESS_CONTEXT{
>>
>> /* DSP Node resources */
>> struct NODE_RES_OBJECT *pNodeList;
>> + struct mutex node_mutex;
>>
>> /* DMM resources */
>> struct DMM_RES_OBJECT *pDMMList;
>> + struct mutex dmm_mutex;
>>
>> /* DSP Heap resources */
>> struct DSPHEAP_RES_OBJECT *pDSPHEAPList;
>>
>> /* Stream resources */
>> struct STRM_RES_OBJECT *pSTRMList;
>> + struct mutex strm_mutex;
>> } ;
>
>Is there a specific reason for using mutex instead of spin_lock?
>
>AFAIU these locks are help for very short time, for inserting / removing
>elements from linked list, or traversing a linked list.
Yes, changing mutex to spinlocks would help in performance. Let me send a patch to change them.
Regards,
Fernando.
>
>Cheers,
>Ameya.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2010-02-18 1:56 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-10 8:32 [RESEND] [PATCH] DSPBRIDGE: Adding protection Resource cleanup linked lists Guzman Lugo, Fernando
2010-02-16 23:56 ` Omar Ramirez Luna
2010-02-17 10:55 ` Ameya Palande
2010-02-18 1:56 ` Guzman Lugo, Fernando
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox