aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author=?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= <arve@android.com>2011-12-13 01:24:16 +0800
committerAndy Green <andy.green@linaro.org>2012-01-09 10:54:57 +0800
commitf6283b52260090597d6e772abe36bbd3c36e9d25 (patch)
tree9309b24f134a100027c8a79edb361141c203a899
parent62c24dcbc457e21e1bd826dc3bf06d6b8c54baf1 (diff)
downloadimx53-f6283b52260090597d6e772abe36bbd3c36e9d25.tar.gz
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.c7
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",