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