• TATSUKAWA KOSUKE (立川 江介)'s avatar
    n_tty: wake up poll(POLLRDNORM) on receiving data · c816b2e6
    TATSUKAWA KOSUKE (立川 江介) authored
    The poll man page says POLLRDNORM is equivalent to POLLIN when used as
    an event.
    $ man poll
    <snip>
                  POLLRDNORM
                         Equivalent to POLLIN.
    
    However, in n_tty driver, POLLRDNORM does not return until timeout even
    if there is terminal input, whereas POLLIN returns.
    
    The following test program works until kernel-3.17, but the test stops
    in poll() after commit 57087d51 ("tty: Fix spurious poll() wakeups").
    
    [Steps to run test program]
      $ cc -o test-pollrdnorm test-pollrdnorm.c
      $ ./test-pollrdnorm
      foo          <-- Type in something from the terminal followed by [RET].
                       The string should be echoed back.
    
      ------------------------< test-pollrdnorm.c >------------------------
      #include <stdio.h>
      #include <errno.h>
      #include <poll.h>
      #include <unistd.h>
    
      void main(void)
      {
    	int		n;
    	unsigned char	buf[8];
    	struct pollfd	fds[1] = {{ 0, POLLRDNORM, 0 }};
    
    	n = poll(fds, 1, -1);
    	if (n < 0)
    		perror("poll");
    	n = read(0, buf, 8);
    	if (n < 0)
    		perror("read");
    	if (n > 0)
    		write(1, buf, n);
      }
      ------------------------------------------------------------------------
    
    The attached patch fixes this problem.  Many calls to
    wake_up_interruptible_poll() in the kernel source code already specify
    "POLLIN | POLLRDNORM".
    
    Fixes: 57087d51 ("tty: Fix spurious poll() wakeups")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarKosuke Tatsukawa <tatsu-ab1@nec.com>
    Link: https://lore.kernel.org/r/TYCPR01MB81901C0F932203D30E452B3EA5209@TYCPR01MB8190.jpnprd01.prod.outlook.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    c816b2e6
n_tty.c 61.1 KB