ion: Fix two small issues in system_heap allocation
authorJohn Stultz <john.stultz@linaro.org>
Fri, 22 Nov 2013 23:36:27 +0000 (15:36 -0800)
committerColin Cross <ccross@android.com>
Thu, 12 Dec 2013 23:27:07 +0000 (15:27 -0800)
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.

Change-Id: I59d4c90104a8cf23dc4ae814d0b17348f1b68ac0
Signed-off-by: John Stultz <john.stultz@linaro.org>
drivers/staging/android/ion/ion_system_heap.c

index 5b9c0e0da5e7f19708eb9a21d1cdf2177edabd2b..5926be9d0fdfca62d4579ea936d89df9c5157a12 100644 (file)
@@ -166,8 +166,7 @@ static int ion_system_heap_allocate(struct ion_heap *heap,
                max_order = info->order;
                i++;
        }
-
-       table = kmalloc(sizeof(struct sg_table), GFP_KERNEL);
+       table = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
        if (!table)
                goto err;
 
@@ -189,7 +188,7 @@ static int ion_system_heap_allocate(struct ion_heap *heap,
 err1:
        kfree(table);
 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);
                kfree(info);
        }