Commit ea725ec8 authored by John Stultz's avatar John Stultz Committed by Greg Kroah-Hartman

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: default avatarJohn Stultz <john.stultz@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent f020b443
...@@ -166,8 +166,7 @@ static int ion_system_heap_allocate(struct ion_heap *heap, ...@@ -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, ...@@ -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);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment