diff options
Diffstat (limited to 'drivers/android/binder.c')
| -rw-r--r-- | drivers/android/binder.c | 10 | 
1 files changed, 10 insertions, 0 deletions
diff --git a/drivers/android/binder.c b/drivers/android/binder.c index 8dd23b19e997..eca24f41556d 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c @@ -478,6 +478,16 @@ binder_enqueue_thread_work_ilocked(struct binder_thread *thread,  {  	WARN_ON(!list_empty(&thread->waiting_thread_node));  	binder_enqueue_work_ilocked(work, &thread->todo); + +	/* (e)poll-based threads require an explicit wakeup signal when +	 * queuing their own work; they rely on these events to consume +	 * messages without I/O block. Without it, threads risk waiting +	 * indefinitely without handling the work. +	 */ +	if (thread->looper & BINDER_LOOPER_STATE_POLL && +	    thread->pid == current->pid && !thread->process_todo) +		wake_up_interruptible_sync(&thread->wait); +  	thread->process_todo = true;  }  | 
