From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752757AbdGSC3Z (ORCPT ); Tue, 18 Jul 2017 22:29:25 -0400 Received: from mx1.redhat.com ([209.132.183.28]:49782 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751969AbdGSC3Y (ORCPT ); Tue, 18 Jul 2017 22:29:24 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 12C554A6FC Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=jasowang@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 12C554A6FC Subject: Re: [PATCH net-next 2/5] virtio-net: pack headroom into ctx for mergeable buffer To: "Michael S. Tsirkin" Cc: virtualization@lists.linux-foundation.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org References: <1500295441-19339-1-git-send-email-jasowang@redhat.com> <1500295441-19339-3-git-send-email-jasowang@redhat.com> <20170718215432-mutt-send-email-mst@kernel.org> From: Jason Wang Message-ID: <382b22b5-0735-b2d3-e838-adbc4bedfb3c@redhat.com> Date: Wed, 19 Jul 2017 10:29:18 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: <20170718215432-mutt-send-email-mst@kernel.org> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 19 Jul 2017 02:29:24 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2017年07月19日 02:59, Michael S. Tsirkin wrote: > 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. Of course :) > > 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. Thanks, let me use this as the commit log. > >> Signed-off-by: Jason Wang >> --- >> 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