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>

Split Close
Expand all
Collapse all
          --- old/usr/src/uts/common/io/srn.c
          +++ new/usr/src/uts/common/io/srn.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
  24   24   * Use is subject to license terms.
       25 + * Copyright 2017 Joyent, Inc.
  25   26   */
  26   27  
  27   28  
  28   29  /*
  29   30   * srn  Provide apm-like interfaces to Xorg
  30   31   */
  31   32  
  32   33  #include <sys/types.h>
  33   34  #include <sys/errno.h>
  34   35  #include <sys/modctl.h>
↓ open down ↓ 211 lines elided ↑ open up ↑
 246  247  {
 247  248          if ((perm & SU) && secpolicy_power_mgmt(cr) == 0) /* privileged? */
 248  249                  return (1);
 249  250          if ((perm & SG) && (crgetgid(cr) == 0)) /* group 0 is ok */
 250  251                  return (1);
 251  252          return (0);
 252  253  }
 253  254  
 254  255  static int
 255  256  srn_chpoll(dev_t dev, short events, int anyyet, short *reventsp,
 256      -        struct pollhead **phpp)
      257 +    struct pollhead **phpp)
 257  258  {
 258  259          extern struct pollhead srn_pollhead[];
 259  260          int     clone;
 260  261  
 261  262          clone = SRN_MINOR_TO_CLONE(getminor(dev));
 262  263          if ((events & (POLLIN | POLLRDNORM)) && srn_poll_cnt[clone]) {
 263  264                  *reventsp |= (POLLIN | POLLRDNORM);
 264  265          } else {
 265  266                  *reventsp = 0;
 266      -                if (!anyyet) {
 267      -                        *phpp = &srn_pollhead[clone];
 268      -                }
 269  267          }
      268 +
      269 +        if ((*reventsp == 0 && !anyyet) || (events & POLLET)) {
      270 +                *phpp = &srn_pollhead[clone];
      271 +        }
 270  272          return (0);
 271  273  }
 272  274  
 273  275  /*ARGSUSED*/
 274  276  static int
 275  277  srn_getinfo(dev_info_t *dip, ddi_info_cmd_t infocmd, void *arg, void **result)
 276  278  {
 277  279          dev_t   dev;
 278  280          int     instance;
 279  281  
↓ open down ↓ 319 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX