Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

signalfd: use wake_up_pollfree()

wake_up_poll() uses nr_exclusive=1, so it's not guaranteed to wake up
all exclusive waiters. Yet, POLLFREE *must* wake up all waiters. epoll
and aio poll are fortunately not affected by this, but it's very
fragile. Thus, the new function wake_up_pollfree() has been introduced.

Convert signalfd to use wake_up_pollfree().

Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
Fixes: d80e731ecab4 ("epoll: introduce POLLFREE to flush ->signalfd_wqh before kfree()")
Cc: stable@vger.kernel.org
Link: https://lore.kernel.org/r/20211209010455.42744-4-ebiggers@kernel.org
Signed-off-by: Eric Biggers <ebiggers@google.com>

+1 -11
+1 -11
fs/signalfd.c
··· 35 35 36 36 void signalfd_cleanup(struct sighand_struct *sighand) 37 37 { 38 - wait_queue_head_t *wqh = &sighand->signalfd_wqh; 39 - /* 40 - * The lockless check can race with remove_wait_queue() in progress, 41 - * but in this case its caller should run under rcu_read_lock() and 42 - * sighand_cachep is SLAB_TYPESAFE_BY_RCU, we can safely return. 43 - */ 44 - if (likely(!waitqueue_active(wqh))) 45 - return; 46 - 47 - /* wait_queue_entry_t->func(POLLFREE) should do remove_wait_queue() */ 48 - wake_up_poll(wqh, EPOLLHUP | POLLFREE); 38 + wake_up_pollfree(&sighand->signalfd_wqh); 49 39 } 50 40 51 41 struct signalfd_ctx {