Skip to content

Commit 31643d8

Browse files
Carlos Llamasgregkh
authored andcommitted
binder: fix hang of unregistered readers
With the introduction of binder_available_for_proc_work_ilocked() in commit 1b77e9d ("ANDROID: binder: remove proc waitqueue") a binder thread can only "wait_for_proc_work" after its thread->looper has been marked as BINDER_LOOPER_STATE_{ENTERED|REGISTERED}. This means an unregistered reader risks waiting indefinitely for work since it never gets added to the proc->waiting_threads. If there are no further references to its waitqueue either the task will hang. The same applies to readers using the (e)poll interface. I couldn't find the rationale behind this restriction. So this patch restores the previous behavior of allowing unregistered threads to "wait_for_proc_work". Note that an error message for this scenario, which had previously become unreachable, is now re-enabled. Fixes: 1b77e9d ("ANDROID: binder: remove proc waitqueue") Cc: [email protected] Cc: Martijn Coenen <[email protected]> Cc: Arve Hjønnevåg <[email protected]> Signed-off-by: Carlos Llamas <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent a5e43e2 commit 31643d8

File tree

1 file changed

+1
-3
lines changed

1 file changed

+1
-3
lines changed

drivers/android/binder.c

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -570,9 +570,7 @@ static bool binder_has_work(struct binder_thread *thread, bool do_proc_work)
570570
static bool binder_available_for_proc_work_ilocked(struct binder_thread *thread)
571571
{
572572
return !thread->transaction_stack &&
573-
binder_worklist_empty_ilocked(&thread->todo) &&
574-
(thread->looper & (BINDER_LOOPER_STATE_ENTERED |
575-
BINDER_LOOPER_STATE_REGISTERED));
573+
binder_worklist_empty_ilocked(&thread->todo);
576574
}
577575

578576
static void binder_wakeup_poll_threads_ilocked(struct binder_proc *proc,

0 commit comments

Comments
 (0)