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);
         }