[dpdk-dev] [PATCH v2 1/7] vhost: refactor rte_vhost_dequeue_burst

Yuanhan Liu yuanhan.liu at linux.intel.com
Mon Mar 7 03:48:38 CET 2016


On Mon, Mar 07, 2016 at 02:32:46AM +0000, Xie, Huawei wrote:
> On 3/4/2016 10:15 AM, Yuanhan Liu wrote:
> > 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?
> 
> Prefer to favor the path that packet could fit in one mbuf.

Hmmm, why? While I know that TSO and mergeable buf is disable by default
in our vhost example vhost-switch, they are enabled by default in real
life.

> Btw, not specially to this, return "m = copy_desc_to_mbuf(dev, vq,
> desc_indexes[i], mbuf_pool)", failure case is unlikely to happen, so add
> unlikely for the check if (m == NULL) there. Please check all branches
> elsewhere.

Thanks for the remind, will have a detail check.

	--yliu


More information about the dev mailing list