diff options
author | Mitchel Humpherys <mitchelh@codeaurora.org> | 2015-01-08 17:24:27 -0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-01-17 16:16:00 -0800 |
commit | 95e53ddd8240bad37df985a9ae2d2a07f49e6bf1 (patch) | |
tree | 5e928f89e3c8cdbad12c6ccfa8594c6c14e9b46e /drivers/staging/android | |
parent | 38c977230c4947d1e99c558a603eb49666a42568 (diff) | |
download | op-kernel-dev-95e53ddd8240bad37df985a9ae2d2a07f49e6bf1.zip op-kernel-dev-95e53ddd8240bad37df985a9ae2d2a07f49e6bf1.tar.gz |
staging: ion: always initialize the free list parameters
Currently we initialize the heap free_lock and free list size in
ion_heap_init_deferred_free, which is only called when the
ION_HEAP_FLAG_DEFER_FREE heap flag is given. However, the lock and size
are used in the shrinker path as well as the deferred free path, and we
can register a shrinker *without* enabling deferred freeing. So, if a
heap provides a shrinker but *doesn't* set the DEFER_FREE flag we will
use these parameters uninitialized (resulting in a spinlock bug and
broken shrinker accounting).
Fix these problems by initializing the free list parameters directly in
ion_device_add_heap, which is always called no matter which heap
features are being used.
Signed-off-by: Mitchel Humpherys <mitchelh@codeaurora.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/android')
-rw-r--r-- | drivers/staging/android/ion/ion.c | 3 | ||||
-rw-r--r-- | drivers/staging/android/ion/ion_heap.c | 2 |
2 files changed, 3 insertions, 2 deletions
diff --git a/drivers/staging/android/ion/ion.c b/drivers/staging/android/ion/ion.c index 296d347..b8f1c49 100644 --- a/drivers/staging/android/ion/ion.c +++ b/drivers/staging/android/ion/ion.c @@ -1508,6 +1508,9 @@ void ion_device_add_heap(struct ion_device *dev, struct ion_heap *heap) pr_err("%s: can not add heap with invalid ops struct.\n", __func__); + spin_lock_init(&heap->free_lock); + heap->free_list_size = 0; + if (heap->flags & ION_HEAP_FLAG_DEFER_FREE) ion_heap_init_deferred_free(heap); diff --git a/drivers/staging/android/ion/ion_heap.c b/drivers/staging/android/ion/ion_heap.c index 4605e04..fd13d05 100644 --- a/drivers/staging/android/ion/ion_heap.c +++ b/drivers/staging/android/ion/ion_heap.c @@ -253,8 +253,6 @@ int ion_heap_init_deferred_free(struct ion_heap *heap) struct sched_param param = { .sched_priority = 0 }; INIT_LIST_HEAD(&heap->free_list); - heap->free_list_size = 0; - spin_lock_init(&heap->free_lock); init_waitqueue_head(&heap->waitqueue); heap->task = kthread_run(ion_heap_deferred_free, heap, "%s", heap->name); |