All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Kicinski <kuba@kernel.org>
To: Eric Dumazet <edumazet@google.com>, Paolo Abeni <pabeni@redhat.com>
Cc: Jens Axboe <axboe@kernel.dk>, netdev <netdev@vger.kernel.org>
Subject: Re: [PATCH] net: pass back data left in socket after receive
Date: Thu, 28 Apr 2022 15:18:29 -0700	[thread overview]
Message-ID: <20220428151829.675f78b4@kernel.org> (raw)
In-Reply-To: <064c8731-e7f9-c415-5d4d-141a559e2017@kernel.dk>

On Wed, 27 Apr 2022 13:49:34 -0600 Jens Axboe wrote:
> This is currently done for CMSG_INQ, add an ability to do so via struct
> msghdr as well and have CMSG_INQ use that too. If the caller sets
> msghdr->msg_get_inq, then we'll pass back the hint in msghdr->msg_inq.
> 
> Rearrange struct msghdr a bit so we can add this member while shrinking
> it at the same time. On a 64-bit build, it was 96 bytes before this
> change and 88 bytes afterwards.
> 
> Signed-off-by: Jens Axboe <axboe@kernel.dk>

LGTM, but I said that once before..  Eric?

FWIW the io_uring patch that uses it is here:
https://git.kernel.dk/cgit/linux-block/commit/?h=io_uring-flags2

> diff --git a/include/linux/socket.h b/include/linux/socket.h
> index 6f85f5d957ef..12085c9a8544 100644
> --- a/include/linux/socket.h
> +++ b/include/linux/socket.h
> @@ -50,6 +50,9 @@ struct linger {
>  struct msghdr {
>  	void		*msg_name;	/* ptr to socket address structure */
>  	int		msg_namelen;	/* size of socket address structure */
> +
> +	int		msg_inq;	/* output, data left in socket */
> +
>  	struct iov_iter	msg_iter;	/* data */
>  
>  	/*
> @@ -62,8 +65,9 @@ struct msghdr {
>  		void __user	*msg_control_user;
>  	};
>  	bool		msg_control_is_user : 1;
> -	__kernel_size_t	msg_controllen;	/* ancillary data buffer length */
> +	bool		msg_get_inq : 1;/* return INQ after receive */
>  	unsigned int	msg_flags;	/* flags on received message */
> +	__kernel_size_t	msg_controllen;	/* ancillary data buffer length */
>  	struct kiocb	*msg_iocb;	/* ptr to iocb for async requests */
>  };
>  
> diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
> index cf18fbcbf123..78d79e26fb4d 100644
> --- a/net/ipv4/tcp.c
> +++ b/net/ipv4/tcp.c
> @@ -2335,8 +2335,10 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
>  	if (sk->sk_state == TCP_LISTEN)
>  		goto out;
>  
> -	if (tp->recvmsg_inq)
> +	if (tp->recvmsg_inq) {
>  		*cmsg_flags = TCP_CMSG_INQ;
> +		msg->msg_get_inq = 1;
> +	}
>  	timeo = sock_rcvtimeo(sk, nonblock);
>  
>  	/* Urgent data needs to be handled specially. */
> @@ -2559,7 +2561,7 @@ static int tcp_recvmsg_locked(struct sock *sk, struct msghdr *msg, size_t len,
>  int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
>  		int flags, int *addr_len)
>  {
> -	int cmsg_flags = 0, ret, inq;
> +	int cmsg_flags = 0, ret;
>  	struct scm_timestamping_internal tss;
>  
>  	if (unlikely(flags & MSG_ERRQUEUE))
> @@ -2576,12 +2578,14 @@ int tcp_recvmsg(struct sock *sk, struct msghdr *msg, size_t len, int nonblock,
>  	release_sock(sk);
>  	sk_defer_free_flush(sk);
>  
> -	if (cmsg_flags && ret >= 0) {
> +	if ((cmsg_flags || msg->msg_get_inq) && ret >= 0) {
>  		if (cmsg_flags & TCP_CMSG_TS)
>  			tcp_recv_timestamp(msg, sk, &tss);
> +		if (msg->msg_get_inq)
> +			msg->msg_inq = tcp_inq_hint(sk);
>  		if (cmsg_flags & TCP_CMSG_INQ) {
> -			inq = tcp_inq_hint(sk);
> -			put_cmsg(msg, SOL_TCP, TCP_CM_INQ, sizeof(inq), &inq);
> +			put_cmsg(msg, SOL_TCP, TCP_CM_INQ, sizeof(msg->msg_inq),
> +				 &msg->msg_inq);
>  		}
>  	}
>  	return ret;
> 


  reply	other threads:[~2022-04-28 22:18 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-04-27 19:49 [PATCH] net: pass back data left in socket after receive Jens Axboe
2022-04-28 22:18 ` Jakub Kicinski [this message]
2022-04-28 22:37   ` Eric Dumazet
2022-04-28 22:57     ` Jens Axboe

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=20220428151829.675f78b4@kernel.org \
    --to=kuba@kernel.org \
    --cc=axboe@kernel.dk \
    --cc=edumazet@google.com \
    --cc=netdev@vger.kernel.org \
    --cc=pabeni@redhat.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.