Print this page
8634 epoll fails to wake on certain edge-triggered conditions
8635 epoll should not emit POLLNVAL
8636 recursive epoll should emit EPOLLRDNORM
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Toomas Soome <tsoome@me.com>
Reviewed by: Igor Kozhukhov <igor@dilos.org>

@@ -8,11 +8,11 @@
  * source.  A copy of the CDDL is also available via the Internet at
  * http://www.illumos.org/license/CDDL.
  */
 
 /*
- * Copyright 2016 Joyent, Inc.
+ * Copyright 2017 Joyent, Inc.
  */
 
 /*
  * Support for the signalfd facility, a Linux-borne facility for
  * file descriptor-based synchronous signal consumption.

@@ -558,11 +558,10 @@
             set.__sigbits[1]) |
             (((p->p_sig.__sigbits[2] | t->t_sig.__sigbits[2]) &
             set.__sigbits[2]) & FILLSET2));
 }
 
-_NOTE(ARGSUSED(4))
 static int
 signalfd_poll(dev_t dev, short events, int anyyet, short *reventsp,
     struct pollhead **phpp)
 {
         signalfd_state_t *state, **sstate;

@@ -579,11 +578,12 @@
         if (signalfd_sig_pending(p, t, state->sfd_set) != 0)
                 revents |= POLLRDNORM | POLLIN;
 
         mutex_exit(&state->sfd_lock);
 
-        if (!(*reventsp = revents & events) && !anyyet) {
+        *reventsp = revents & events;
+        if ((*reventsp == 0 && !anyyet) || (events & POLLET)) {
                 sigfd_proc_state_t *pstate;
                 sigfd_poll_waiter_t *pw;
 
                 /*
                  * Enable pollwakeup handling.