summaryrefslogtreecommitdiff
path: root/fs/signalfd.c
diff options
context:
space:
mode:
authorClark Williams <williams@redhat.com>2012-03-01 09:15:01 -0600
committerClark Williams <williams@redhat.com>2012-03-01 09:15:01 -0600
commit5ee07f2a498e0a5f4a9994317c0f2e451e27b4f2 (patch)
tree8d8cc50a7de738e1e6b7a66ec27120f616b3919a /fs/signalfd.c
parent5f269e50cb10cd1a74b89f7fda87b0c9082754f0 (diff)
parent44fb3170ae46f8de964a4bb5b0504e865a6dd7da (diff)
Merge commit 'v3.2.9' into rt-3.2.9-rt13v3.2.9-rt13
Diffstat (limited to 'fs/signalfd.c')
-rw-r--r--fs/signalfd.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/signalfd.c b/fs/signalfd.c
index 492465b451dd..7ae2a574cb25 100644
--- a/fs/signalfd.c
+++ b/fs/signalfd.c
@@ -30,6 +30,21 @@
#include <linux/signalfd.h>
#include <linux/syscalls.h>
+void signalfd_cleanup(struct sighand_struct *sighand)
+{
+ wait_queue_head_t *wqh = &sighand->signalfd_wqh;
+ /*
+ * The lockless check can race with remove_wait_queue() in progress,
+ * but in this case its caller should run under rcu_read_lock() and
+ * sighand_cachep is SLAB_DESTROY_BY_RCU, we can safely return.
+ */
+ if (likely(!waitqueue_active(wqh)))
+ return;
+
+ /* wait_queue_t->func(POLLFREE) should do remove_wait_queue() */
+ wake_up_poll(wqh, POLLHUP | POLLFREE);
+}
+
struct signalfd_ctx {
sigset_t sigmask;
};