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