diff options
author | =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@android.com> | 2011-12-02 14:05:14 +0800 |
---|---|---|
committer | Andy Green <andy.green@linaro.org> | 2011-12-02 14:05:14 +0800 |
commit | a53983e5d6d3f1b583030578e4a0d88d8666952a (patch) | |
tree | a6d334fb5a7638a23789a1fc361ac7da6c6772c5 | |
parent | fdedab7cd0ab4126539dcb3a36c4de55fa10d369 (diff) |
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
Some drivers flush the global workqueue when closed. This would deadlock if
the last reference to the file was released from the binder.
Change-Id: Ifdabc0b383fecb20836d1bbb9786c632402a14e1
Signed-off-by: Arve Hjønnevåg <arve@android.com>
-rw-r--r-- | drivers/staging/android/binder.c | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 8b2565ebaba..d14a3c41fc8 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -47,6 +47,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) \ @@ -3108,7 +3109,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); } @@ -3551,6 +3552,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", |