summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSoheil Hassas Yeganeh <soheil@google.com>2020-12-18 14:01:51 -0800
committerLinus Torvalds <torvalds@linux-foundation.org>2020-12-19 11:18:37 -0800
commitcccd29bf0823bdfeb087b7661b06856b1b73bced (patch)
treea2f7132ce19a1e05899f4698fbfc59ca05538b11
parent2efdaf7660c408d57721cc6dacb0167f866cb451 (diff)
downloadlinux-cccd29bf0823bdfeb087b7661b06856b1b73bced.tar.bz2
epoll: pull fatal signal checks into ep_send_events()
To simplify the code, pull in checking the fatal signals into ep_send_events(). ep_send_events() is called only from ep_poll(). Note that, previously, we were always checking fatal events, but it is checked only if eavail is true. This should be fine because the goal of that check is to quickly return from epoll_wait() when there is a pending fatal signal. Link: https://lkml.kernel.org/r/20201106231635.3528496-4-soheil.kdev@gmail.com Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com> Suggested-by: Willem de Bruijn <willemb@google.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Reviewed-by: Khazhismel Kumykov <khazhy@google.com> Cc: Guantao Liu <guantaol@google.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r--fs/eventpoll.c17
1 files changed, 8 insertions, 9 deletions
diff --git a/fs/eventpoll.c b/fs/eventpoll.c
index 4f460be723d0..b9d87745fae6 100644
--- a/fs/eventpoll.c
+++ b/fs/eventpoll.c
@@ -1625,6 +1625,14 @@ static int ep_send_events(struct eventpoll *ep,
poll_table pt;
int res = 0;
+ /*
+ * Always short-circuit for fatal signals to allow threads to make a
+ * timely exit without the chance of finding more events available and
+ * fetching repeatedly.
+ */
+ if (fatal_signal_pending(current))
+ return -EINTR;
+
init_poll_funcptr(&pt, NULL);
mutex_lock(&ep->mtx);
@@ -1846,15 +1854,6 @@ fetch_events:
}
send_events:
- if (fatal_signal_pending(current)) {
- /*
- * Always short-circuit for fatal signals to allow
- * threads to make a timely exit without the chance of
- * finding more events available and fetching
- * repeatedly.
- */
- return -EINTR;
- }
/*
* Try to transfer events to user space. In case we get 0 events and
* there's still timeout left over, we go trying again in search of