On Thu, Mar 03, 2016 at 04:30:42PM +0000, Xie, Huawei wrote: > 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.
Yep, that's also something I have thought of. > Btw, put unlikely before the check of mbuf_avail and checks elsewhere. I don't think so. It would benifit for the small packets. What if, however, when TSO or jumbo frame is enabled that we have big packets? --yliu