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

Reply via email to