diff --git a/drivers/staging/android/binder.c b/drivers/staging/android/binder.c index 0872499406cf6b021ce64f0b78fbfe06a9d96394..d3243164ea635475b298512b6910c6902f973c2d 100644 --- a/drivers/staging/android/binder.c +++ b/drivers/staging/android/binder.c @@ -1687,8 +1687,16 @@ static void binder_transaction(struct binder_proc *proc, list_add_tail(&t->work.entry, target_list); tcomplete->type = BINDER_WORK_TRANSACTION_COMPLETE; list_add_tail(&tcomplete->entry, &thread->todo); - if (target_wait) - wake_up_interruptible(target_wait); + if (target_wait) { + if (reply || !(t->flags & TF_ONE_WAY)) { + preempt_disable(); + wake_up_interruptible_sync(target_wait); + sched_preempt_enable_no_resched(); + } + else { + wake_up_interruptible(target_wait); + } + } return; err_get_unused_fd_failed: