| From 3c762a49b12073c96f6a55b4dfc8b6a2a45fedff Mon Sep 17 00:00:00 2001 |
| From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@android.com> |
| Date: Thu, 22 Apr 2010 15:53:23 -0700 |
| Subject: Staging: android: binder: Create dedicated workqueue for |
| binder deferred work |
| MIME-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| Patch-mainline: HEAD |
| Git-commit: 3c762a49b12073c96f6a55b4dfc8b6a2a45fedff |
| |
| 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 <arve@android.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c |
| index 669e2a6..6d6fe7b 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", |