[dpdk-dev] [PATCH v7 2/2] vhost: Add VHOST PMD

Tetsuya Mukawa mukawa at igel.co.jp
Tue Feb 9 02:54:50 CET 2016


On 2016/02/08 18:42, Ferruh Yigit wrote:
> On Fri, Feb 05, 2016 at 03:28:37PM +0900, Tetsuya Mukawa wrote:
>> On 2016/02/04 20:17, Ferruh Yigit wrote:
>>> On Thu, Feb 04, 2016 at 04:26:31PM +0900, Tetsuya Mukawa wrote:
>>>
>>> Hi Tetsuya,
>>>
>>>> The patch introduces a new PMD. This PMD is implemented as thin wrapper
>>>> of librte_vhost. It means librte_vhost is also needed to compile the PMD.
>>>> The vhost messages will be handled only when a port is started. So start
>>>> a port first, then invoke QEMU.
>>>>
>>>> The PMD has 2 parameters.
>>>>  - iface:  The parameter is used to specify a path to connect to a
>>>>            virtio-net device.
>>>>  - queues: The parameter is used to specify the number of the queues
>>>>            virtio-net device has.
>>>>            (Default: 1)
>>>>
>>>> Here is an example.
>>>> $ ./testpmd -c f -n 4 --vdev 'eth_vhost0,iface=/tmp/sock0,queues=1' -- -i
>>>>
>>>> To connect above testpmd, here is qemu command example.
>>>>
>>>> $ qemu-system-x86_64 \
>>>>         <snip>
>>>>         -chardev socket,id=chr0,path=/tmp/sock0 \
>>>>         -netdev vhost-user,id=net0,chardev=chr0,vhostforce,queues=1 \
>>>>         -device virtio-net-pci,netdev=net0,mq=on
>>>>
>>>> Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp>
>>> Please find some more comments, mostly minor nits,
>>>
>>> please feel free to add my ack for next version of this patch:
>>> Acked-by: Ferruh Yigit <ferruh.yigit at intel.com>
>>>
>>> <...>
>>>> diff --git a/drivers/net/vhost/rte_eth_vhost.c b/drivers/net/vhost/rte_eth_vhost.c
>>>> new file mode 100644
>>>> index 0000000..b2305c2
>>>> --- /dev/null
>>>> +++ b/drivers/net/vhost/rte_eth_vhost.c
>>> <...>
>>>> +
>>>> +struct pmd_internal {
>>>> +	TAILQ_ENTRY(pmd_internal) next;
>>>> +	char *dev_name;
>>>> +	char *iface_name;
>>>> +	uint8_t port_id;
>>> You can also get rid of port_id too, if you keep list of rte_eth_dev.
>>> But this is not so important, keep as it is if you want to.
>> Thank you so much for checking and good suggestions.
>> I will follow your comments without below.
>>
>>>> +
>>>> +	volatile uint16_t once;
>>>> +};
>>>> +
>>> <...>
>>>> +
>>>> +static int
>>>> +new_device(struct virtio_net *dev)
>>>> +{
>>> <...>
>>>> +
>>>> +	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
>>>> +		vq = eth_dev->data->rx_queues[i];
>>>> +		if (vq == NULL)
>>> can vq be NULL? It is allocated in rx/tx_queue_setup() and there is already a NULL check there?
>> I doubt user may not setup all queues.
>> In this case, we need above checking.
>>
>>>> +			continue;
>>>> +		vq->device = dev;
>>>> +		vq->internal = internal;
>>>> +		rte_vhost_enable_guest_notification(dev, vq->virtqueue_id, 0);
>>>> +	}
>>>> +	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
>>>> +		vq = eth_dev->data->tx_queues[i];
>>>> +		if (vq == NULL)
>>>> +			continue;
>> Same here.
>>
>>>> +		vq->device = dev;
>>>> +		vq->internal = internal;
>>>> +		rte_vhost_enable_guest_notification(dev, vq->virtqueue_id, 0);
>>>> +	}
>>>> +
>>>> +	dev->flags |= VIRTIO_DEV_RUNNING;
>>>> +	dev->priv = eth_dev;
>>>> +	eth_dev->data->dev_link.link_status = 1;
>>>> +
>>>> +	for (i = 0; i < eth_dev->data->nb_rx_queues; i++) {
>>>> +		vq = eth_dev->data->rx_queues[i];
>>>> +		if (vq == NULL)
>>>> +			continue;
>> But we can remove this.
> If in above loop, vq can be NULL because user not setup the queue, it will be NULL in here too, isn't it?
> Why we can remove NULL check here?

Yes, you are right.
Will fix it and submit again.

Thanks,
Tetsuya


>>>> +		rte_atomic32_set(&vq->allow_queuing, 1);
>>>> +	}
>>>> +	for (i = 0; i < eth_dev->data->nb_tx_queues; i++) {
>>>> +		vq = eth_dev->data->tx_queues[i];
>>>> +		if (vq == NULL)
>>>> +			continue;
>> And this.
>>
>>> <...>
>>>> +		if (dev->data->rx_queues[i] == NULL)
>>>> +			continue;
>>>> +		vq = dev->data->rx_queues[i];
>>>> +		stats->q_ipackets[i] = vq->rx_pkts;
>>>> +		rx_total += stats->q_ipackets[i];
>>>> +
>>>> +		stats->q_ibytes[i] = vq->rx_bytes;
>>>> +		rx_total_bytes += stats->q_ibytes[i];
>>>> +	}
>>>> +
>>>> +	for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&
>>>> +	     i < dev->data->nb_tx_queues; i++) {
>>>> +		if (dev->data->tx_queues[i] == NULL)
>>> more queue NULL check here, I am not sure if these are necessary
>> Same here, in the case user doesn't setup all queues, I will leave this.
>>
>> Anyway, I will fix below code.
>>  - Manage ether devices list instead of internal structures list.
>>  - Remove needless NULL checking.
>>  - Replace "pthread_exit" to "return NULL".
>>  - Replace rte_panic to RTE_LOG, also add error handling.
>>  - Remove duplicated lines.
>>  - Remove needless casting.
>>  - Follow coding style.
>>  - Remove needless parenthesis.
>>
>> And leave below.
>>  - some NULL checking before accessing a queue.
>>
>> Tetsuya



More information about the dev mailing list