Hi,

> -----Original Message-----
> From: Parav Pandit <pa...@mellanox.com>
> Sent: Friday, July 17, 2020 4:49 PM
> To: dev@dpdk.org; gr...@u256.net; ferruh.yi...@intel.com; Thomas
> Monjalon <tho...@monjalon.net>
> Cc: Raslan Darawsheh <rasl...@mellanox.com>; Ori Kam
> <or...@mellanox.com>; Matan Azrad <ma...@mellanox.com>;
> joyce.k...@arm.com; Parav Pandit <pa...@mellanox.com>
> Subject: [PATCH v7 0/9] Improve mlx5 PMD driver framework for multiple
> classes
> 
> This series introduces mlx5 bus to support multiple class of devices
> for a single PCI device.
> 
> Motivation and example
> ----------------------
> mlx5 PCI device supports multiple class of devices such as net, vdpa
> and regex devices.
> 
> Currently only one pmd (either net or vdpa) can bind to this device.
> This design limits use of PCI device only for single device class.
> 
> To support multiple classes simultaneously for a mlx5 PCI device,
> a new mlx5 PCI bus is created. This bus allows binding multiple
> class drivers (such as net, vdpa, regex(future)) to bind to the
> mlx5 PCI bus driver.
> 
> Change description
> ------------------
> Patch-1 Introduces RTE_BIT() macro
> Patch-2 Introduces new RTE constructor priority for common
> initialization
> Patch-3 Fixes compilation error
> Patch-4 Define mlx5 class as bit fields
> Patch-5 Uses new RTE common priority
> Patch-6 Adds mlx5 PCI bus
> Patch-7 Implements a mlx5 PCI bus driver
> Patch-8 Migrates mlx5 net and vdpa driver to use mlx5 PCI bus
> API instead of rte PCI bus API
> Patch-9 Removed class check code as its already part of the bus now
> 
> Design overview
> ---------------
> 
>  -----------    ------------    -------------
>  |   mlx5  |    |   mlx5   |    |   mlx5    |
>  | net pmd |    | vdpa pmd |    | regex pmd |
>  -----------    ------------    -------------
>       \              |                /
>        \             |               /
>         \       -------------       /
>          \______|   mlx5    |_____ /
>                 |   pci bus |
>                 -------------
>                      |
>                  -----------
>                  |   mlx5  |
>                  | pci dev |
>                  -----------
> 
> - mlx5 pci bus driver binds to mlx5 PCI devices defined by PCI
>   ID table of all related mlx5 PCI devices.
> - mlx5 class driver such as net, vdpa, regex PMD defines its
>   specific PCI ID table and mlx5 bus driver probes matching
>   class drivers.
> - mlx5 pci bus driver is cental place that validates supported
>   class combinations.
> - In future as code evolves, more device setup/cleanup and
>   resource creation code moves to mlx5 PCI bus driver.
> 
> Alternatives considered
> -----------------------
> 1. Instead of creating mlx5 pci bus, a common driver is
> implemented which exposes class registration API.
> However, bus model fits better with existing DPDK design
> similar to ifpga driver.
> Class registration API need to create a new callbacks
> and ID signature; instead it is better to utilize current
> well defined methods.
> 
> 2. Enhance pci core to allow multiple driver binding to
> single rte PCI device.
> This approach is not taken, because peer drivers using
> one PCI device won't be aware of other's presence. This
> requires cross-driver syncronization of who initializes
> common resources (such as irq, eq and more).
> This also requires refcounting common objects etc among
> peer drivers.
> Instead of layered approach delivers and allows putting
> common resource sharing, setup code in common bus driver.
> It also eliminates peer blind zone problem as bottom pci
> bus layer provides necessary setup without any reference
> counting.
> 
> 3. In future mlx5 prefers to use RDMA MR cache of the mbuf
> used between net and regex pmd so that same mbuf use across
> multiple device can be possible.
> 
> Examples:
> --------
> A user who wish to use a specific class(es) provides list
> of classes at command line such as,
> ./testpmd -w <PCI BDF>,class=net:vdpa
> ./testpmd -w <PCI BDF>,class=vdpa
> 
> In future,
> ./testpmd -w <PCI BDF>,class=net:regex
> 
> Changelog:
> v6->v7:
>  - Updated release notes
> v5->v6:
>  - Fixed compilation failure in parallel build for shared lib
> v4->v5:
>  - Squash the maintainers update path with other patch which adds the
>    bus
>  - Addressed comments from Morten Brørup
>  - Renamed newly added macro to RTE_BIT64
>  - Added doxygen comment section for the macro
> v3->v4:
>  - Fixed dma_map error unwinding flow to follow same order for unmap
> v2->v3:
>  - Added RTE priority for common driver initialization
>  - Addressed comments from Thomas and Asaf
>  - Fixed compilation error in glue wrapper
>  - Moved pci_driver structure instance as first in driver
>  - Removed white spaces at the end of line in diagram
>  - Address commnts from Matan
>  - Removed CONFIG_RTE_LIBRTE_MLX5_PCI_BUS from config files
>  - Renamed mlx5_valid_class_combo to mlx5_class_combinations
>  - Added cross check for class drivers to support only 3 flags for now
>  - Added full stop at the end of comment block
>  - Using full names in function names
>  - Added new line before function name in multiple functions
>  - Added example string to parse for multiple classes
>  - Dropped mlx5 prefix from static function
>  - Removed empty lines
>  - Fixed issue to remove multiple classes for a driver
>  - Using define for drv_flags at multiple places
>  - Deriving drv_flags based on the class drivers
>  - Fixed alignment for id_table
>  - Perform dma map on best effort basis for all supported drivers
>  - Dynamically build pci id table
>  - Using PCI to mlx5 device helper routines
> v1->v2:
>  - Addressed most comments from Thomas and Gaetan.
>  - Symbols starting with prefix rte_bus_pci_mlx5 may be
>    confusing as it may appear as it belong to rte_bus_pci module.
>    Hence it is kept as rte_bus_mlx5_pci which matches with other
>    modules as mlx5_vdpa, mlx5_net.
>  - Dropped 2nd patch and replace with new 6th patch.
>  - Avoided new file, added macro to rte_bitops.h
>  - Inheriting ret_pci_driver instead of rte_driver
>  - Added design and description of the mlx5_pci bus
>  - Enhanced driver to honor RTE_PCI_DRV_PROBE_AGAIN drv_flag
>  - Use anonymous structure for class search and code changes around it
>  - Define static for class comination array
>  - Use RTE_DIM to find array size
>  - Added OOM check for strdup()
>  - Renamed copy variable to nstr_orig
>  - Returning negagive error code
>  - Returning directly if match entry found
>  - Use compat condition check
>  - Avoided cutting error message string
>  - Use uint32_t datatype instead of enum mlx5_class
>  - Changed logic to parse device arguments only once during probe()
>  - Added check to fail driver probe if multiple classes register with
>    DMA ops
>  - Renamed function to parse_class_options
>  - Migreate API from rte_driver to rte_pci_driver
> 
> Parav Pandit (9):
>   eal: introduce macros for getting value for bit
>   eal: introduce RTE common initialization level
>   common/mlx5: fix empty input style in glue wrappers
>   common/mlx5: change mlx5 class enum values as bits
>   common/mlx5: use common rte priority
>   bus/mlx5_pci: add mlx5 PCI bus
>   bus/mlx5_pci: register a PCI driver
>   bus/mlx5_pci: enable net and vDPA to use mlx5 PCI bus driver
>   common/mlx5: remove class checks from individual driver
> 
>  MAINTAINERS                                   |   5 +
>  doc/guides/rel_notes/release_20_08.rst        |   5 +
>  drivers/bus/Makefile                          |   4 +
>  drivers/bus/meson.build                       |   2 +-
>  drivers/bus/mlx5_pci/Makefile                 |  41 ++
>  drivers/bus/mlx5_pci/meson.build              |  19 +
>  drivers/bus/mlx5_pci/mlx5_pci_bus.c           | 522 ++++++++++++++++++
>  drivers/bus/mlx5_pci/rte_bus_mlx5_pci.h       |  84 +++
>  .../bus/mlx5_pci/rte_bus_mlx5_pci_version.map |   5 +
>  drivers/common/mlx5/linux/mlx5_glue.h         |   4 +-
>  drivers/common/mlx5/mlx5_common.c             |  39 +-
>  drivers/common/mlx5/mlx5_common.h             |   7 +-
>  .../common/mlx5/rte_common_mlx5_version.map   |   2 -
>  drivers/net/mlx5/Makefile                     |   3 +-
>  drivers/net/mlx5/linux/mlx5_os.c              |   6 -
>  drivers/net/mlx5/meson.build                  |   2 +-
>  drivers/net/mlx5/mlx5.c                       |  26 +-
>  drivers/net/mlx5/mlx5.h                       |   1 -
>  drivers/vdpa/mlx5/Makefile                    |   3 +-
>  drivers/vdpa/mlx5/meson.build                 |   2 +-
>  drivers/vdpa/mlx5/mlx5_vdpa.c                 |  30 +-
>  lib/librte_eal/include/rte_bitops.h           |   8 +
>  lib/librte_eal/include/rte_common.h           |   1 +
>  mk/rte.app.mk                                 |   1 +
>  24 files changed, 737 insertions(+), 85 deletions(-)
>  create mode 100644 drivers/bus/mlx5_pci/Makefile
>  create mode 100644 drivers/bus/mlx5_pci/meson.build
>  create mode 100644 drivers/bus/mlx5_pci/mlx5_pci_bus.c
>  create mode 100644 drivers/bus/mlx5_pci/rte_bus_mlx5_pci.h
>  create mode 100644 drivers/bus/mlx5_pci/rte_bus_mlx5_pci_version.map
> 
> --
> 2.26.2

Series applied to next-net-mlx,

Kindest regards,
Raslan Darawsheh

Reply via email to