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>
@@ -20,10 +20,11 @@
*/
/*
* Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
+ * Copyright 2017 Joyent, Inc.
*/
/*
* evtchn.c
@@ -448,25 +449,25 @@
struct evtsoftdata *ep;
minor_t minor = getminor(dev);
short mask = 0;
ep = EVTCHNDRV_INST2SOFTS(EVTCHNDRV_MINOR2INST(minor));
- *phpp = (struct pollhead *)NULL;
if (ev & POLLOUT)
mask |= POLLOUT;
if (ep->ring_overflow)
mask |= POLLERR;
if (ev & (POLLIN | POLLRDNORM)) {
mutex_enter(&ep->evtchn_lock);
- if (ep->ring_cons != ep->ring_prod)
+ if (ep->ring_cons != ep->ring_prod) {
mask |= (POLLIN | POLLRDNORM) & ev;
- else
- if (mask == 0 && !anyyet)
- *phpp = &ep->evtchn_pollhead;
+ }
mutex_exit(&ep->evtchn_lock);
}
+ if ((mask == 0 && !anyyet) || (ev & POLLET)) {
+ *phpp = &ep->evtchn_pollhead;
+ }
*revp = mask;
return (0);
}