From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: davem@davemloft.net, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org,
Eric Dumazet <eric.dumazet@gmail.com>
Subject: Re: [PATCH] tun: make tun_build_skb() thread safe
Date: Wed, 16 Aug 2017 19:55:09 +0300 [thread overview]
Message-ID: <20170816195342-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1502892873-10770-1-git-send-email-jasowang@redhat.com>
On Wed, Aug 16, 2017 at 10:14:33PM +0800, Jason Wang wrote:
> From: Eric Dumazet <eric.dumazet@gmail.com>
>
> tun_build_skb() is not thread safe since it uses per queue page frag,
> this will break things when multiple threads are sending through same
> queue. Switch to use per-thread generator (no lock involved).
>
> Fixes: 66ccbc9c87c2 ("tap: use build_skb() for small packet")
> Tested-by: Jason Wang <jasowang@redhat.com>
> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
Acked-by: Michael S. Tsirkin <mst@redhat.com>
Jason, given the switch to task_frag, would it be worth it to look at
using higher order allocs along the lines of
5640f7685831e088fe6c2e1f863a6805962f8e81 as well?
> ---
> drivers/net/tun.c | 7 +------
> 1 file changed, 1 insertion(+), 6 deletions(-)
>
> diff --git a/drivers/net/tun.c b/drivers/net/tun.c
> index 5892284..c38cd84 100644
> --- a/drivers/net/tun.c
> +++ b/drivers/net/tun.c
> @@ -175,7 +175,6 @@ struct tun_file {
> struct list_head next;
> struct tun_struct *detached;
> struct skb_array tx_array;
> - struct page_frag alloc_frag;
> };
>
> struct tun_flow_entry {
> @@ -578,8 +577,6 @@ static void __tun_detach(struct tun_file *tfile, bool clean)
> }
> if (tun)
> skb_array_cleanup(&tfile->tx_array);
> - if (tfile->alloc_frag.page)
> - put_page(tfile->alloc_frag.page);
> sock_put(&tfile->sk);
> }
> }
> @@ -1272,7 +1269,7 @@ static struct sk_buff *tun_build_skb(struct tun_struct *tun,
> struct virtio_net_hdr *hdr,
> int len, int *generic_xdp)
> {
> - struct page_frag *alloc_frag = &tfile->alloc_frag;
> + struct page_frag *alloc_frag = ¤t->task_frag;
> struct sk_buff *skb;
> struct bpf_prog *xdp_prog;
> int buflen = SKB_DATA_ALIGN(len + TUN_RX_PAD) +
> @@ -2580,8 +2577,6 @@ static int tun_chr_open(struct inode *inode, struct file * file)
> tfile->sk.sk_write_space = tun_sock_write_space;
> tfile->sk.sk_sndbuf = INT_MAX;
>
> - tfile->alloc_frag.page = NULL;
> -
> file->private_data = tfile;
> INIT_LIST_HEAD(&tfile->next);
>
> --
> 2.7.4
next prev parent reply other threads:[~2017-08-16 16:55 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-16 14:14 [PATCH] tun: make tun_build_skb() thread safe Jason Wang
2017-08-16 14:29 ` Jason Wang
2017-08-16 16:55 ` Michael S. Tsirkin [this message]
2017-08-17 3:37 ` Jason Wang
2017-08-16 21:27 ` David Miller
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=20170816195342-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=davem@davemloft.net \
--cc=eric.dumazet@gmail.com \
--cc=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
/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.