diff options
Diffstat (limited to 'fs/signalfd.c')
| -rw-r--r-- | fs/signalfd.c | 15 | 
1 files changed, 15 insertions, 0 deletions
diff --git a/fs/signalfd.c b/fs/signalfd.c index 492465b451d..7ae2a574cb2 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;  };  |