diff options
author | Felipe Contreras <felipe.contreras@gmail.com> | 2010-11-10 13:09:22 -0500 |
---|---|---|
committer | Omar Ramirez Luna <omar.ramirez@ti.com> | 2010-11-10 19:34:42 -0500 |
commit | a28903501cb7f7b1ad52c1e981aed2738ae7c434 (patch) | |
tree | abcaea6c4d6c772cb07e7081ec39e71f6e0912ca /drivers | |
parent | 2fa28a5182869968a388d34f8d809aa07a0d4046 (diff) |
Revert "staging: tidspbridge - remove reserved memory clean up"
This reverts commit db348ca36e5881cd1d2e5caa6eee7d0237d07a3d.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Omar Ramirez Luna <omar.ramirez@ti.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/tidspbridge/include/dspbridge/drv.h | 4 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv.c | 11 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/drv_interface.c | 2 | ||||
-rw-r--r-- | drivers/staging/tidspbridge/rmgr/proc.c | 36 |
4 files changed, 53 insertions, 0 deletions
diff --git a/drivers/staging/tidspbridge/include/dspbridge/drv.h b/drivers/staging/tidspbridge/include/dspbridge/drv.h index 427f38b7b43a..c1f363ec9afa 100644 --- a/drivers/staging/tidspbridge/include/dspbridge/drv.h +++ b/drivers/staging/tidspbridge/include/dspbridge/drv.h | |||
@@ -165,6 +165,10 @@ struct process_context { | |||
165 | struct list_head dmm_map_list; | 165 | struct list_head dmm_map_list; |
166 | spinlock_t dmm_map_lock; | 166 | spinlock_t dmm_map_lock; |
167 | 167 | ||
168 | /* DMM reserved memory resources */ | ||
169 | struct list_head dmm_rsv_list; | ||
170 | spinlock_t dmm_rsv_lock; | ||
171 | |||
168 | /* DSP Heap resources */ | 172 | /* DSP Heap resources */ |
169 | struct dspheap_res_object *pdspheap_list; | 173 | struct dspheap_res_object *pdspheap_list; |
170 | 174 | ||
diff --git a/drivers/staging/tidspbridge/rmgr/drv.c b/drivers/staging/tidspbridge/rmgr/drv.c index 91cc168516e5..0c857b93416a 100644 --- a/drivers/staging/tidspbridge/rmgr/drv.c +++ b/drivers/staging/tidspbridge/rmgr/drv.c | |||
@@ -146,6 +146,7 @@ int drv_remove_all_dmm_res_elements(void *process_ctxt) | |||
146 | struct process_context *ctxt = (struct process_context *)process_ctxt; | 146 | struct process_context *ctxt = (struct process_context *)process_ctxt; |
147 | int status = 0; | 147 | int status = 0; |
148 | struct dmm_map_object *temp_map, *map_obj; | 148 | struct dmm_map_object *temp_map, *map_obj; |
149 | struct dmm_rsv_object *temp_rsv, *rsv_obj; | ||
149 | 150 | ||
150 | /* Free DMM mapped memory resources */ | 151 | /* Free DMM mapped memory resources */ |
151 | list_for_each_entry_safe(map_obj, temp_map, &ctxt->dmm_map_list, link) { | 152 | list_for_each_entry_safe(map_obj, temp_map, &ctxt->dmm_map_list, link) { |
@@ -155,6 +156,16 @@ int drv_remove_all_dmm_res_elements(void *process_ctxt) | |||
155 | pr_err("%s: proc_un_map failed!" | 156 | pr_err("%s: proc_un_map failed!" |
156 | " status = 0x%xn", __func__, status); | 157 | " status = 0x%xn", __func__, status); |
157 | } | 158 | } |
159 | |||
160 | /* Free DMM reserved memory resources */ | ||
161 | list_for_each_entry_safe(rsv_obj, temp_rsv, &ctxt->dmm_rsv_list, link) { | ||
162 | status = proc_un_reserve_memory(ctxt->hprocessor, (void *) | ||
163 | rsv_obj->dsp_reserved_addr, | ||
164 | ctxt); | ||
165 | if (status) | ||
166 | pr_err("%s: proc_un_reserve_memory failed!" | ||
167 | " status = 0x%xn", __func__, status); | ||
168 | } | ||
158 | return status; | 169 | return status; |
159 | } | 170 | } |
160 | 171 | ||
diff --git a/drivers/staging/tidspbridge/rmgr/drv_interface.c b/drivers/staging/tidspbridge/rmgr/drv_interface.c index 34be43fec044..324fcdffb3b3 100644 --- a/drivers/staging/tidspbridge/rmgr/drv_interface.c +++ b/drivers/staging/tidspbridge/rmgr/drv_interface.c | |||
@@ -509,6 +509,8 @@ static int bridge_open(struct inode *ip, struct file *filp) | |||
509 | pr_ctxt->res_state = PROC_RES_ALLOCATED; | 509 | pr_ctxt->res_state = PROC_RES_ALLOCATED; |
510 | spin_lock_init(&pr_ctxt->dmm_map_lock); | 510 | spin_lock_init(&pr_ctxt->dmm_map_lock); |
511 | INIT_LIST_HEAD(&pr_ctxt->dmm_map_list); | 511 | INIT_LIST_HEAD(&pr_ctxt->dmm_map_list); |
512 | spin_lock_init(&pr_ctxt->dmm_rsv_lock); | ||
513 | INIT_LIST_HEAD(&pr_ctxt->dmm_rsv_list); | ||
512 | 514 | ||
513 | pr_ctxt->node_id = kzalloc(sizeof(struct idr), GFP_KERNEL); | 515 | pr_ctxt->node_id = kzalloc(sizeof(struct idr), GFP_KERNEL); |
514 | if (pr_ctxt->node_id) { | 516 | if (pr_ctxt->node_id) { |
diff --git a/drivers/staging/tidspbridge/rmgr/proc.c b/drivers/staging/tidspbridge/rmgr/proc.c index e5fec5729037..59c946bb3ed2 100644 --- a/drivers/staging/tidspbridge/rmgr/proc.c +++ b/drivers/staging/tidspbridge/rmgr/proc.c | |||
@@ -1515,6 +1515,7 @@ int proc_reserve_memory(void *hprocessor, u32 ul_size, | |||
1515 | struct dmm_object *dmm_mgr; | 1515 | struct dmm_object *dmm_mgr; |
1516 | int status = 0; | 1516 | int status = 0; |
1517 | struct proc_object *p_proc_object = (struct proc_object *)hprocessor; | 1517 | struct proc_object *p_proc_object = (struct proc_object *)hprocessor; |
1518 | struct dmm_rsv_object *rsv_obj; | ||
1518 | 1519 | ||
1519 | if (!p_proc_object) { | 1520 | if (!p_proc_object) { |
1520 | status = -EFAULT; | 1521 | status = -EFAULT; |
@@ -1528,6 +1529,22 @@ int proc_reserve_memory(void *hprocessor, u32 ul_size, | |||
1528 | } | 1529 | } |
1529 | 1530 | ||
1530 | status = dmm_reserve_memory(dmm_mgr, ul_size, (u32 *) pp_rsv_addr); | 1531 | status = dmm_reserve_memory(dmm_mgr, ul_size, (u32 *) pp_rsv_addr); |
1532 | if (status != 0) | ||
1533 | goto func_end; | ||
1534 | |||
1535 | /* | ||
1536 | * A successful reserve should be followed by insertion of rsv_obj | ||
1537 | * into dmm_rsv_list, so that reserved memory resource tracking | ||
1538 | * remains uptodate | ||
1539 | */ | ||
1540 | rsv_obj = kmalloc(sizeof(struct dmm_rsv_object), GFP_KERNEL); | ||
1541 | if (rsv_obj) { | ||
1542 | rsv_obj->dsp_reserved_addr = (u32) *pp_rsv_addr; | ||
1543 | spin_lock(&pr_ctxt->dmm_rsv_lock); | ||
1544 | list_add(&rsv_obj->link, &pr_ctxt->dmm_rsv_list); | ||
1545 | spin_unlock(&pr_ctxt->dmm_rsv_lock); | ||
1546 | } | ||
1547 | |||
1531 | func_end: | 1548 | func_end: |
1532 | dev_dbg(bridge, "%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p " | 1549 | dev_dbg(bridge, "%s: hprocessor: 0x%p ul_size: 0x%x pp_rsv_addr: 0x%p " |
1533 | "status 0x%x\n", __func__, hprocessor, | 1550 | "status 0x%x\n", __func__, hprocessor, |
@@ -1739,6 +1756,7 @@ int proc_un_reserve_memory(void *hprocessor, void *prsv_addr, | |||
1739 | struct dmm_object *dmm_mgr; | 1756 | struct dmm_object *dmm_mgr; |
1740 | int status = 0; | 1757 | int status = 0; |
1741 | struct proc_object *p_proc_object = (struct proc_object *)hprocessor; | 1758 | struct proc_object *p_proc_object = (struct proc_object *)hprocessor; |
1759 | struct dmm_rsv_object *rsv_obj; | ||
1742 | 1760 | ||
1743 | if (!p_proc_object) { | 1761 | if (!p_proc_object) { |
1744 | status = -EFAULT; | 1762 | status = -EFAULT; |
@@ -1752,6 +1770,24 @@ int proc_un_reserve_memory(void *hprocessor, void *prsv_addr, | |||
1752 | } | 1770 | } |
1753 | 1771 | ||
1754 | status = dmm_un_reserve_memory(dmm_mgr, (u32) prsv_addr); | 1772 | status = dmm_un_reserve_memory(dmm_mgr, (u32) prsv_addr); |
1773 | if (status != 0) | ||
1774 | goto func_end; | ||
1775 | |||
1776 | /* | ||
1777 | * A successful unreserve should be followed by removal of rsv_obj | ||
1778 | * from dmm_rsv_list, so that reserved memory resource tracking | ||
1779 | * remains uptodate | ||
1780 | */ | ||
1781 | spin_lock(&pr_ctxt->dmm_rsv_lock); | ||
1782 | list_for_each_entry(rsv_obj, &pr_ctxt->dmm_rsv_list, link) { | ||
1783 | if (rsv_obj->dsp_reserved_addr == (u32) prsv_addr) { | ||
1784 | list_del(&rsv_obj->link); | ||
1785 | kfree(rsv_obj); | ||
1786 | break; | ||
1787 | } | ||
1788 | } | ||
1789 | spin_unlock(&pr_ctxt->dmm_rsv_lock); | ||
1790 | |||
1755 | func_end: | 1791 | func_end: |
1756 | dev_dbg(bridge, "%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n", | 1792 | dev_dbg(bridge, "%s: hprocessor: 0x%p prsv_addr: 0x%p status: 0x%x\n", |
1757 | __func__, hprocessor, prsv_addr, status); | 1793 | __func__, hprocessor, prsv_addr, status); |