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>

@@ -21,10 +21,11 @@
 /*
  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  * Copyright 2012 Milan Jurik. All rights reserved.
  * Copyright (c) 2016 by Delphix. All rights reserved.
+ * Copyright 2017 Joyent, Inc.
  */
 
 
 /*
  * Overview of the RSM Kernel Agent:

@@ -2417,13 +2418,11 @@
         return (e);
 }
 
 static void
 rsm_remap_local_importers(rsm_node_id_t src_nodeid,
-    rsm_memseg_id_t ex_segid,
-    ddi_umem_cookie_t cookie)
-
+    rsm_memseg_id_t ex_segid, ddi_umem_cookie_t cookie)
 {
         rsmresource_t   *p = NULL;
         rsmhash_table_t *rhash = &rsm_import_segs;
         uint_t          index;
 

@@ -3642,14 +3641,12 @@
  *
  * Will also be called from rsm_rebind with disconnect_flag FALSE.
  *
  */
 static void
-rsm_force_unload(rsm_node_id_t src_nodeid,
-    rsm_memseg_id_t ex_segid,
+rsm_force_unload(rsm_node_id_t src_nodeid, rsm_memseg_id_t ex_segid,
     boolean_t disconnect_flag)
-
 {
         rsmresource_t   *p = NULL;
         rsmhash_table_t *rhash = &rsm_import_segs;
         uint_t          index;
         DBG_DEFINE(category,

@@ -6760,11 +6757,10 @@
         DBG_PRINTF((category, RSM_DEBUG_VERBOSE, "rsm_disconnect done\n"));
 
         return (DDI_SUCCESS);
 }
 
-/*ARGSUSED*/
 static int
 rsm_chpoll(dev_t dev, short events, int anyyet, short *reventsp,
     struct pollhead **phpp)
 {
         minor_t         rnum;

@@ -6782,21 +6778,23 @@
         if ((res == NULL) || (res == RSMRC_RESERVED) ||
             (res->rsmrc_type == RSM_RESOURCE_BAR)) {
                 return (ENXIO);
         }
 
-        *reventsp = 0;
-
         /*
          * An exported segment must be in state RSM_STATE_EXPORT; an
          * imported segment must be in state RSM_STATE_ACTIVE.
          */
         seg = (rsmseg_t *)res;
 
         if (seg->s_pollevent) {
                 *reventsp = POLLRDNORM;
-        } else if (!anyyet) {
+        } else {
+                *reventsp = 0;
+        }
+
+        if ((*reventsp == 0 && !anyyet) || (events & POLLET)) {
                 /* cannot take segment lock here */
                 *phpp = &seg->s_poll;
                 seg->s_pollflag |= RSM_SEGMENT_POLL;
         }
         DBG_PRINTF((category, RSM_DEBUG_VERBOSE, "rsm_chpoll done\n"));