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,30 ****
--- 21,31 ----
/*
* 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,2429 ****
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)
!
{
rsmresource_t *p = NULL;
rsmhash_table_t *rhash = &rsm_import_segs;
uint_t index;
--- 2418,2428 ----
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)
{
rsmresource_t *p = NULL;
rsmhash_table_t *rhash = &rsm_import_segs;
uint_t index;
*** 3642,3655 ****
*
* 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,
boolean_t disconnect_flag)
-
{
rsmresource_t *p = NULL;
rsmhash_table_t *rhash = &rsm_import_segs;
uint_t index;
DBG_DEFINE(category,
--- 3641,3652 ----
*
* 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,
boolean_t disconnect_flag)
{
rsmresource_t *p = NULL;
rsmhash_table_t *rhash = &rsm_import_segs;
uint_t index;
DBG_DEFINE(category,
*** 6760,6770 ****
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;
--- 6757,6766 ----
*** 6782,6802 ****
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) {
/* 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"));
--- 6778,6800 ----
if ((res == NULL) || (res == RSMRC_RESERVED) ||
(res->rsmrc_type == RSM_RESOURCE_BAR)) {
return (ENXIO);
}
/*
* 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 {
! *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"));