From: Hannes Frederic Sowa <hannes@stressinduktion.org>
To: Willem de Bruijn <willemb@google.com>
Cc: netdev@vger.kernel.org, davem@davemloft.net
Subject: Re: [PATCH net-next] sock: consistent errqueue errors and signals
Date: Wed, 03 Sep 2014 14:14:13 +0200 [thread overview]
Message-ID: <1409746453.14224.14.camel@localhost> (raw)
In-Reply-To: <1409534896-372-1-git-send-email-willemb@google.com>
On So, 2014-08-31 at 21:28 -0400, Willem de Bruijn wrote:
> When a socket error is pending, send()/recv() must abort their normal
> operation and return the error. An error means having non-zero
> sk->sk_err or having non-empty sk->sk_error_queue.
>
> Currently, the behavior for the second is inconsistent depending on
> whether an error has previously been dequeued. In all cases,
> recv()/send() test sk->sk_err. This is not modified on enqueue onto
> the error queue, so may be 0. It is modified on dequeue, however, to
> match the queued skb's errno. I observed the following when two errors
> were queued:
>
> ret = poll(pollfd, 1, -1);
> assert(ret == 1);
> assert(pollfd.revents == POLLERR);
>
> ret = recv(fd, buf, size, MSG_NONBLOCK);
> assert(ret == -1 && errno == EAGAIN); /* <-- A */
>
> ret = recv(fd, buf, size, MSG_ERRQUEUE);
> assert(ret > 0);
>
> ret = recv(fd, buf, size, MSG_NONBLOCK);
> assert(ret == -1 && errno == ENOMSG); /* <-- B */
>
> ret = recv(fd, buf, size, MSG_ERRQUEUE);
> assert(ret > 0);
>
> The recv call in B returns the error code embedded in
> SKB_EXT_ERR(skb), in this case ENOMSG, because I am working with
> timestamps. The recv call in A should have returned the
> same.
>
> Implement this behavior. This may surprise existing applications.
>
> Also make the wake-up signal when data is ready on the error queue
> consistent between enqueue and dequeue: use sk_error_report in both
> cases.
>
> Signed-off-by: Willem de Bruijn <willemb@google.com>
>
> ---
>
> This approach leaves one issue:
> The states of sk->sk_err and sk->sk_error_queue are related, but only
> loosely. Error queue enqueue, dequeue and other code may overwrite
> sk->sk_err unconditionally. For one, sock_error will reset
> sk->sk_err to 0 even if sk->sk_error_queue is not empty. If socket
> calls should abort on all errors, then should be change to test
> sk_error_queue.qlen. But, doing so requires taking a lock in a busy
> data path.
> ---
> net/core/skbuff.c | 5 ++++-
> 1 file changed, 4 insertions(+), 1 deletion(-)
>
> diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> index 163b673..f7a280b 100644
> --- a/net/core/skbuff.c
> +++ b/net/core/skbuff.c
> @@ -3485,8 +3485,11 @@ int sock_queue_err_skb(struct sock *sk, struct sk_buff *skb)
> skb_dst_force(skb);
>
> skb_queue_tail(&sk->sk_error_queue, skb);
> + sk->sk_err = SKB_EXT_ERR(skb)->ee.ee_errno;
> +
> if (!sock_flag(sk, SOCK_DEAD))
> - sk->sk_data_ready(sk);
> + sk->sk_error_report(sk);
> +
> return 0;
> }
> EXPORT_SYMBOL(sock_queue_err_skb);
I just noticed another problem with this approach why I think we cannot
use it.
In case we generate an error back to the socket locally because
something (e.g. the packet was too big) in output path, we must not
update sk->sk_err because we return it immediately to the sender but
nonetheless must update the error queue.
It seems to me that this patch would report the same error two times to
the program then.
I'll check your other patch later today, thanks!
Bye,
Hannes
next prev parent reply other threads:[~2014-09-03 12:14 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-09-01 1:28 [PATCH net-next] sock: consistent errqueue errors and signals Willem de Bruijn
2014-09-01 21:25 ` Hannes Frederic Sowa
2014-09-02 15:20 ` Willem de Bruijn
2014-09-02 21:18 ` Hannes Frederic Sowa
2014-09-03 2:34 ` Willem de Bruijn
2014-09-03 12:14 ` Hannes Frederic Sowa [this message]
2014-09-03 19:40 ` Willem de Bruijn
2014-09-04 0:17 ` Hannes Frederic Sowa
2014-09-04 18:13 ` Willem de Bruijn
2014-09-04 18:18 ` Willem de Bruijn
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1409746453.14224.14.camel@localhost \
--to=hannes@stressinduktion.org \
--cc=davem@davemloft.net \
--cc=netdev@vger.kernel.org \
--cc=willemb@google.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).