UPSTREAM: ANDROID: binder: remove waitqueue when thread exits.
[GitHub/LineageOS/android_kernel_samsung_universal7580.git] / drivers / android / binder.c
index f1e64f00d45c92b203efd58e8df59db65d30fcaa..f4aaae464c4b74763aaf63f315cb1293eb9c2d84 100644 (file)
@@ -4529,6 +4529,18 @@ static int binder_thread_release(struct binder_proc *proc,
                if (t)
                        spin_lock(&t->lock);
        }
+
+       /*
+        * If this thread used poll, make sure we remove the waitqueue
+        * from any epoll data structures holding it with POLLFREE.
+        * waitqueue_active() is safe to use here because we're holding
+        * the inner lock.
+        */
+       if ((thread->looper & BINDER_LOOPER_STATE_POLL) &&
+           waitqueue_active(&thread->wait)) {
+               wake_up_poll(&thread->wait, POLLHUP | POLLFREE);
+       }
+
        binder_inner_proc_unlock(thread->proc);
 
        if (send_reply)