RE: [PATCH] socket.7: Add description of SO_SELECT_ERR_QUEUE

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




> -----Original Message-----
> From: Ricardo Biehl Pasquali [mailto:pasqualirb@xxxxxxxxx]
> Sent: Saturday, October 20, 2018 8:35 PM
> To: linux-man@xxxxxxxxxxxxxxx
> Cc: Michael Kerrisk <mtk.manpages@xxxxxxxxx>; Keller, Jacob E
> <jacob.e.keller@xxxxxxxxx>
> Subject: [PATCH] socket.7: Add description of SO_SELECT_ERR_QUEUE
> 
> Signed-off-by: Ricardo Biehl Pasquali <pasqualirb@xxxxxxxxx>
> ---
>  man7/socket.7 | 27 +++++++++++++++++++++++----
>  1 file changed, 23 insertions(+), 4 deletions(-)
> 
> I've commented some issues of error queue polling in
> network mailing list:
> 
> https://www.spinics.net/lists/netdev/msg529722.html
> 
> Ricardo Biehl Pasquali wrote (2018-10-18):
> > The commit 7d4c04fc170087119727 ("net: add option to enable
> > error queue packets waking select") (2013-03-28) introduced
> > SO_SELECT_ERR_QUEUE, which masks POLLPRI with POLLERR event
> > return in some socket poll callbacks.
> >
> > POLLERR event issued with sock_queue_err_skb() did not wake
> > up a poll when POLLERR is the only requested event because
> > sk_data_ready() (sock_def_readable()) was used and it
> > doesn't mask POLLERR in poll wake up:
> >
> > wake_up_interruptible_sync_poll(&wq->wait,
> >                                 EPOLLIN | EPOLLPRI |
> >                                 EPOLLRDNORM | EPOLLRDBAND);
> >
> > If POLLIN or POLLPRI are requested, for example, poll does
> > wake up.
> >
> > POLLERR wakeup by requesting POLLPRI is possible without
> > set SO_SELECT_ERR_QUEUE. All the option does is masking
> > POLLPRI as a returned event before poll returns. poll
> > would return anyway because of POLLERR.
> >
> > Also, the sentence "[...] enable software to wait on error
> > queue packets without waking up for regular data on the
> > socket." from the above commit is not true.
> >
> > A POLLIN event issued via sock_def_readable() wakes up
> > threads waiting for POLLPRI, and vice versa. However,
> > poll() does not return, sleeping again, as the requested
> > events do not match events.
> >
> > The commit 6e5d58fdc9bedd0255a8 ("skbuff: Fix not waking
> > applications when errors are enqueued") (2018-03-14) make
> > POLLERR alone wake up poll. It replaces sk_data_ready()
> > (sock_def_readable()) with sk_error_report()
> > (sock_def_error_report()). This makes "POLLERR wake up by
> > requesting POLLPRI" obsolete.
> >
> > Rationale:
> >
> > POLLIN-only and POLLERR-only wake up are useful when there
> > is a receiving thread, a sending thread, and a thread that
> > get transmit timestamps. The thread polling on POLLERR will
> > not wake up when regular data arrives (POLLIN). The thread
> > polling on POLLIN will not wake up when tx timestamps are
> > ready (POLLERR).
> >
> > One solution is adding an option that disable POLLERR as
> > requested event. This is in the Virtual File System
> > subsystem, not in the network, though.
> >
> > This solves the problem of waking up other threads that
> > not interested in error queue. Thus allowing a separate
> > thread take care of error queue (useful for receiving
> > transmit timestamps).
> >
> > However, this may not be a good solution as it depends on
> > polling behavior. Thoughts?
> >
> > By the way, as the kernel development shouldn't break user
> > space, SO_SELECT_ERR_QUEUE can become a compatibility
> > option.
> 
> I have tried to explain the effect of the option and the
> context in which it was introduced (more or less the reason
> why it was introduced). The POLLIN-POLLPRI mutual wake up
> issue was not commented.
> 

I think the patch makes sense, and the detailed outline of how we got to having the option, and why it probably isn't necessary anymore is very useful!

I think the change in description is good as is.

Thanks,
Jake


> Is it clear? Should a NOTE be written about the other
> issues?
> 
> Cheers!
> 
> 	pasquali
> 
> diff --git a/man7/socket.7 b/man7/socket.7
> index 478fa364c..1ba308198 100644
> --- a/man7/socket.7
> +++ b/man7/socket.7
> @@ -49,10 +49,6 @@
>  .\"	commit a8fc92778080c845eaadc369a0ecf5699a03bef0
>  .\"	Author: Pavel Emelyanov <xemul@xxxxxxxxxxxxx>
>  .\"
> -.\" SO_SELECT_ERR_QUEUE (3.10)
> -.\"	commit 7d4c04fc170087119727119074e72445f2bb192b
> -.\"	Author: Keller, Jacob E <jacob.e.keller@xxxxxxxxx>
> -.\"
>  .\" SO_MAX_PACING_RATE (3.13)
>  .\"	commit 62748f32d501f5d3712a7c372bbb92abc7c62bc7
>  .\"	Author: Eric Dumazet <edumazet@xxxxxxxxxx>
> @@ -869,6 +865,29 @@ Indicates that an unsigned 32-bit value ancillary message
> (cmsg)
>  should be attached to received skbs indicating
>  the number of packets dropped by the socket since its creation.
>  .TP
> +.BR SO_SELECT_ERR_QUEUE " (since Linux 3.10)"
> +.\"	commit 7d4c04fc170087119727119074e72445f2bb192b
> +.\"	Author: Keller, Jacob E <jacob.e.keller@xxxxxxxxx>
> +Masks
> +.B POLLPRI
> +with
> +.B POLLERR
> +event return. This was created when
> +.B POLLERR
> +wake up depended on requesting
> +.B POLLIN
> +or
> +.BR POLLPRI .
> +After the commit 6e5d58fdc9bedd0255a8 ("skbuff: Fix not
> +waking applications when errors are enqueued"), introduced
> +in Linux 4.16,
> +.B POLLERR
> +wakes up normally.
> +The option has no effect in wake up behavior, all it does
> +is masking
> +.B POLLPRI
> +before poll returns.
> +.TP
>  .B SO_SNDBUF
>  Sets or gets the maximum socket send buffer in bytes.
>  The kernel doubles this value (to allow space for bookkeeping overhead)
> --
> 2.17.1




[Index of Archives]     [Kernel Documentation]     [Netdev]     [Linux Ethernet Bridging]     [Linux Wireless]     [Kernel Newbies]     [Security]     [Linux for Hams]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Linux Admin]     [Samba]

  Powered by Linux