[dpdk-dev] [PATCH v2 0/5] Introduce virtual PMD for Hyper-V/Azure platforms

Adrien Mazarguil adrien.mazarguil at 6wind.com
Fri Dec 22 19:01:28 CET 2017


Virtual machines hosted by Hyper-V/Azure platforms are fitted with
simplified virtual network devices named NetVSC that are used for fast
communication between VM to VM, VM to hypervisor, and the outside.

They appear as standard system netdevices to user-land applications, the
main difference being they are implemented on top of VMBUS [1] instead of
emulated PCI devices.

While this reads like a case for a standard DPDK PMD, there is more to it.

To accelerate outside communication, NetVSC devices as they appear in a VM
can be paired with physical SR-IOV virtual function (VF) devices owned by
that same VM [2]. Both netdevices share the same MAC address in that case.

When paired, egress and most of the ingress traffic flow through the VF
device, while part of it (e.g. multicasts, hypervisor control data) still
flows through NetVSC. Moreover VF devices are not retained and disappear
during VM migration; from a VM standpoint, they can be hot-plugged anytime
with NetVSC acting as a fallback.

Running DPDK applications in such a context involves driving VF devices
using their dedicated PMDs in a vendor-independent fashion (to benefit from
maximum performance without writing dedicated code) while simultaneously
listening to NetVSC and handling the related hot-plug events.

This new virtual PMD (referred to as "vdev_netvsc" from this point on)
automatically coordinates the Hyper-V/Azure-specific management part
described above by relying on vendor-specific, failsafe and tap PMDs to
expose a single consolidated Ethernet device usable directly by existing
applications.

         .------------------.
         | DPDK application |
         `--------+---------'
                  |
           .------+------.
           | DPDK ethdev |
           `------+------'       Control
                  |                 |
     .------------+------------.    v    .-----------------.
     |       failsafe PMD      +---------+ vdev_netvsc PMD |
     `--+-------------------+--'         `-----------------'
        |                   |
        |          .........|.........
        |          :        |        :
   .----+----.     :   .----+----.   :
   | tap PMD |     :   | any PMD |   :
   `----+----'     :   `----+----'   : <-- Hot-pluggable
        |          :        |        :
 .------+-------.  :  .-----+-----.  :
 | NetVSC-based |  :  | SR-IOV VF |  :
 |   netdevice  |  :  |   device  |  :
 `--------------'  :  `-----------'  :
                   :.................:

Note this diagram differs from that of the original RFC [3], with
vdev_netvsc no longer acting as a data plane layer.

This initial version of the driver only works in whitelist mode. Users have
to provide the --vdev net_vdev_netvsc EAL option at least once to trigger
it.

Subsequent work will add support for blacklist mode based on automatic
detection of the host environment.

[1] http://dpdk.org/ml/archives/dev/2017-January/054165.html
[2] https://docs.microsoft.com/en-us/windows-hardware/drivers/network/overview-of-hyper-v
[3] http://dpdk.org/ml/archives/dev/2017-November/082339.html

v2 changes:

- Renamed driver from "hyperv" to "vdev_netvsc". This change covers
  documentation and symbols prefix.
- Driver is now tagged EXPERIMENTAL.
- Replaced ether_addr_from_str() with a basic sscanf() call.
- Removed debugging code (memset() poisoning).
- Fixed hyperv_iface_is_netvsc()'s buffer allocation according to comments.
- Removed hyperv_basename().
- Discarded unused variables through __rte_unused.
- Added separate but necessary free() bugfix for failsafe PMD.
- Added file descriptor input support to failsafe PMD.
- Replaced temporary bash execution; failsafe now reads device definitions
  directly through a pipe without an intermediate bash one-liner.
- Expanded DEBUG/INFO/WARN/ERROR() macros as PMD_DRV_LOG().
- Added dynamic log type (pmd.vdev_netvsc).
- Modified initialization code to probe devices immediately during startup.
- Fixed several snprintf() return value checks ("ret >= sizeof(foo)" is more
  appropriate than "ret >= sizeof(foo) - 1").

Adrien Mazarguil (5):
  net/failsafe: fix invalid free
  net/failsafe: add "fd" parameter
  net/vdev_netvsc: introduce Hyper-V platform driver
  net/vdev_netvsc: implement core functionality
  net/vdev_netvsc: add "force" parameter

 MAINTAINERS                                     |   6 +
 config/common_base                              |   5 +
 config/common_linuxapp                          |   1 +
 doc/guides/nics/fail_safe.rst                   |   9 +
 doc/guides/nics/features/vdev_netvsc.ini        |  12 +
 doc/guides/nics/index.rst                       |   1 +
 doc/guides/nics/vdev_netvsc.rst                 | 116 +++
 drivers/net/Makefile                            |   1 +
 drivers/net/failsafe/failsafe_args.c            |  88 ++-
 drivers/net/failsafe/failsafe_private.h         |   3 +
 drivers/net/vdev_netvsc/Makefile                |  58 ++
 .../vdev_netvsc/rte_pmd_vdev_netvsc_version.map |   4 +
 drivers/net/vdev_netvsc/vdev_netvsc.c           | 722 +++++++++++++++++++
 mk/rte.app.mk                                   |   1 +
 14 files changed, 1025 insertions(+), 2 deletions(-)
 create mode 100644 doc/guides/nics/features/vdev_netvsc.ini
 create mode 100644 doc/guides/nics/vdev_netvsc.rst
 create mode 100644 drivers/net/vdev_netvsc/Makefile
 create mode 100644 drivers/net/vdev_netvsc/rte_pmd_vdev_netvsc_version.map
 create mode 100644 drivers/net/vdev_netvsc/vdev_netvsc.c

-- 
2.11.0


More information about the dev mailing list