From: "Michael S. Tsirkin" <mst@redhat.com>
To: Jason Wang <jasowang@redhat.com>
Cc: virtualization@lists.linux-foundation.org,
linux-kernel@vger.kernel.org, netdev@vger.kernel.org
Subject: Re: [PATCH net-next 2/5] virtio-net: pack headroom into ctx for mergeable buffer
Date: Tue, 18 Jul 2017 21:59:33 +0300 [thread overview]
Message-ID: <20170718215432-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <1500295441-19339-3-git-send-email-jasowang@redhat.com>
On Mon, Jul 17, 2017 at 08:43:58PM +0800, Jason Wang wrote:
> Pack headroom into ctx, then during XDP set, we could know the size of
> headroom and copy if needed. This is required for avoiding reset on
> XDP.
Not really when XDP is set - it's when buffers are used.
virtio-net: pack headroom into ctx for mergeable buffers
Pack headroom into ctx - this way when we get a buffer we can figure out
the actual headroom that was allocated for the buffer. Will be helpful
to optimize switching between XDP and non-XDP modes which have different
headroom requirements.
>
> Signed-off-by: Jason Wang <jasowang@redhat.com>
> ---
> drivers/net/virtio_net.c | 29 ++++++++++++++++++++++++-----
> 1 file changed, 24 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/net/virtio_net.c b/drivers/net/virtio_net.c
> index 1f8c15c..8fae9a8 100644
> --- a/drivers/net/virtio_net.c
> +++ b/drivers/net/virtio_net.c
> @@ -270,6 +270,23 @@ static void skb_xmit_done(struct virtqueue *vq)
> netif_wake_subqueue(vi->dev, vq2txq(vq));
> }
>
> +#define MRG_CTX_HEADER_SHIFT 22
> +static void *mergeable_len_to_ctx(unsigned int truesize,
> + unsigned int headroom)
> +{
> + return (void *)(unsigned long)((headroom << MRG_CTX_HEADER_SHIFT) | truesize);
> +}
> +
> +static unsigned int mergeable_ctx_to_headroom(void *mrg_ctx)
> +{
> + return (unsigned long)mrg_ctx >> MRG_CTX_HEADER_SHIFT;
> +}
> +
> +static unsigned int mergeable_ctx_to_truesize(void *mrg_ctx)
> +{
> + return (unsigned long)mrg_ctx & ((1 << MRG_CTX_HEADER_SHIFT) - 1);
> +}
> +
> /* Called from bottom half context */
> static struct sk_buff *page_to_skb(struct virtnet_info *vi,
> struct receive_queue *rq,
> @@ -639,13 +656,14 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
> }
> rcu_read_unlock();
>
> - if (unlikely(len > (unsigned long)ctx)) {
> + truesize = mergeable_ctx_to_truesize(ctx);
> + if (unlikely(len > truesize)) {
> pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
> dev->name, len, (unsigned long)ctx);
> dev->stats.rx_length_errors++;
> goto err_skb;
> }
> - truesize = (unsigned long)ctx;
> +
> head_skb = page_to_skb(vi, rq, page, offset, len, truesize);
> curr_skb = head_skb;
>
> @@ -665,13 +683,14 @@ static struct sk_buff *receive_mergeable(struct net_device *dev,
> }
>
> page = virt_to_head_page(buf);
> - if (unlikely(len > (unsigned long)ctx)) {
> +
> + truesize = mergeable_ctx_to_truesize(ctx);
> + if (unlikely(len > truesize)) {
> pr_debug("%s: rx error: len %u exceeds truesize %lu\n",
> dev->name, len, (unsigned long)ctx);
> dev->stats.rx_length_errors++;
> goto err_skb;
> }
> - truesize = (unsigned long)ctx;
>
> num_skb_frags = skb_shinfo(curr_skb)->nr_frags;
> if (unlikely(num_skb_frags == MAX_SKB_FRAGS)) {
> @@ -889,7 +908,7 @@ static int add_recvbuf_mergeable(struct virtnet_info *vi,
>
> buf = (char *)page_address(alloc_frag->page) + alloc_frag->offset;
> buf += headroom; /* advance address leaving hole at front of pkt */
> - ctx = (void *)(unsigned long)len;
> + ctx = mergeable_len_to_ctx(len, headroom);
> get_page(alloc_frag->page);
> alloc_frag->offset += len + headroom;
> hole = alloc_frag->size - alloc_frag->offset;
> --
> 2.7.4
next prev parent reply other threads:[~2017-07-18 18:59 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-07-17 12:43 [PATCH net-next 0/5] refine virtio-net XDP Jason Wang
2017-07-17 12:43 ` [PATCH net-next 1/5] virtio_ring: allow to store zero as the ctx Jason Wang
2017-07-17 12:43 ` Jason Wang
2017-07-17 12:43 ` [PATCH net-next 2/5] virtio-net: pack headroom into ctx for mergeable buffer Jason Wang
2017-07-18 18:59 ` Michael S. Tsirkin [this message]
2017-07-19 2:29 ` Jason Wang
2017-07-19 2:29 ` Jason Wang
2017-07-18 18:59 ` Michael S. Tsirkin
2017-07-17 12:43 ` [PATCH net-next 3/5] virtio-net: switch to use new ctx API for small buffer Jason Wang
2017-07-18 19:20 ` Michael S. Tsirkin
2017-07-18 19:20 ` Michael S. Tsirkin
2017-07-19 2:30 ` Jason Wang
2017-07-19 2:30 ` Jason Wang
2017-07-17 12:43 ` Jason Wang
2017-07-17 12:44 ` [PATCH net-next 4/5] virtio-net: do not reset during XDP set Jason Wang
2017-07-18 19:49 ` Michael S. Tsirkin
2017-07-19 2:35 ` Jason Wang
2017-07-19 2:35 ` Jason Wang
2017-07-18 19:49 ` Michael S. Tsirkin
2017-07-17 12:44 ` Jason Wang
2017-07-17 12:44 ` [PATCH net-next 5/5] virtio-net: switch off offloads on demand if possible on " Jason Wang
2017-07-17 12:44 ` Jason Wang
2017-07-18 20:07 ` Michael S. Tsirkin
2017-07-18 20:07 ` Michael S. Tsirkin
2017-07-19 2:39 ` Jason Wang
2017-07-24 21:36 ` Michael S. Tsirkin
2017-07-24 21:36 ` Michael S. Tsirkin
2017-07-19 2:39 ` Jason Wang
2017-07-18 18:24 ` [PATCH net-next 0/5] refine virtio-net XDP David Miller
2017-07-18 18:24 ` David Miller
2017-07-18 18:47 ` Michael S. Tsirkin
2017-07-18 18:47 ` Michael S. Tsirkin
2017-07-18 20:13 ` Michael S. Tsirkin
2017-07-18 20:13 ` Michael S. Tsirkin
2017-07-19 2:40 ` Jason Wang
2017-07-19 2:40 ` Jason 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=20170718215432-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=jasowang@redhat.com \
--cc=linux-kernel@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=virtualization@lists.linux-foundation.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.