From mboxrd@z Thu Jan 1 00:00:00 1970 From: Maxime Coquelin Subject: Re: [PATCH v2] vhost: Only access header if offloading is supported in dequeue path Date: Fri, 14 Oct 2016 09:24:16 +0200 Message-ID: <22713706-48a4-803e-aed9-811248bae699@redhat.com> References: <1475773241-5714-1-git-send-email-maxime.coquelin@redhat.com> <1476171927-10134-1-git-send-email-maxime.coquelin@redhat.com> <20161011090146.GP1597@yliu-dev.sh.intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252; format=flowed Content-Transfer-Encoding: 7bit Cc: dev@dpdk.org, mst@redhat.com, jianfeng.tan@intel.com, olivier.matz@6wind.com, stephen@networkplumber.org To: Yuanhan Liu Return-path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by dpdk.org (Postfix) with ESMTP id 558382BF7 for ; Fri, 14 Oct 2016 09:24:20 +0200 (CEST) In-Reply-To: <20161011090146.GP1597@yliu-dev.sh.intel.com> List-Id: patches and discussions about DPDK List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" On 10/11/2016 11:01 AM, Yuanhan Liu wrote: > On Tue, Oct 11, 2016 at 09:45:27AM +0200, Maxime Coquelin wrote: >> @@ -684,12 +699,12 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vring_desc *descs, >> struct rte_mempool *mbuf_pool) >> { >> struct vring_desc *desc; >> - uint64_t desc_addr; >> + uint64_t desc_addr = 0; >> uint32_t desc_avail, desc_offset; >> uint32_t mbuf_avail, mbuf_offset; >> uint32_t cpy_len; >> struct rte_mbuf *cur = m, *prev = m; >> - struct virtio_net_hdr *hdr; >> + struct virtio_net_hdr *hdr = NULL; >> /* A counter to avoid desc dead loop chain */ >> uint32_t nr_desc = 1; >> >> @@ -698,12 +713,14 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vring_desc *descs, >> (desc->flags & VRING_DESC_F_INDIRECT)) >> return -1; >> >> - desc_addr = gpa_to_vva(dev, desc->addr); >> - if (unlikely(!desc_addr)) >> - return -1; >> + if (virtio_net_with_host_offload(dev)) { >> + desc_addr = gpa_to_vva(dev, desc->addr); >> + if (unlikely(!desc_addr)) >> + return -1; >> >> - hdr = (struct virtio_net_hdr *)((uintptr_t)desc_addr); >> - rte_prefetch0(hdr); >> + hdr = (struct virtio_net_hdr *)((uintptr_t)desc_addr); >> + rte_prefetch0(hdr); >> + } >> >> /* >> * A virtio driver normally uses at least 2 desc buffers >> @@ -720,18 +737,24 @@ copy_desc_to_mbuf(struct virtio_net *dev, struct vring_desc *descs, >> if (unlikely(!desc_addr)) >> return -1; >> >> - rte_prefetch0((void *)(uintptr_t)desc_addr); >> - >> desc_offset = 0; >> desc_avail = desc->len; >> nr_desc += 1; >> - >> - PRINT_PACKET(dev, (uintptr_t)desc_addr, desc->len, 0); >> } else { >> + if (!desc_addr) { >> + desc_addr = gpa_to_vva(dev, desc->addr); >> + if (unlikely(!desc_addr)) >> + return -1; >> + } >> + > > I think this piece of code make things a bit complex. I think what you > want to achieve is, besides saving hdr prefetch, to save one call to > gpa_to_vva() for the non-ANY_LAYOUT case. Does that matter too much? > > How about just saving the hdr prefetch? > > if (virtio_net_with_host_offload(dev)) { > hdr = (struct virtio_net_hdr *)((uintptr_t)desc_addr); > rte_prefetch0(hdr); > } Oops, you reply slipped through the cracks... You're right, it doesn't matter too much, the thing to avoid id definitely the hdr prefetch and access. I'm sending a v3 now. Thanks, Maxime