Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

android: binder: Check for errors in binder_alloc_shrinker_init().

Both list_lru_init() and register_shrinker() might return an error.

Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Cc: Sherry Yang <sherryy@android.com>
Cc: Michal Hocko <mhocko@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Tetsuo Handa and committed by
Greg Kroah-Hartman
533dfb25 22ec1a2a

+13 -5
+3 -1
drivers/android/binder.c
··· 5569 5569 struct binder_device *device; 5570 5570 struct hlist_node *tmp; 5571 5571 5572 - binder_alloc_shrinker_init(); 5572 + ret = binder_alloc_shrinker_init(); 5573 + if (ret) 5574 + return ret; 5573 5575 5574 5576 atomic_set(&binder_transaction_log.cur, ~0U); 5575 5577 atomic_set(&binder_transaction_log_failed.cur, ~0U);
+9 -3
drivers/android/binder_alloc.c
··· 1006 1006 INIT_LIST_HEAD(&alloc->buffers); 1007 1007 } 1008 1008 1009 - void binder_alloc_shrinker_init(void) 1009 + int binder_alloc_shrinker_init(void) 1010 1010 { 1011 - list_lru_init(&binder_alloc_lru); 1012 - register_shrinker(&binder_shrinker); 1011 + int ret = list_lru_init(&binder_alloc_lru); 1012 + 1013 + if (ret == 0) { 1014 + ret = register_shrinker(&binder_shrinker); 1015 + if (ret) 1016 + list_lru_destroy(&binder_alloc_lru); 1017 + } 1018 + return ret; 1013 1019 }
+1 -1
drivers/android/binder_alloc.h
··· 130 130 size_t extra_buffers_size, 131 131 int is_async); 132 132 extern void binder_alloc_init(struct binder_alloc *alloc); 133 - void binder_alloc_shrinker_init(void); 133 + extern int binder_alloc_shrinker_init(void); 134 134 extern void binder_alloc_vma_close(struct binder_alloc *alloc); 135 135 extern struct binder_buffer * 136 136 binder_alloc_prepare_to_free(struct binder_alloc *alloc,