All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jakub Sitnicki <jakub@cloudflare.com>
To: Cong Wang <xiyou.wangcong@gmail.com>
Cc: netdev@vger.kernel.org, bpf@vger.kernel.org,
	duanxiongchun@bytedance.com, wangdongdong.6@bytedance.com,
	jiang.wang@bytedance.com, Cong Wang <cong.wang@bytedance.com>,
	John Fastabend <john.fastabend@gmail.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Lorenz Bauer <lmb@cloudflare.com>
Subject: Re: [Patch bpf-next v4 03/11] skmsg: introduce skb_send_sock() for sock_map
Date: Thu, 11 Mar 2021 12:42:16 +0100	[thread overview]
Message-ID: <87zgz93oiv.fsf@cloudflare.com> (raw)
In-Reply-To: <20210310053222.41371-4-xiyou.wangcong@gmail.com>

On Wed, Mar 10, 2021 at 06:32 AM CET, Cong Wang wrote:
> From: Cong Wang <cong.wang@bytedance.com>
>
> We only have skb_send_sock_locked() which requires callers
> to use lock_sock(). Introduce a variant skb_send_sock()
> which locks on its own, callers do not need to lock it
> any more. This will save us from adding a ->sendmsg_locked
> for each protocol.
>
> To reuse the code, pass function pointers to __skb_send_sock()
> and build skb_send_sock() and skb_send_sock_locked() on top.
>
> Cc: John Fastabend <john.fastabend@gmail.com>
> Cc: Daniel Borkmann <daniel@iogearbox.net>
> Cc: Jakub Sitnicki <jakub@cloudflare.com>
> Cc: Lorenz Bauer <lmb@cloudflare.com>
> Signed-off-by: Cong Wang <cong.wang@bytedance.com>
> ---
>  include/linux/skbuff.h |  1 +
>  net/core/skbuff.c      | 52 ++++++++++++++++++++++++++++++++++++------
>  2 files changed, 46 insertions(+), 7 deletions(-)
>
> diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
> index 0503c917d773..2fc8c3657c53 100644
> --- a/include/linux/skbuff.h
> +++ b/include/linux/skbuff.h
> @@ -3626,6 +3626,7 @@ int skb_splice_bits(struct sk_buff *skb, struct sock *sk, unsigned int offset,
>  		    unsigned int flags);
>  int skb_send_sock_locked(struct sock *sk, struct sk_buff *skb, int offset,
>  			 int len);
> +int skb_send_sock(struct sock *sk, struct sk_buff *skb, int offset, int len);
>  void skb_copy_and_csum_dev(const struct sk_buff *skb, u8 *to);
>  unsigned int skb_zerocopy_headlen(const struct sk_buff *from);
>  int skb_zerocopy(struct sk_buff *to, struct sk_buff *from,
> diff --git a/net/core/skbuff.c b/net/core/skbuff.c
> index 545a472273a5..396586bd6ae3 100644
> --- a/net/core/skbuff.c
> +++ b/net/core/skbuff.c
> @@ -2500,9 +2500,12 @@ int skb_splice_bits(struct sk_buff *skb, struct sock *sk, unsigned int offset,
>  }
>  EXPORT_SYMBOL_GPL(skb_splice_bits);
>
> -/* Send skb data on a socket. Socket must be locked. */
> -int skb_send_sock_locked(struct sock *sk, struct sk_buff *skb, int offset,
> -			 int len)
> +typedef int (*sendmsg_func)(struct sock *sk, struct msghdr *msg,
> +			    struct kvec *vec, size_t num, size_t size);
> +typedef int (*sendpage_func)(struct sock *sk, struct page *page, int offset,
> +			   size_t size, int flags);
> +static int __skb_send_sock(struct sock *sk, struct sk_buff *skb, int offset,
> +			   int len, sendmsg_func sendmsg, sendpage_func sendpage)
>  {
>  	unsigned int orig_len = len;
>  	struct sk_buff *head = skb;
> @@ -2522,7 +2525,7 @@ int skb_send_sock_locked(struct sock *sk, struct sk_buff *skb, int offset,
>  		memset(&msg, 0, sizeof(msg));
>  		msg.msg_flags = MSG_DONTWAIT;
>
> -		ret = kernel_sendmsg_locked(sk, &msg, &kv, 1, slen);
> +		ret = sendmsg(sk, &msg, &kv, 1, slen);


Maybe use INDIRECT_CALLABLE_DECLARE() and INDIRECT_CALL_2() since there
are just two possibilities? Same for sendpage below.

>  		if (ret <= 0)
>  			goto error;
>
> @@ -2553,9 +2556,9 @@ int skb_send_sock_locked(struct sock *sk, struct sk_buff *skb, int offset,
>  		slen = min_t(size_t, len, skb_frag_size(frag) - offset);
>
>  		while (slen) {
> -			ret = kernel_sendpage_locked(sk, skb_frag_page(frag),
> -						     skb_frag_off(frag) + offset,
> -						     slen, MSG_DONTWAIT);
> +			ret = sendpage(sk, skb_frag_page(frag),
> +				       skb_frag_off(frag) + offset,
> +				       slen, MSG_DONTWAIT);
>  			if (ret <= 0)
>  				goto error;
>

[...]

  reply	other threads:[~2021-03-11 11:43 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-10  5:32 [Patch bpf-next v4 00/11] sockmap: introduce BPF_SK_SKB_VERDICT and support UDP Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 01/11] skmsg: lock ingress_skb when purging Cong Wang
2021-03-11 10:52   ` Jakub Sitnicki
2021-03-10  5:32 ` [Patch bpf-next v4 02/11] skmsg: introduce a spinlock to protect ingress_msg Cong Wang
2021-03-11 11:28   ` Jakub Sitnicki
2021-03-12  0:45     ` Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 03/11] skmsg: introduce skb_send_sock() for sock_map Cong Wang
2021-03-11 11:42   ` Jakub Sitnicki [this message]
2021-03-12  0:47     ` Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 04/11] skmsg: avoid lock_sock() in sk_psock_backlog() Cong Wang
2021-03-12 12:02   ` Jakub Sitnicki
2021-03-13 17:32     ` Cong Wang
2021-03-15 20:55       ` Jakub Sitnicki
2021-03-10  5:32 ` [Patch bpf-next v4 05/11] sock_map: introduce BPF_SK_SKB_VERDICT Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 06/11] sock: introduce sk->sk_prot->psock_update_sk_prot() Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 07/11] udp: implement ->read_sock() for sockmap Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 08/11] skmsg: extract __tcp_bpf_recvmsg() and tcp_bpf_wait_data() Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 09/11] udp: implement udp_bpf_recvmsg() for sockmap Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 10/11] sock_map: update sock type checks for UDP Cong Wang
2021-03-10  5:32 ` [Patch bpf-next v4 11/11] selftests/bpf: add a test case for udp sockmap Cong Wang

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=87zgz93oiv.fsf@cloudflare.com \
    --to=jakub@cloudflare.com \
    --cc=bpf@vger.kernel.org \
    --cc=cong.wang@bytedance.com \
    --cc=daniel@iogearbox.net \
    --cc=duanxiongchun@bytedance.com \
    --cc=jiang.wang@bytedance.com \
    --cc=john.fastabend@gmail.com \
    --cc=lmb@cloudflare.com \
    --cc=netdev@vger.kernel.org \
    --cc=wangdongdong.6@bytedance.com \
    --cc=xiyou.wangcong@gmail.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.