* [PATCHv3 0/2] DSPBRIDGE: Improved reserved memory cleanup
@ 2010-02-17 14:18 Ameya Palande
2010-02-17 14:18 ` [PATCHv3 1/2] DSPBRIDGE: Rename DMM_RES_OBJECT to DMM_MAP_OBJECT Ameya Palande
2010-02-17 14:18 ` [PATCHv3 2/2] DSPBRIDGE: New reserved memory accounting framework Ameya Palande
0 siblings, 2 replies; 3+ messages in thread
From: Ameya Palande @ 2010-02-17 14:18 UTC (permalink / raw)
To: linux-omap; +Cc: felipe.contreras, x0095840, nm, deepak.chitriki
This patch series splits DMM_RES_OBJECT into DMM_MAP_OBJECT and DMM_RSV_OBJECT
which are used independently for mapped and reserved memory resources
accounting. This will help in cleanup of reserved memory resources which was
not handled properly before. With these patches resource cleanup mechanism
will work perfectly in a use case where a big chunk of memory is reserved and
then lot of mappings are created inside it.
Changes since v2:
1. Removed locking from DRV_RemoveAllDMMResElements()
2. Removed cleanup variable from PROC_UnReserveMemory()
http://marc.info/?l=linux-omap&m=126637211831587&w=2
3. Rebased patchset on top of following commit:
DSPBRIDGE: Remove conditional check from the InputMsg function
Changed since v1:
1. Reduced indentation
http://marc.info/?l=linux-omap&m=126624982331523&w=2
Ameya Palande (2):
DSPBRIDGE: Rename DMM_RES_OBJECT to DMM_MAP_OBJECT
DSPBRIDGE: New reserved memory accounting framework
arch/arm/plat-omap/include/dspbridge/drv.h | 24 +++++--
arch/arm/plat-omap/include/dspbridge/proc.h | 4 +-
drivers/dsp/bridge/pmgr/wcd.c | 7 +-
drivers/dsp/bridge/rmgr/drv.c | 87 ++++++++++++++-------------
drivers/dsp/bridge/rmgr/drv_interface.c | 4 +-
drivers/dsp/bridge/rmgr/node.c | 5 +-
drivers/dsp/bridge/rmgr/proc.c | 52 +++++++++++++----
7 files changed, 116 insertions(+), 67 deletions(-)
^ permalink raw reply [flat|nested] 3+ messages in thread
* [PATCHv3 1/2] DSPBRIDGE: Rename DMM_RES_OBJECT to DMM_MAP_OBJECT
2010-02-17 14:18 [PATCHv3 0/2] DSPBRIDGE: Improved reserved memory cleanup Ameya Palande
@ 2010-02-17 14:18 ` Ameya Palande
2010-02-17 14:18 ` [PATCHv3 2/2] DSPBRIDGE: New reserved memory accounting framework Ameya Palande
1 sibling, 0 replies; 3+ messages in thread
From: Ameya Palande @ 2010-02-17 14:18 UTC (permalink / raw)
To: linux-omap; +Cc: felipe.contreras, x0095840, nm, deepak.chitriki
In its current state DMM_RES_OBJECT is not correctly tracking reserve and
unreserve but only map and unmap. So lets rename it to DMM_MAP_OBJECT to
clarify what it is really doing!
In addition to this, this patch also does some trivial code cleanup.
Signed-off-by: Ameya Palande <ameya.palande@nokia.com>
Reviewed-by: Felipe Contreras <felipe.contreras@nokia.com>
---
arch/arm/plat-omap/include/dspbridge/drv.h | 14 +++---
drivers/dsp/bridge/rmgr/drv.c | 69 ++++++++++++++--------------
drivers/dsp/bridge/rmgr/drv_interface.c | 2 +-
3 files changed, 43 insertions(+), 42 deletions(-)
diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h b/arch/arm/plat-omap/include/dspbridge/drv.h
index b044291..d5f5277 100644
--- a/arch/arm/plat-omap/include/dspbridge/drv.h
+++ b/arch/arm/plat-omap/include/dspbridge/drv.h
@@ -90,15 +90,15 @@ struct NODE_RES_OBJECT {
struct NODE_RES_OBJECT *next;
} ;
-/* New structure (member of process context) abstracts DMM resource info */
-struct DMM_RES_OBJECT {
+/* Abstracts DMM resource info */
+struct DMM_MAP_OBJECT {
s32 dmmAllocated; /* DMM status */
u32 ulMpuAddr;
u32 ulDSPAddr;
u32 ulDSPResAddr;
- u32 dmmSize;
+ u32 size;
HANDLE hProcessor;
- struct DMM_RES_OBJECT *next;
+ struct DMM_MAP_OBJECT *next;
} ;
/* New structure (member of process context) abstracts DMM resource info */
@@ -139,9 +139,9 @@ struct PROCESS_CONTEXT{
struct NODE_RES_OBJECT *pNodeList;
struct mutex node_mutex;
- /* DMM resources */
- struct DMM_RES_OBJECT *pDMMList;
- struct mutex dmm_mutex;
+ /* DMM mapped memory resources */
+ struct DMM_MAP_OBJECT *dmm_map_list;
+ struct mutex dmm_map_mutex;
/* DSP Heap resources */
struct DSPHEAP_RES_OBJECT *pDSPHEAPList;
diff --git a/drivers/dsp/bridge/rmgr/drv.c b/drivers/dsp/bridge/rmgr/drv.c
index e8b2c58..9b513e2 100644
--- a/drivers/dsp/bridge/rmgr/drv.c
+++ b/drivers/dsp/bridge/rmgr/drv.c
@@ -198,37 +198,37 @@ static DSP_STATUS DRV_ProcFreeNodeRes(HANDLE hPCtxt)
DSP_STATUS DRV_InsertDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
{
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
- struct DMM_RES_OBJECT **pDMMRes = (struct DMM_RES_OBJECT **)hDMMRes;
+ struct DMM_MAP_OBJECT **pDMMRes = (struct DMM_MAP_OBJECT **)hDMMRes;
DSP_STATUS status = DSP_SOK;
- struct DMM_RES_OBJECT *pTempDMMRes = NULL;
+ struct DMM_MAP_OBJECT *pTempDMMRes = NULL;
- *pDMMRes = (struct DMM_RES_OBJECT *)
- MEM_Calloc(1 * sizeof(struct DMM_RES_OBJECT), MEM_PAGED);
+ *pDMMRes = (struct DMM_MAP_OBJECT *)
+ MEM_Calloc(1 * sizeof(struct DMM_MAP_OBJECT), MEM_PAGED);
GT_0trace(curTrace, GT_ENTER, "DRV_InsertDMMResElement: 1");
if (*pDMMRes == NULL) {
GT_0trace(curTrace, GT_5CLASS, "DRV_InsertDMMResElement: 2");
status = DSP_EHANDLE;
}
if (DSP_SUCCEEDED(status)) {
- if (mutex_lock_interruptible(&pCtxt->dmm_mutex)) {
+ if (mutex_lock_interruptible(&pCtxt->dmm_map_mutex)) {
kfree(*pDMMRes);
return DSP_EFAIL;
}
- if (pCtxt->pDMMList != NULL) {
+ if (pCtxt->dmm_map_list) {
GT_0trace(curTrace, GT_5CLASS,
"DRV_InsertDMMResElement: 3");
- pTempDMMRes = pCtxt->pDMMList;
- while (pTempDMMRes->next != NULL)
+ pTempDMMRes = pCtxt->dmm_map_list;
+ while (pTempDMMRes->next)
pTempDMMRes = pTempDMMRes->next;
pTempDMMRes->next = *pDMMRes;
} else {
- pCtxt->pDMMList = *pDMMRes;
+ pCtxt->dmm_map_list = *pDMMRes;
GT_0trace(curTrace, GT_5CLASS,
"DRV_InsertDMMResElement: 4");
}
- mutex_unlock(&pCtxt->dmm_mutex);
+ mutex_unlock(&pCtxt->dmm_map_mutex);
}
GT_0trace(curTrace, GT_ENTER, "DRV_InsertDMMResElement: 5");
return status;
@@ -239,15 +239,15 @@ DSP_STATUS DRV_InsertDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
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;
+ struct DMM_MAP_OBJECT *pDMMRes = (struct DMM_MAP_OBJECT *)hDMMRes;
+ struct DMM_MAP_OBJECT *pTempDMMRes = NULL;
DSP_STATUS status = DSP_SOK;
- if (mutex_lock_interruptible(&pCtxt->dmm_mutex))
+ if (mutex_lock_interruptible(&pCtxt->dmm_map_mutex))
return DSP_EFAIL;
- pTempDMMRes = pCtxt->pDMMList;
- if (pCtxt->pDMMList == pDMMRes) {
- pCtxt->pDMMList = pDMMRes->next;
+ pTempDMMRes = pCtxt->dmm_map_list;
+ if (pCtxt->dmm_map_list == pDMMRes) {
+ pCtxt->dmm_map_list = pDMMRes->next;
} else {
while (pTempDMMRes && pTempDMMRes->next != pDMMRes)
pTempDMMRes = pTempDMMRes->next;
@@ -256,7 +256,7 @@ DSP_STATUS DRV_RemoveDMMResElement(HANDLE hDMMRes, HANDLE hPCtxt)
else
pTempDMMRes->next = pDMMRes->next;
}
- mutex_unlock(&pCtxt->dmm_mutex);
+ mutex_unlock(&pCtxt->dmm_map_mutex);
kfree(pDMMRes);
return status;
}
@@ -266,14 +266,14 @@ DSP_STATUS DRV_UpdateDMMResElement(HANDLE hDMMRes, u32 pMpuAddr, u32 ulSize,
u32 pReqAddr, u32 pMapAddr,
HANDLE hProcessor)
{
- struct DMM_RES_OBJECT *pDMMRes = (struct DMM_RES_OBJECT *)hDMMRes;
+ struct DMM_MAP_OBJECT *pDMMRes = (struct DMM_MAP_OBJECT *)hDMMRes;
DSP_STATUS status = DSP_SOK;
DBC_Assert(hDMMRes != NULL);
pDMMRes->ulMpuAddr = pMpuAddr;
pDMMRes->ulDSPAddr = pMapAddr;
pDMMRes->ulDSPResAddr = pReqAddr;
- pDMMRes->dmmSize = ulSize;
+ pDMMRes->size = ulSize;
pDMMRes->hProcessor = hProcessor;
pDMMRes->dmmAllocated = 1;
@@ -285,11 +285,11 @@ DSP_STATUS DRV_ProcFreeDMMRes(HANDLE hPCtxt)
{
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
DSP_STATUS status = DSP_SOK;
- struct DMM_RES_OBJECT *pDMMList = pCtxt->pDMMList;
- struct DMM_RES_OBJECT *pDMMRes = NULL;
+ struct DMM_MAP_OBJECT *pDMMList = pCtxt->dmm_map_list;
+ struct DMM_MAP_OBJECT *pDMMRes = NULL;
GT_0trace(curTrace, GT_ENTER, "\nDRV_ProcFreeDMMRes: 1\n");
- while (pDMMList != NULL) {
+ while (pDMMList) {
pDMMRes = pDMMList;
pDMMList = pDMMList->next;
if (pDMMRes->dmmAllocated) {
@@ -315,32 +315,32 @@ DSP_STATUS DRV_RemoveAllDMMResElements(HANDLE hPCtxt)
{
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
DSP_STATUS status = DSP_SOK;
- struct DMM_RES_OBJECT *pTempDMMRes2 = NULL;
- struct DMM_RES_OBJECT *pTempDMMRes = NULL;
+ struct DMM_MAP_OBJECT *pTempDMMRes2 = NULL;
+ struct DMM_MAP_OBJECT *pTempDMMRes = NULL;
DRV_ProcFreeDMMRes(pCtxt);
- pTempDMMRes = pCtxt->pDMMList;
+ pTempDMMRes = pCtxt->dmm_map_list;
while (pTempDMMRes != NULL) {
pTempDMMRes2 = pTempDMMRes;
pTempDMMRes = pTempDMMRes->next;
kfree(pTempDMMRes2);
}
- pCtxt->pDMMList = NULL;
+ pCtxt->dmm_map_list = NULL;
return status;
}
DSP_STATUS DRV_GetDMMResElement(u32 pMapAddr, HANDLE hDMMRes, HANDLE hPCtxt)
{
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
- struct DMM_RES_OBJECT **pDMMRes = (struct DMM_RES_OBJECT **)hDMMRes;
+ struct DMM_MAP_OBJECT **pDMMRes = (struct DMM_MAP_OBJECT **)hDMMRes;
DSP_STATUS status = DSP_SOK;
- struct DMM_RES_OBJECT *pTempDMM = NULL;
+ struct DMM_MAP_OBJECT *pTempDMM = NULL;
- if (mutex_lock_interruptible(&pCtxt->dmm_mutex))
+ if (mutex_lock_interruptible(&pCtxt->dmm_map_mutex))
return DSP_EFAIL;
- pTempDMM = pCtxt->pDMMList;
- while ((pTempDMM != NULL) && (pTempDMM->ulDSPAddr != pMapAddr)) {
+ pTempDMM = pCtxt->dmm_map_list;
+ while (pTempDMM && (pTempDMM->ulDSPAddr != pMapAddr)) {
GT_3trace(curTrace, GT_ENTER,
"DRV_GetDMMResElement: 2 pTempDMM:%x "
"pTempDMM->ulDSPAddr:%x pMapAddr:%x\n", pTempDMM,
@@ -348,14 +348,15 @@ DSP_STATUS DRV_GetDMMResElement(u32 pMapAddr, HANDLE hDMMRes, HANDLE hPCtxt)
pTempDMM = pTempDMM->next;
}
- mutex_unlock(&pCtxt->dmm_mutex);
+ mutex_unlock(&pCtxt->dmm_map_mutex);
- if (pTempDMM != NULL) {
+ if (pTempDMM) {
GT_0trace(curTrace, GT_ENTER, "DRV_GetDMMResElement: 3");
*pDMMRes = pTempDMM;
} else {
status = DSP_ENOTFOUND;
- } GT_0trace(curTrace, GT_ENTER, "DRV_GetDMMResElement: 4");
+ GT_0trace(curTrace, GT_ENTER, "DRV_GetDMMResElement: 4");
+ }
return status;
}
diff --git a/drivers/dsp/bridge/rmgr/drv_interface.c b/drivers/dsp/bridge/rmgr/drv_interface.c
index f083ba7..e6a7eb7 100644
--- a/drivers/dsp/bridge/rmgr/drv_interface.c
+++ b/drivers/dsp/bridge/rmgr/drv_interface.c
@@ -499,7 +499,7 @@ static int bridge_open(struct inode *ip, struct file *filp)
pr_ctxt = MEM_Calloc(sizeof(struct PROCESS_CONTEXT), MEM_PAGED);
if (pr_ctxt) {
pr_ctxt->resState = PROC_RES_ALLOCATED;
- mutex_init(&pr_ctxt->dmm_mutex);
+ mutex_init(&pr_ctxt->dmm_map_mutex);
mutex_init(&pr_ctxt->node_mutex);
mutex_init(&pr_ctxt->strm_mutex);
} else {
--
1.6.3.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
* [PATCHv3 2/2] DSPBRIDGE: New reserved memory accounting framework
2010-02-17 14:18 [PATCHv3 0/2] DSPBRIDGE: Improved reserved memory cleanup Ameya Palande
2010-02-17 14:18 ` [PATCHv3 1/2] DSPBRIDGE: Rename DMM_RES_OBJECT to DMM_MAP_OBJECT Ameya Palande
@ 2010-02-17 14:18 ` Ameya Palande
1 sibling, 0 replies; 3+ messages in thread
From: Ameya Palande @ 2010-02-17 14:18 UTC (permalink / raw)
To: linux-omap; +Cc: felipe.contreras, x0095840, nm, deepak.chitriki
DSP_RSV_OBJECT is introduced to track reserved memory accounting information.
This will allow us to do proper cleanup for memory reserved using
PROC_ReserveMemory().
Signed-off-by: Ameya Palande <ameya.palande@nokia.com>
---
arch/arm/plat-omap/include/dspbridge/drv.h | 10 +++++
arch/arm/plat-omap/include/dspbridge/proc.h | 4 +-
drivers/dsp/bridge/pmgr/wcd.c | 7 ++--
drivers/dsp/bridge/rmgr/drv.c | 18 ++++++----
drivers/dsp/bridge/rmgr/drv_interface.c | 2 +
drivers/dsp/bridge/rmgr/node.c | 5 ++-
drivers/dsp/bridge/rmgr/proc.c | 52 +++++++++++++++++++++------
7 files changed, 73 insertions(+), 25 deletions(-)
diff --git a/arch/arm/plat-omap/include/dspbridge/drv.h b/arch/arm/plat-omap/include/dspbridge/drv.h
index d5f5277..f7d0e3e 100644
--- a/arch/arm/plat-omap/include/dspbridge/drv.h
+++ b/arch/arm/plat-omap/include/dspbridge/drv.h
@@ -101,6 +101,12 @@ struct DMM_MAP_OBJECT {
struct DMM_MAP_OBJECT *next;
} ;
+/* Used for DMM reserved memory accounting */
+struct DMM_RSV_OBJECT {
+ struct list_head link;
+ u32 dsp_reserved_addr;
+};
+
/* New structure (member of process context) abstracts DMM resource info */
struct DSPHEAP_RES_OBJECT {
s32 heapAllocated; /* DMM status */
@@ -143,6 +149,10 @@ struct PROCESS_CONTEXT{
struct DMM_MAP_OBJECT *dmm_map_list;
struct mutex dmm_map_mutex;
+ /* DMM reserved memory resources */
+ struct list_head dmm_rsv_list;
+ spinlock_t dmm_rsv_lock;
+
/* DSP Heap resources */
struct DSPHEAP_RES_OBJECT *pDSPHEAPList;
diff --git a/arch/arm/plat-omap/include/dspbridge/proc.h b/arch/arm/plat-omap/include/dspbridge/proc.h
index 8dbdaac..1ffe763 100644
--- a/arch/arm/plat-omap/include/dspbridge/proc.h
+++ b/arch/arm/plat-omap/include/dspbridge/proc.h
@@ -560,7 +560,7 @@
* Details:
*/
extern DSP_STATUS PROC_ReserveMemory(DSP_HPROCESSOR hProcessor,
- u32 ulSize, void **ppRsvAddr);
+ u32 ulSize, void **ppRsvAddr, struct PROCESS_CONTEXT *pr_ctxt);
/*
* ======== PROC_UnMap ========
@@ -604,6 +604,6 @@
* Details:
*/
extern DSP_STATUS PROC_UnReserveMemory(DSP_HPROCESSOR hProcessor,
- void *pRsvAddr);
+ void *pRsvAddr, struct PROCESS_CONTEXT *pr_ctxt);
#endif /* PROC_ */
diff --git a/drivers/dsp/bridge/pmgr/wcd.c b/drivers/dsp/bridge/pmgr/wcd.c
index beea23b..1ef606e 100644
--- a/drivers/dsp/bridge/pmgr/wcd.c
+++ b/drivers/dsp/bridge/pmgr/wcd.c
@@ -1054,12 +1054,13 @@ u32 PROCWRAP_ReserveMemory(union Trapped_Args *args, void *pr_ctxt)
GT_0trace(WCD_debugMask, GT_ENTER, "PROCWRAP_ReserveMemory: entered\n");
status = PROC_ReserveMemory(args->ARGS_PROC_RSVMEM.hProcessor,
- args->ARGS_PROC_RSVMEM.ulSize, &pRsvAddr);
+ args->ARGS_PROC_RSVMEM.ulSize, &pRsvAddr,
+ pr_ctxt);
if (DSP_SUCCEEDED(status)) {
if (put_user(pRsvAddr, args->ARGS_PROC_RSVMEM.ppRsvAddr)) {
status = DSP_EINVALIDARG;
PROC_UnReserveMemory(args->ARGS_PROC_RSVMEM.hProcessor,
- pRsvAddr);
+ pRsvAddr, pr_ctxt);
}
}
return status;
@@ -1100,7 +1101,7 @@ u32 PROCWRAP_UnReserveMemory(union Trapped_Args *args, void *pr_ctxt)
GT_0trace(WCD_debugMask, GT_ENTER,
"PROCWRAP_UnReserveMemory: entered\n");
status = PROC_UnReserveMemory(args->ARGS_PROC_UNRSVMEM.hProcessor,
- args->ARGS_PROC_UNRSVMEM.pRsvAddr);
+ args->ARGS_PROC_UNRSVMEM.pRsvAddr, pr_ctxt);
return status;
}
diff --git a/drivers/dsp/bridge/rmgr/drv.c b/drivers/dsp/bridge/rmgr/drv.c
index 9b513e2..12ba7e0 100644
--- a/drivers/dsp/bridge/rmgr/drv.c
+++ b/drivers/dsp/bridge/rmgr/drv.c
@@ -298,25 +298,20 @@ DSP_STATUS DRV_ProcFreeDMMRes(HANDLE hPCtxt)
if (DSP_FAILED(status))
pr_debug("%s: PROC_UnMap failed! status ="
" 0x%xn", __func__, status);
- status = PROC_UnReserveMemory(pDMMRes->hProcessor,
- (void *)pDMMRes->ulDSPResAddr);
- if (DSP_FAILED(status))
- pr_debug("%s: PROC_UnReserveMemory failed!"
- " status = 0x%xn", __func__, status);
pDMMRes->dmmAllocated = 0;
}
}
return status;
}
-/* Release all DMM resources and its context
-* This is called from .bridge_release. */
+/* Release all Mapped and Reserved DMM resources */
DSP_STATUS DRV_RemoveAllDMMResElements(HANDLE hPCtxt)
{
struct PROCESS_CONTEXT *pCtxt = (struct PROCESS_CONTEXT *)hPCtxt;
DSP_STATUS status = DSP_SOK;
struct DMM_MAP_OBJECT *pTempDMMRes2 = NULL;
struct DMM_MAP_OBJECT *pTempDMMRes = NULL;
+ struct DMM_RSV_OBJECT *temp, *rsv_obj;
DRV_ProcFreeDMMRes(pCtxt);
pTempDMMRes = pCtxt->dmm_map_list;
@@ -326,6 +321,15 @@ DSP_STATUS DRV_RemoveAllDMMResElements(HANDLE hPCtxt)
kfree(pTempDMMRes2);
}
pCtxt->dmm_map_list = NULL;
+
+ /* Free DMM reserved memory resources */
+ list_for_each_entry_safe(rsv_obj, temp, &pCtxt->dmm_rsv_list, link) {
+ status = PROC_UnReserveMemory(pCtxt->hProcessor,
+ (void *)rsv_obj->dsp_reserved_addr, pCtxt);
+ if (DSP_FAILED(status))
+ pr_err("%s: PROC_UnReserveMemory failed!"
+ " status = 0x%xn", __func__, status);
+ }
return status;
}
diff --git a/drivers/dsp/bridge/rmgr/drv_interface.c b/drivers/dsp/bridge/rmgr/drv_interface.c
index e6a7eb7..80b8c7e 100644
--- a/drivers/dsp/bridge/rmgr/drv_interface.c
+++ b/drivers/dsp/bridge/rmgr/drv_interface.c
@@ -500,6 +500,8 @@ static int bridge_open(struct inode *ip, struct file *filp)
if (pr_ctxt) {
pr_ctxt->resState = PROC_RES_ALLOCATED;
mutex_init(&pr_ctxt->dmm_map_mutex);
+ spin_lock_init(&pr_ctxt->dmm_rsv_lock);
+ INIT_LIST_HEAD(&pr_ctxt->dmm_rsv_list);
mutex_init(&pr_ctxt->node_mutex);
mutex_init(&pr_ctxt->strm_mutex);
} else {
diff --git a/drivers/dsp/bridge/rmgr/node.c b/drivers/dsp/bridge/rmgr/node.c
index b60d1ed..17b07ed 100644
--- a/drivers/dsp/bridge/rmgr/node.c
+++ b/drivers/dsp/bridge/rmgr/node.c
@@ -454,7 +454,7 @@ DSP_STATUS NODE_Allocate(struct PROC_OBJECT *hProcessor,
status = PROC_ReserveMemory(hProcessor,
pNode->createArgs.asa.taskArgs.uHeapSize + PAGE_SIZE,
(void **)&(pNode->createArgs.asa.taskArgs.
- uDSPHeapResAddr));
+ uDSPHeapResAddr), pr_ctxt);
if (DSP_FAILED(status)) {
GT_1trace(NODE_debugMask, GT_5CLASS,
"NODE_Allocate:Failed to reserve "
@@ -2726,7 +2726,8 @@ static void DeleteNode(struct NODE_OBJECT *hNode,
" Status = 0x%x\n", (u32)status);
}
status = PROC_UnReserveMemory(hNode->hProcessor,
- (void *)taskArgs.uDSPHeapResAddr);
+ (void *)taskArgs.uDSPHeapResAddr,
+ pr_ctxt);
if (DSP_SUCCEEDED(status)) {
GT_0trace(NODE_debugMask, GT_5CLASS,
"DSPProcessor_UnReserveMemory "
diff --git a/drivers/dsp/bridge/rmgr/proc.c b/drivers/dsp/bridge/rmgr/proc.c
index 6c0173a..6ce76cb 100644
--- a/drivers/dsp/bridge/rmgr/proc.c
+++ b/drivers/dsp/bridge/rmgr/proc.c
@@ -1431,11 +1431,12 @@ func_end:
* Reserve a virtually contiguous region of DSP address space.
*/
DSP_STATUS PROC_ReserveMemory(DSP_HPROCESSOR hProcessor, u32 ulSize,
- void **ppRsvAddr)
+ void **ppRsvAddr, struct PROCESS_CONTEXT *pr_ctxt)
{
struct DMM_OBJECT *hDmmMgr;
DSP_STATUS status = DSP_SOK;
struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProcessor;
+ struct DMM_RSV_OBJECT *rsv_obj;
GT_3trace(PROC_DebugMask, GT_ENTER,
"Entered PROC_ReserveMemory, args:\n\t"
@@ -1447,16 +1448,29 @@ DSP_STATUS PROC_ReserveMemory(DSP_HPROCESSOR hProcessor, u32 ulSize,
"InValid Processor Handle \n");
goto func_end;
}
+
status = DMM_GetHandle(pProcObject, &hDmmMgr);
if (DSP_FAILED(status)) {
GT_1trace(PROC_DebugMask, GT_7CLASS, "PROC_ReserveMemory: "
"Failed to get DMM Mgr handle: 0x%x\n", status);
- } else
- status = DMM_ReserveMemory(hDmmMgr, ulSize, (u32 *)ppRsvAddr);
+ goto func_end;
+ }
+
+ status = DMM_ReserveMemory(hDmmMgr, ulSize, (u32 *)ppRsvAddr);
+ if (status != DSP_SOK)
+ goto func_end;
+
+ rsv_obj = kmalloc(sizeof(struct DMM_RSV_OBJECT), GFP_KERNEL);
+ if (rsv_obj) {
+ rsv_obj->dsp_reserved_addr = (u32) *ppRsvAddr;
+ spin_lock(&pr_ctxt->dmm_rsv_lock);
+ list_add(&rsv_obj->link, &pr_ctxt->dmm_rsv_list);
+ spin_unlock(&pr_ctxt->dmm_rsv_lock);
+ }
+func_end:
GT_1trace(PROC_DebugMask, GT_ENTER, "Leaving PROC_ReserveMemory [0x%x]",
status);
-func_end:
return status;
}
@@ -1705,11 +1719,13 @@ func_end:
* Purpose:
* Frees a previously reserved region of DSP address space.
*/
-DSP_STATUS PROC_UnReserveMemory(DSP_HPROCESSOR hProcessor, void *pRsvAddr)
+DSP_STATUS PROC_UnReserveMemory(DSP_HPROCESSOR hProcessor, void *pRsvAddr,
+ struct PROCESS_CONTEXT *pr_ctxt)
{
struct DMM_OBJECT *hDmmMgr;
DSP_STATUS status = DSP_SOK;
struct PROC_OBJECT *pProcObject = (struct PROC_OBJECT *)hProcessor;
+ struct DMM_RSV_OBJECT *temp, *rsv_obj;
GT_2trace(PROC_DebugMask, GT_ENTER,
"Entered PROC_UnReserveMemory, args:\n\t"
@@ -1720,18 +1736,32 @@ DSP_STATUS PROC_UnReserveMemory(DSP_HPROCESSOR hProcessor, void *pRsvAddr)
"InValid Processor Handle \n");
goto func_end;
}
+
status = DMM_GetHandle(pProcObject, &hDmmMgr);
- if (DSP_FAILED(status))
+ if (DSP_FAILED(status)) {
GT_1trace(PROC_DebugMask, GT_7CLASS,
"PROC_UnReserveMemory: Failed to get DMM Mgr "
"handle: 0x%x\n", status);
- else
- status = DMM_UnReserveMemory(hDmmMgr, (u32) pRsvAddr);
+ goto func_end;
+ }
+
+ status = DMM_UnReserveMemory(hDmmMgr, (u32) pRsvAddr);
+ if (status != DSP_SOK)
+ goto func_end;
+
+ spin_lock(&pr_ctxt->dmm_rsv_lock);
+ list_for_each_entry_safe(rsv_obj, temp, &pr_ctxt->dmm_rsv_list, link) {
+ if (rsv_obj->dsp_reserved_addr == (u32)pRsvAddr) {
+ list_del(&rsv_obj->link);
+ kfree(rsv_obj);
+ break;
+ }
+ }
+ spin_unlock(&pr_ctxt->dmm_rsv_lock);
- GT_1trace(PROC_DebugMask, GT_ENTER,
- "Leaving PROC_UnReserveMemory [0x%x]",
- status);
func_end:
+ GT_1trace(PROC_DebugMask, GT_ENTER,
+ "Leaving PROC_UnReserveMemory [0x%x]", status);
return status;
}
--
1.6.3.3
^ permalink raw reply related [flat|nested] 3+ messages in thread
end of thread, other threads:[~2010-02-17 14:19 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-17 14:18 [PATCHv3 0/2] DSPBRIDGE: Improved reserved memory cleanup Ameya Palande
2010-02-17 14:18 ` [PATCHv3 1/2] DSPBRIDGE: Rename DMM_RES_OBJECT to DMM_MAP_OBJECT Ameya Palande
2010-02-17 14:18 ` [PATCHv3 2/2] DSPBRIDGE: New reserved memory accounting framework Ameya Palande
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox