On 2015/09/24 2:47, Loftus, Ciara wrote:
>> 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 PMD can have 'iface' parameter like below to specify a path to connect
>> to a virtio-net device.
>>
>> $ ./testpmd -c f -n 4 --vdev 'eth_vhost0,iface=/tmp/sock0' -- -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 \
>>         -device virtio-net-pci,netdev=net0
>>
>> Signed-off-by: Tetsuya Mukawa <mukawa at igel.co.jp>
>> ---
>>  config/common_linuxapp                      |   6 +
>>  drivers/net/Makefile                        |   4 +
>>  drivers/net/vhost/Makefile                  |  61 +++
>>  drivers/net/vhost/rte_eth_vhost.c           | 640
>> ++++++++++++++++++++++++++++
>>  drivers/net/vhost/rte_pmd_vhost_version.map |   4 +
>>  mk/rte.app.mk                               |   8 +-
>>  6 files changed, 722 insertions(+), 1 deletion(-)
>>  create mode 100644 drivers/net/vhost/Makefile
>>  create mode 100644 drivers/net/vhost/rte_eth_vhost.c
>>  create mode 100644 drivers/net/vhost/rte_pmd_vhost_version.map
>>
>> +struct pmd_internal {
>> +    TAILQ_ENTRY(pmd_internal) next;
>> +    char *dev_name;
>> +    char *iface_name;
>> +    unsigned nb_rx_queues;
>> +    unsigned nb_tx_queues;
>> +    rte_atomic16_t xfer;
> Is this flag just used to indicate the state of the virtio_net device?
> Ie. if =0 then virtio_dev=NULL and if =1 then virtio_net !=NULL & the 
> VIRTIO_DEV_RUNNING flag is set?

Hi Clara,

I am sorry for very late reply.

Yes, it is. Probably we can optimize it more.
I will change this implementation a bit in next patches.
Could you please check it?

>> +
>> +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(r->internal == NULL))
>> +            return 0;
>> +
>> +    if (unlikely(rte_atomic16_read(&r->internal->xfer) == 0))
>> +            return 0;
>> +
>> +    rte_atomic16_set(&r->tx_executing, 1);
>> +
>> +    if (unlikely(rte_atomic16_read(&r->internal->xfer) == 0))
>> +            goto out;
>> +
>> +    nb_tx = (uint16_t)rte_vhost_enqueue_burst(r->device,
>> +                    VIRTIO_RXQ, bufs, nb_bufs);
>> +
>> +    rte_atomic64_add(&(r->tx_pkts), nb_tx);
>> +    rte_atomic64_add(&(r->err_pkts), nb_bufs - nb_tx);
>> +
>> +    for (i = 0; likely(i < nb_tx); i++)
>> +            rte_pktmbuf_free(bufs[i]);
> We may not always want to free these mbufs. For example, if a call is made to 
> rte_eth_tx_burst with buffers from another (non DPDK) source, they may not be 
> ours to free.

Sorry, I am not sure what type of buffer you want to transfer.

This is a PMD that wraps librte_vhost.
And I guess other PMDs cannot handle buffers from another non DPDK source.
Should we take care such buffers?

I have also checked af_packet PMD.
It seems the tx function of af_packet PMD just frees mbuf.

>> +
>> +
>> +    eth_dev = rte_eth_dev_allocated(internal->dev_name);
>> +    if (eth_dev == NULL) {
>> +            RTE_LOG(INFO, PMD, "failuer to find ethdev\n");
> Typo: Failure. Same for the destroy_device function

Thanks, I will fix it in next patches.

>> +            return -1;
>> +    }
>> +
>> +    internal = eth_dev->data->dev_private;
>> +
>> +    for (i = 0; i < internal->nb_rx_queues; i++) {
>> +            vq = &internal->rx_vhost_queues[i];
>> +            vq->device = dev;
>> +            vq->internal = internal;
>> +    }
>> +    for (i = 0; i < internal->nb_tx_queues; i++) {
>> +            vq = &internal->tx_vhost_queues[i];
>> +            vq->device = dev;
>> +            vq->internal = internal;
>> +    }
>> +
>> +    dev->flags |= VIRTIO_DEV_RUNNING;
>> +    dev->priv = eth_dev;
>> +
>> +    eth_dev->data->dev_link.link_status = 1;
>> +    rte_atomic16_set(&internal->xfer, 1);
>> +
>> +    RTE_LOG(INFO, PMD, "New connection established\n");
>> +
>> +    return 0;
> Some freedom is taken away if the new_device and destroy_device callbacks are 
> implemented in the driver.
> For example if one wishes to  call the rte_vhost_enable_guest_notification 
> function when a new device is brought up. They cannot now as there is no 
> scope to modify these callbacks, as is done in for example the vHost sample 
> app. Is this correct?

So how about adding one more parameter to be able to choose guest
notification behavior?

ex)
./testpmd --vdev 'eth_vhost0,iface=/tmp/sock0,guest_notification=0'

In above case, all queues in this device will have VRING_USED_F_NO_NOTIFY.

Thanks,
Tetsuya

Reply via email to