* [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