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