[dpdk-dev] [PATCH v7 2/2] vhost: Add VHOST PMD
Tetsuya Mukawa
mukawa at igel.co.jp
Fri Feb 5 07:28:37 CET 2016
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.
>> + 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