On 2/18/2016 9:48 PM, Yuanhan Liu wrote:
> +     mbuf_avail  = 0;
> +     mbuf_offset = 0;
> +     while (desc_avail || (desc->flags & VRING_DESC_F_NEXT) != 0) {
> +             /* This desc reachs to its end, get the next one */
> +             if (desc_avail == 0) {
> +                     desc = &vq->desc[desc->next];
> +
> +                     desc_addr = gpa_to_vva(dev, desc->addr);
> +                     rte_prefetch0((void *)(uintptr_t)desc_addr);
> +
> +                     desc_offset = 0;
> +                     desc_avail  = desc->len;
> +
> +                     PRINT_PACKET(dev, (uintptr_t)desc_addr, desc->len, 0);
> +             }
> +
> +             /*
> +              * This mbuf reachs to its end, get a new one
> +              * to hold more data.
> +              */
> +             if (mbuf_avail == 0) {
> +                     cur = rte_pktmbuf_alloc(mbuf_pool);
> +                     if (unlikely(!cur)) {
> +                             RTE_LOG(ERR, VHOST_DATA, "Failed to "
> +                                     "allocate memory for mbuf.\n");
> +                             if (head)
> +                                     rte_pktmbuf_free(head);
> +                             return NULL;
> +                     }

We could always allocate the head mbuf before the loop, then we save the
following branch and make the code more streamlined.
It reminds me that this change prevents the possibility of mbuf bulk
allocation, one solution is we pass the head mbuf from an additional
parameter.
Btw, put unlikely before the check of mbuf_avail and checks elsewhere.

> +                     if (!head) {
> +                             head = cur;
> +                     } else {
> +                             prev->next = cur;
> +                             prev->data_len = mbuf_offset;
> +                             head->nb_segs += 1;
> +                     }
> +                     head->pkt_len += mbuf_offset;
> +                     prev = cur;
> +
> +                     mbuf_offset = 0;
> +                     mbuf_avail  = cur->buf_len - RTE_PKTMBUF_HEADROOM;
> +             }
> +
> +             cpy_len = RTE_MIN(desc_avail, mbuf_avail);
> +             rte_memcpy(rte_pktmbuf_mtod_offset(cur, void *, mbuf_offset),
> +                     (void *)((uintptr_t)(desc_addr + desc_offset)),
> +                     cpy_len);
> +
> +             mbuf_avail  -= cpy_len;
> +             mbuf_offset += cpy_len;
> +             desc_avail  -= cpy_len;
> +             desc_offset += cpy_len;
> +     }
> +

Reply via email to