ion: Fix two small issues in system_heap allocation
In testing ion system heap allocations, I ran across two issues: 1) Not k*z*allocing the sg table. This can cause trouble if we end up trying call sg_alloc_table() with too many entries, then sg_alloc_table() internally fails and tries to free what it thinks is internal table structure, which causes bad pointer traversals. 2) The second list_for_each_entry probably should be _safe, since I was seeing strange lock warnings and oopses on occasion. This seems to resolve it, but could use some extra checking. Signed-off-by: John Stultz <john.stultz@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
f020b4430b
commit
ea725ec8b1
1 changed files with 2 additions and 3 deletions
|
@ -166,8 +166,7 @@ static int ion_system_heap_allocate(struct ion_heap *heap,
|
||||||
max_order = info->order;
|
max_order = info->order;
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
table = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
|
||||||
table = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
|
|
||||||
if (!table)
|
if (!table)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -189,7 +188,7 @@ static int ion_system_heap_allocate(struct ion_heap *heap,
|
||||||
err1:
|
err1:
|
||||||
kfree(table);
|
kfree(table);
|
||||||
err:
|
err:
|
||||||
list_for_each_entry(info, &pages, list) {
|
list_for_each_entry_safe(info, tmp_info, &pages, list) {
|
||||||
free_buffer_page(sys_heap, buffer, info->page, info->order);
|
free_buffer_page(sys_heap, buffer, info->page, info->order);
|
||||||
kfree(info);
|
kfree(info);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue