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/mem.c
          +++ new/usr/src/uts/common/io/mem.c
↓ open down ↓ 17 lines elided ↑ open up ↑
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  /*
  22   22   * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
  23   23   * Use is subject to license terms.
  24   24   * Copyright (c) 2016 by Delphix. All rights reserved.
  25   25   */
  26   26  
  27   27  /*
  28      - * Copyright (c) 2015, Joyent, Inc.  All rights reserved.
       28 + * Copyright 2017 Joyent, Inc.
  29   29   * Copyright 2017 James S Blachly, MD <james.blachly@gmail.com>
  30   30   */
  31   31  
  32   32  /*
  33   33   * Memory special file
  34   34   */
  35   35  
  36   36  #include <sys/types.h>
  37   37  #include <sys/param.h>
  38   38  #include <sys/user.h>
↓ open down ↓ 213 lines elided ↑ open up ↑
 252  252          case M_NULL:
 253  253          case M_ZERO:
 254  254          case M_FULL:
 255  255          case M_MEM:
 256  256          case M_KMEM:
 257  257          case M_ALLKMEM:
 258  258                  *reventsp = events & (POLLIN | POLLOUT | POLLPRI | POLLRDNORM |
 259  259                      POLLWRNORM | POLLRDBAND | POLLWRBAND);
 260  260                  /*
 261  261                   * A non NULL pollhead pointer should be returned in case
 262      -                 * user polls for 0 events.
      262 +                 * user polls for 0 events or is doing an edge-triggerd poll.
 263  263                   */
 264      -                *phpp = !anyyet && !*reventsp ?
 265      -                    &mm_pollhd : (struct pollhead *)NULL;
      264 +                if ((!*reventsp && !anyyet) || (events & POLLET)) {
      265 +                        *phpp = &mm_pollhd;
      266 +                }
 266  267                  return (0);
 267  268          default:
 268  269                  /* no other devices currently support polling */
 269  270                  return (ENXIO);
 270  271          }
 271  272  }
 272  273  
 273  274  static int
 274  275  mmpropop(dev_t dev, dev_info_t *dip, ddi_prop_op_t prop_op, int flags,
 275  276      char *name, caddr_t valuep, int *lengthp)
↓ open down ↓ 843 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX