From: Arve Hjønnevåg Date: Thu, 22 Apr 2010 22:53:23 +0000 (-0700) Subject: Staging: android: binder: Create dedicated workqueue for binder deferred work X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=3c762a49b12073c96f6a55b4dfc8b6a2a45fedff;p=GitHub%2Fexynos8895%2Fandroid_kernel_samsung_universal8895.git Staging: android: binder: Create dedicated workqueue for binder deferred work Some drivers flush the global workqueue when closed. This would deadlock if the last reference to the file was released from the binder. Signed-off-by: Arve Hjønnevåg Signed-off-by: Greg Kroah-Hartman --- diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 669e2a6d611b..6d6fe7bdebd3 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -48,6 +48,7 @@ static struct dentry *binder_debugfs_dir_entry_proc; static struct binder_node *binder_context_mgr_node; static uid_t binder_context_mgr_uid = -1; static int binder_last_id; +static struct workqueue_struct *binder_deferred_workqueue; #define BINDER_DEBUG_ENTRY(name) \ static int binder_##name##_open(struct inode *inode, struct file *file) \ @@ -3109,7 +3110,7 @@ binder_defer_work(struct binder_proc *proc, enum binder_deferred_state defer) if (hlist_unhashed(&proc->deferred_work_node)) { hlist_add_head(&proc->deferred_work_node, &binder_deferred_list); - schedule_work(&binder_deferred_work); + queue_work(binder_deferred_workqueue, &binder_deferred_work); } mutex_unlock(&binder_deferred_lock); } @@ -3552,6 +3553,10 @@ static int __init binder_init(void) { int ret; + binder_deferred_workqueue = create_singlethread_workqueue("binder"); + if (!binder_deferred_workqueue) + return -ENOMEM; + binder_debugfs_dir_entry_root = debugfs_create_dir("binder", NULL); if (binder_debugfs_dir_entry_root) binder_debugfs_dir_entry_proc = debugfs_create_dir("proc",