On 2015/11/06 11:22, Yuanhan Liu wrote: > On Mon, Nov 02, 2015 at 12:58:57PM +0900, Tetsuya Mukawa wrote: > ... >> + >> +static uint16_t >> +eth_vhost_rx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) >> +{ >> + struct vhost_queue *r = q; >> + uint16_t nb_rx = 0; >> + >> + if (unlikely(rte_atomic32_read(&r->allow_queuing) == 0)) >> + return 0; >> + >> + rte_atomic32_set(&r->while_queuing, 1); >> + >> + if (unlikely(rte_atomic32_read(&r->allow_queuing) == 0)) >> + goto out; >> + >> + /* Dequeue packets from guest TX queue */ >> + nb_rx = (uint16_t)rte_vhost_dequeue_burst(r->device, >> + VIRTIO_TXQ, r->mb_pool, bufs, nb_bufs); >> + >> + r->rx_pkts += nb_rx; >> + >> +out: >> + rte_atomic32_set(&r->while_queuing, 0); >> + >> + return nb_rx; >> +} >> + >> +static uint16_t >> +eth_vhost_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs) >> +{ >> + struct vhost_queue *r = q; >> + uint16_t i, nb_tx = 0; >> + >> + if (unlikely(rte_atomic32_read(&r->allow_queuing) == 0)) >> + return 0; >> + >> + rte_atomic32_set(&r->while_queuing, 1); >> + >> + if (unlikely(rte_atomic32_read(&r->allow_queuing) == 0)) >> + goto out; >> + >> + /* Enqueue packets to guest RX queue */ >> + nb_tx = (uint16_t)rte_vhost_enqueue_burst(r->device, >> + VIRTIO_RXQ, bufs, nb_bufs); >> + > Michael, I'm wondering here might be the better place to do "automatic > receive steering in multiqueue mode". I mean, as a library function, > queueing/dequeueing packets to/from a specific virt queue is reasonable > to me. It's upto the caller to pick the right queue, doing the queue > steering.
Hi Liu, Oops, I've found a bug here. To support multiple queues in vhost PMD, I needed to store "queue_id" in "vhost_queue" structure. Then, I should call rte_vhost_enqueue_burst() with the value. > As an eth dev, I guess that's the proper place to do things like that. > > Or, I'm thinking we could introduce another vhost function, for not > breaking current API, to do that, returning the right queue, so that > other applications (instead of the vhost pmd only) can use that as well. I may not understand the steering function enough, but If we support the steering function in vhost library or vhost PMD, how can we handle "queue_id" parameter of TX functions? Probably, we need to ignore the value In some cases. This may confuse the users because they cannot observe the packets in their specified queue. So I guess it may be application responsibility to return packets to the correct queue. (But we should write a correct documentation about it) > Tetsuya, just in case you missed the early discussion about automic > receive steering, here is a link: > > http://dpdk.org/ml/archives/dev/2015-October/025779.html > Thanks, I've checked it! Tetsuya