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>
@@ -23,11 +23,11 @@
* Use is subject to license terms.
* Copyright (c) 2016 by Delphix. All rights reserved.
*/
/*
- * Copyright (c) 2015, Joyent, Inc. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
* Copyright 2017 James S Blachly, MD <james.blachly@gmail.com>
*/
/*
* Memory special file
@@ -257,14 +257,15 @@
case M_ALLKMEM:
*reventsp = events & (POLLIN | POLLOUT | POLLPRI | POLLRDNORM |
POLLWRNORM | POLLRDBAND | POLLWRBAND);
/*
* A non NULL pollhead pointer should be returned in case
- * user polls for 0 events.
+ * user polls for 0 events or is doing an edge-triggerd poll.
*/
- *phpp = !anyyet && !*reventsp ?
- &mm_pollhd : (struct pollhead *)NULL;
+ if ((!*reventsp && !anyyet) || (events & POLLET)) {
+ *phpp = &mm_pollhd;
+ }
return (0);
default:
/* no other devices currently support polling */
return (ENXIO);
}