X-Git-Url: http://git.droids-corp.org/?p=dpdk.git;a=blobdiff_plain;f=lib%2Flibrte_vhost%2Fvirtio_net.c;h=bd9303c8a9f336757898f42cd0ca9a9a5269c547;hp=95a0bc19f804f33a897ae4dc904a9f046c99e6a3;hb=6563cf92380a963f283246e1ca9292fdca66cc57;hpb=570ee25677d8634e99d2120b363f2dd4948d5bac diff --git a/lib/librte_vhost/virtio_net.c b/lib/librte_vhost/virtio_net.c index 95a0bc19f8..bd9303c8a9 100644 --- a/lib/librte_vhost/virtio_net.c +++ b/lib/librte_vhost/virtio_net.c @@ -980,6 +980,7 @@ async_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, struct batch_copy_elem *batch_copy = vq->batch_copy_elems; struct virtio_net_hdr_mrg_rxbuf tmp_hdr, *hdr = NULL; int error = 0; + uint64_t mapped_len; uint32_t tlen = 0; int tvec_idx = 0; @@ -1072,24 +1073,31 @@ async_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, cpy_len = RTE_MIN(buf_avail, mbuf_avail); - if (unlikely(cpy_len >= cpy_threshold)) { - hpa = (void *)(uintptr_t)gpa_to_hpa(dev, - buf_iova + buf_offset, cpy_len); + while (unlikely(cpy_len && cpy_len >= cpy_threshold)) { + hpa = (void *)(uintptr_t)gpa_to_first_hpa(dev, + buf_iova + buf_offset, + cpy_len, &mapped_len); - if (unlikely(!hpa)) { - error = -1; - goto out; - } + if (unlikely(!hpa || mapped_len < cpy_threshold)) + break; async_fill_vec(src_iovec + tvec_idx, (void *)(uintptr_t)rte_pktmbuf_iova_offset(m, - mbuf_offset), cpy_len); + mbuf_offset), (size_t)mapped_len); - async_fill_vec(dst_iovec + tvec_idx, hpa, cpy_len); + async_fill_vec(dst_iovec + tvec_idx, + hpa, (size_t)mapped_len); - tlen += cpy_len; + tlen += (uint32_t)mapped_len; + cpy_len -= (uint32_t)mapped_len; + mbuf_avail -= (uint32_t)mapped_len; + mbuf_offset += (uint32_t)mapped_len; + buf_avail -= (uint32_t)mapped_len; + buf_offset += (uint32_t)mapped_len; tvec_idx++; - } else { + } + + if (likely(cpy_len)) { if (unlikely(vq->batch_copy_nb_elems >= vq->size)) { rte_memcpy( (void *)((uintptr_t)(buf_addr + buf_offset)), @@ -1110,12 +1118,13 @@ async_mbuf_to_desc(struct virtio_net *dev, struct vhost_virtqueue *vq, cpy_len; vq->batch_copy_nb_elems++; } + + mbuf_avail -= cpy_len; + mbuf_offset += cpy_len; + buf_avail -= cpy_len; + buf_offset += cpy_len; } - mbuf_avail -= cpy_len; - mbuf_offset += cpy_len; - buf_avail -= cpy_len; - buf_offset += cpy_len; } out: