[ovs-dev] [PATCH v4 3/3] netdev-dpdk: Add support for virtual DPDK PMDs (vdevs)
Daniele Di Proietto
diproiettod at ovn.org
Thu Jan 5 00:27:27 UTC 2017
2017-01-04 7:31 GMT-08:00 Ciara Loftus <ciara.loftus at intel.com>:
> Prior to this commit, the 'dpdk' port type could only be used for
> physical DPDK devices. Now, virtual devices (or 'vdevs') are supported.
> 'vdev' devices are those which use virtual DPDK Poll Mode Drivers eg.
> null, pcap. To add a DPDK vdev, a valid 'dpdk-devargs' must be set for
> the given dpdk port. The format expected is 'eth_<driver_name><x>' where
> 'x' is a number between 0 and RTE_MAX_ETHPORTS -1.
>
> For example to add a port that uses the 'null' DPDK PMD driver:
>
> ovs-vsctl set Interface null0 options:dpdk-devargs=eth_null0
>
> Not all DPDK vdevs have been verified to work at this point in time.
>
> Signed-off-by: Ciara Loftus <ciara.loftus at intel.com>
Thanks, for the new version.
I have a minor suggestion below.
If you want to incorporate the comments on the series and respin I'd
appreciate that. Otherwise I can fix the series before pushing it
Thanks,
Daniele
> ---
> Changelog:
> * Updated process_vdevargs to work with Daniele's incremental in the
> previous patch.
> * Allow vdev detach
> * Update docs to show af_packet example
>
> Documentation/howto/dpdk.rst | 29 +++++++++++++++++++++++++++++
> NEWS | 1 +
> lib/netdev-dpdk.c | 35 +++++++++++------------------------
> vswitchd/vswitch.xml | 9 +++++++--
> 4 files changed, 48 insertions(+), 26 deletions(-)
>
> diff --git a/Documentation/howto/dpdk.rst b/Documentation/howto/dpdk.rst
> index df5db71..fc2f81e 100644
> --- a/Documentation/howto/dpdk.rst
> +++ b/Documentation/howto/dpdk.rst
> @@ -324,6 +324,35 @@ This feature is not supported with VFIO and does not work with some NICs.
> For more information please refer to the `DPDK Port Hotplug Framework
> <http://dpdk.org/doc/guides/prog_guide/port_hotplug_framework.html#hotplug>`__.
>
> +.. _vdev-support:
> +
> +Vdev Support
> +------------
> +
> +DPDK provides drivers for both physical and virtual devices. Physical DPDK
> +devices are added to OVS by specifying a valid PCI address in 'dpdk-devargs'.
> +Virtual DPDK devices which do not have PCI addresses can be added using a
> +different format for 'dpdk-devargs'.
> +
> +Typically, the format expected is 'eth_<driver_name><x>' where 'x' is a
> +number between 0 and RTE_MAX_ETHPORTS -1 (31).
> +
> +For example to add a dpdk port that uses the 'null' DPDK PMD driver:
> +
> + $ ovs-vsctl add-port br0 null0 -- set Interface null0 type=dpdk \
> + options:dpdk-devargs=eth_null0
> +
> +Similarly, to add a dpdk port that uses the 'af_packet' DPDK PMD driver:
> +
> + $ ovs-vsctl add-port br0 af0 -- set Interface af0 type=dpdk \
> + options:dpdk-devargs=eth_af_packet0
How about a real example?
$ ovs-vsctl add-port br0 myeth0 -- set Interface myeth0 type=dpdk \
options:dpdk-devargs=eth_af_packet0,iface=eth0
> +
> +More information on the different types of virtual DPDK PMDs can be found in
> +the `DPDK documentation
> +<http://dpdk.org/doc/guides/nics/overview.html>`__.
> +
> +Note: Not all DPDK virtual PMD drivers have been tested and verified to work.
> +
> .. _dpdk-ovs-in-guest:
>
> OVS with DPDK Inside VMs
> diff --git a/NEWS b/NEWS
> index d66d402..cc319a9 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -53,6 +53,7 @@ Post-v2.6.0
> with the old dpdk<portid> naming scheme is broken, and as such a
> device will not be available for use until a valid dpdk-devargs is
> specified.
> + * Virtual DPDK Poll Mode Driver (vdev PMD) support.
> - Fedora packaging:
> * A package upgrade does not automatically restart OVS service.
> - ovs-vswitchd/ovs-vsctl:
> diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
> index ba4935e..170d01a 100644
> --- a/lib/netdev-dpdk.c
> +++ b/lib/netdev-dpdk.c
> @@ -1134,25 +1134,19 @@ netdev_dpdk_lookup_by_port_id(int port_id)
> static int
> netdev_dpdk_process_devargs(const char *devargs)
> {
> - struct rte_pci_addr addr;
> uint8_t new_port_id = UINT8_MAX;
>
> - if (!eal_parse_pci_DomBDF(devargs, &addr)) {
> - /* Valid PCI address format detected - configure physical device */
> - if (!rte_eth_dev_count()
> - || rte_eth_dev_get_port_by_name(devargs, &new_port_id)
> - || !rte_eth_dev_is_valid_port(new_port_id)) {
> - /* PCI device not found in DPDK, attempt to attach it */
> - if (!rte_eth_dev_attach(devargs, &new_port_id)) {
> - /* Attach successful */
> - VLOG_INFO("Device "PCI_PRI_FMT" has been attached to DPDK",
> - addr.domain, addr.bus, addr.devid, addr.function);
> - } else {
> - /* Attach unsuccessful */
> - VLOG_INFO("Error attaching device "PCI_PRI_FMT" to DPDK",
> - addr.domain, addr.bus, addr.devid, addr.function);
> - return -1;
> - }
> + if (!rte_eth_dev_count()
> + || rte_eth_dev_get_port_by_name(devargs, &new_port_id)
> + || !rte_eth_dev_is_valid_port(new_port_id)) {
> + /* Device not found in DPDK, attempt to attach it */
> + if (!rte_eth_dev_attach(devargs, &new_port_id)) {
> + /* Attach successful */
> + VLOG_INFO("Device '%s' attached to DPDK", devargs);
> + } else {
> + /* Attach unsuccessful */
> + VLOG_INFO("Error attaching device '%s' to DPDK", devargs);
> + return -1;
> }
> }
>
> @@ -2459,17 +2453,10 @@ netdev_dpdk_detach(struct unixctl_conn *conn, int argc OVS_UNUSED,
> char *response;
> uint8_t port_id;
> char devname[RTE_ETH_NAME_MAX_LEN];
> - struct rte_pci_addr addr;
> struct netdev_dpdk *dev;
>
> ovs_mutex_lock(&dpdk_mutex);
>
> - if (eal_parse_pci_DomBDF(argv[1], &addr)) {
> - response = xasprintf("Invalid PCI address '%s'. Cannot detach.",
> - argv[1]);
> - goto error;
> - }
> -
> if (!rte_eth_dev_count() || rte_eth_dev_get_port_by_name(argv[1],
> &port_id)) {
> response = xasprintf("Device '%s' not found in DPDK", argv[1]);
> diff --git a/vswitchd/vswitch.xml b/vswitchd/vswitch.xml
> index c34c295..b899617 100644
> --- a/vswitchd/vswitch.xml
> +++ b/vswitchd/vswitch.xml
> @@ -2306,8 +2306,13 @@
> <column name="options" key="dpdk-devargs"
> type='{"type": "string"}'>
> <p>
> - Specifies the PCI address of a physical dpdk device.
> - Only supported by 'dpdk' devices.
> + Specifies the PCI address associated with the port for physical
> + devices, or the virtual driver to be used for the port when a virtual
> + PMD is intended to be used. For the latter, the argument string
> + typically takes the form of eth_<driver_name><x> where
> + 'driver_name' is a valid virtual DPDK PMD driver name and where 'x'
> + lies in the range of 0 to RTE_MAX_ETHPORTS-1.
> + Only supported by the dpdk port type.
> </p>
> </column>
>
> --
> 2.4.3
>
> _______________________________________________
> dev mailing list
> dev at openvswitch.org
> https://mail.openvswitch.org/mailman/listinfo/ovs-dev
More information about the dev
mailing list