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/signalfd.c
          +++ new/usr/src/uts/common/io/signalfd.c
↓ open down ↓ 2 lines elided ↑ open up ↑
   3    3   * Common Development and Distribution License ("CDDL"), version 1.0.
   4    4   * You may only use this file in accordance with the terms of version
   5    5   * 1.0 of the CDDL.
   6    6   *
   7    7   * A full copy of the text of the CDDL should have accompanied this
   8    8   * source.  A copy of the CDDL is also available via the Internet at
   9    9   * http://www.illumos.org/license/CDDL.
  10   10   */
  11   11  
  12   12  /*
  13      - * Copyright 2016 Joyent, Inc.
       13 + * Copyright 2017 Joyent, Inc.
  14   14   */
  15   15  
  16   16  /*
  17   17   * Support for the signalfd facility, a Linux-borne facility for
  18   18   * file descriptor-based synchronous signal consumption.
  19   19   *
  20   20   * As described on the signalfd(3C) man page, the general idea behind these
  21   21   * file descriptors is that they can be used to synchronously consume signals
  22   22   * via the read(2) syscall.  While that capability already exists with the
  23   23   * sigwaitinfo(3C) function, signalfd holds an advantage since it is file
↓ open down ↓ 529 lines elided ↑ open up ↑
 553  553  signalfd_sig_pending(proc_t *p, kthread_t *t, k_sigset_t set)
 554  554  {
 555  555          return (((p->p_sig.__sigbits[0] | t->t_sig.__sigbits[0]) &
 556  556              set.__sigbits[0]) |
 557  557              ((p->p_sig.__sigbits[1] | t->t_sig.__sigbits[1]) &
 558  558              set.__sigbits[1]) |
 559  559              (((p->p_sig.__sigbits[2] | t->t_sig.__sigbits[2]) &
 560  560              set.__sigbits[2]) & FILLSET2));
 561  561  }
 562  562  
 563      -_NOTE(ARGSUSED(4))
 564  563  static int
 565  564  signalfd_poll(dev_t dev, short events, int anyyet, short *reventsp,
 566  565      struct pollhead **phpp)
 567  566  {
 568  567          signalfd_state_t *state, **sstate;
 569  568          minor_t minor = getminor(dev);
 570  569          kthread_t *t = curthread;
 571  570          proc_t *p = ttoproc(t);
 572  571          short revents = 0;
 573  572  
 574  573          sstate = ddi_get_soft_state(signalfd_softstate, minor);
 575  574          state = *sstate;
 576  575  
 577  576          mutex_enter(&state->sfd_lock);
 578  577  
 579  578          if (signalfd_sig_pending(p, t, state->sfd_set) != 0)
 580  579                  revents |= POLLRDNORM | POLLIN;
 581  580  
 582  581          mutex_exit(&state->sfd_lock);
 583  582  
 584      -        if (!(*reventsp = revents & events) && !anyyet) {
      583 +        *reventsp = revents & events;
      584 +        if ((*reventsp == 0 && !anyyet) || (events & POLLET)) {
 585  585                  sigfd_proc_state_t *pstate;
 586  586                  sigfd_poll_waiter_t *pw;
 587  587  
 588  588                  /*
 589  589                   * Enable pollwakeup handling.
 590  590                   */
 591  591                  mutex_enter(&p->p_lock);
 592  592                  if ((pstate = (sigfd_proc_state_t *)p->p_sigfd) == NULL) {
 593  593  
 594  594                          mutex_exit(&p->p_lock);
↓ open down ↓ 273 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX