net/virtio: skip device probe in vDPA mode

If we want a virtio device to work in vDPA (vhost data path acceleration)
mode, we could add a "vdpa=1" devarg for this device to specify the mode.

This patch let virtio pmd skip device probe when detecting this parameter.

Signed-off-by: Xiao Wang <xiao.w.wang@intel.com>
Reviewed-by: Maxime Coquelin <maxime.coquelin@redhat.com>
Reviewed-by: Ferruh Yigit <ferruh.yigit@intel.com>
This commit is contained in:
Xiao Wang 2018-04-17 15:06:22 +08:00 committed by Ferruh Yigit
parent ea2dc10668
commit 440f03c253
2 changed files with 56 additions and 0 deletions

View File

@ -318,3 +318,16 @@ Here we use l3fwd-power as an example to show how to get started.
$ l3fwd-power -l 0-1 -- -p 1 -P --config="(0,0,1)" \
--no-numa --parse-ptype
Virtio PMD arguments
--------------------
The user can specify below argument in devargs.
#. ``vdpa``:
A virtio device could also be driven by vDPA (vhost data path acceleration)
driver, and works as a HW vhost backend. This argument is used to specify
a virtio device needs to work in vDPA mode.
(Default: 0 (disabled))

View File

@ -28,6 +28,7 @@
#include <rte_eal.h>
#include <rte_dev.h>
#include <rte_cycles.h>
#include <rte_kvargs.h>
#include "virtio_ethdev.h"
#include "virtio_pci.h"
@ -1713,9 +1714,51 @@ eth_virtio_dev_uninit(struct rte_eth_dev *eth_dev)
return 0;
}
static int vdpa_check_handler(__rte_unused const char *key,
const char *value, __rte_unused void *opaque)
{
if (strcmp(value, "1"))
return -1;
return 0;
}
static int
vdpa_mode_selected(struct rte_devargs *devargs)
{
struct rte_kvargs *kvlist;
const char *key = "vdpa";
int ret = 0;
if (devargs == NULL)
return 0;
kvlist = rte_kvargs_parse(devargs->args, NULL);
if (kvlist == NULL)
return 0;
if (!rte_kvargs_count(kvlist, key))
goto exit;
/* vdpa mode selected when there's a key-value pair: vdpa=1 */
if (rte_kvargs_process(kvlist, key,
vdpa_check_handler, NULL) < 0) {
goto exit;
}
ret = 1;
exit:
rte_kvargs_free(kvlist);
return ret;
}
static int eth_virtio_pci_probe(struct rte_pci_driver *pci_drv __rte_unused,
struct rte_pci_device *pci_dev)
{
/* virtio pmd skips probe if device needs to work in vdpa mode */
if (vdpa_mode_selected(pci_dev->device.devargs))
return 1;
return rte_eth_dev_pci_generic_probe(pci_dev, sizeof(struct virtio_hw),
eth_virtio_dev_init);
}