From cf9b3c36e5a297200c169dbbf9d6e655d8096948 Mon Sep 17 00:00:00 2001 From: Yuval Avnery Date: Mon, 20 Jul 2020 06:26:05 +0000 Subject: [PATCH] regex/mlx5: introduce driver for BlueField 2 This commit introduce the RegEx poll mode drivers class, and adds Mellanox RegEx PMD. Signed-off-by: Yuval Avnery Signed-off-by: Ori Kam --- .gitignore | 1 + MAINTAINERS | 11 ++ config/common_base | 5 + doc/guides/conf.py | 7 +- doc/guides/index.rst | 1 + doc/guides/regexdevs/features/default.ini | 32 ++++++ doc/guides/regexdevs/features/mlx5.ini | 8 ++ doc/guides/regexdevs/features_overview.rst | 100 ++++++++++++++++++ doc/guides/regexdevs/index.rst | 15 +++ doc/guides/regexdevs/mlx5.rst | 53 ++++++++++ doc/guides/rel_notes/release_20_08.rst | 2 + drivers/Makefile | 2 + drivers/common/Makefile | 2 +- drivers/common/mlx5/Makefile | 4 +- drivers/common/mlx5/mlx5_common.h | 1 + drivers/meson.build | 1 + drivers/regex/Makefile | 8 ++ drivers/regex/meson.build | 7 ++ drivers/regex/mlx5/Makefile | 34 ++++++ drivers/regex/mlx5/meson.build | 26 +++++ drivers/regex/mlx5/mlx5_regex.c | 5 + drivers/regex/mlx5/mlx5_regex.h | 8 ++ .../regex/mlx5/rte_pmd_mlx5_regex_version.map | 3 + mk/rte.app.mk | 5 +- 24 files changed, 335 insertions(+), 6 deletions(-) create mode 100644 doc/guides/regexdevs/features/default.ini create mode 100644 doc/guides/regexdevs/features/mlx5.ini create mode 100644 doc/guides/regexdevs/features_overview.rst create mode 100644 doc/guides/regexdevs/index.rst create mode 100644 doc/guides/regexdevs/mlx5.rst create mode 100644 drivers/regex/Makefile create mode 100644 drivers/regex/meson.build create mode 100644 drivers/regex/mlx5/Makefile create mode 100644 drivers/regex/mlx5/meson.build create mode 100644 drivers/regex/mlx5/mlx5_regex.c create mode 100644 drivers/regex/mlx5/mlx5_regex.h create mode 100644 drivers/regex/mlx5/rte_pmd_mlx5_regex_version.map diff --git a/.gitignore b/.gitignore index f2f8892946..f73d93ca53 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,7 @@ doc/guides/cryptodevs/overview_auth_table.txt doc/guides/cryptodevs/overview_aead_table.txt doc/guides/cryptodevs/overview_asym_table.txt doc/guides/compressdevs/overview_feature_table.txt +doc/guides/regexdevs/overview_feature_table.txt doc/guides/vdpadevs/overview_feature_table.txt doc/guides/bbdevs/overview_feature_table.txt diff --git a/MAINTAINERS b/MAINTAINERS index 3cd402b34c..171c4c78c8 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -454,6 +454,7 @@ RegEx API - EXPERIMENTAL M: Ori Kam F: lib/librte_regexdev/ F: doc/guides/prog_guide/regexdev.rst +F: doc/guides/regexdevs/features/default.ini Eventdev API M: Jerin Jacob @@ -1128,6 +1129,16 @@ F: doc/guides/compressdevs/zlib.rst F: doc/guides/compressdevs/features/zlib.ini +RegEx Drivers +------------- + +Mellanox mlx5 +M: Ori Kam +F: drivers/regex/mlx5/ +F: doc/guides/regexdevs/mlx5.rst +F: doc/guides/regexdevs/features/mlx5.ini + + vDPA Drivers ------------ T: git://dpdk.org/next/dpdk-next-virtio diff --git a/config/common_base b/config/common_base index f7a8824f52..f76585f165 100644 --- a/config/common_base +++ b/config/common_base @@ -374,6 +374,11 @@ CONFIG_RTE_LIBRTE_MLX4_DEBUG=n CONFIG_RTE_LIBRTE_MLX5_PMD=n CONFIG_RTE_LIBRTE_MLX5_DEBUG=n +# +# Compile regex-oriented Mellanox PMD +# +CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD=n + # # Compile vdpa-oriented Mellanox ConnectX-6 & BlueField (MLX5) PMD # diff --git a/doc/guides/conf.py b/doc/guides/conf.py index 700e05e170..d8fe5cccd7 100644 --- a/doc/guides/conf.py +++ b/doc/guides/conf.py @@ -47,7 +47,7 @@ master_doc = 'index' # Maximum feature description string length -feature_str_len = 25 +feature_str_len = 30 # Figures, tables and code-blocks automatically numbered if they have caption numfig = True @@ -409,6 +409,11 @@ def setup(app): 'Features', 'Features availability in compression drivers', 'Feature') + table_file = dirname(__file__) + '/regexdevs/overview_feature_table.txt' + generate_overview_table(table_file, 1, + 'Features', + 'Features availability in regex drivers', + 'Feature') table_file = dirname(__file__) + '/vdpadevs/overview_feature_table.txt' generate_overview_table(table_file, 1, 'Features', diff --git a/doc/guides/index.rst b/doc/guides/index.rst index 988c6ea870..857f0363d3 100644 --- a/doc/guides/index.rst +++ b/doc/guides/index.rst @@ -20,6 +20,7 @@ DPDK documentation cryptodevs/index compressdevs/index vdpadevs/index + regexdevs/index eventdevs/index rawdevs/index mempool/index diff --git a/doc/guides/regexdevs/features/default.ini b/doc/guides/regexdevs/features/default.ini new file mode 100644 index 0000000000..10f6c50847 --- /dev/null +++ b/doc/guides/regexdevs/features/default.ini @@ -0,0 +1,32 @@ +; +; Features of a default RegEx driver. +; +; This file defines the features that are valid for inclusion in +; the other driver files and also the order that they appear in +; the features table in the documentation. The feature description +; string should not exceed feature_str_len defined in conf.py. +; +[Features] +Cross buffer = +PCRE start anchor = +PCRE atomic grouping = +PCRE back reference = +PCRE back tracking ctrl = +PCRE call outs = +PCRE forward reference = +PCRE greedy = +PCRE match all = +PCRE match as end = +PCRE match point rst = +PCRE New line conventions = +PCRE new line SEQ = +PCRE look around = +PCRE possessive qualifiers = +PCRE subroutine references = +PCRE UTF 8 = +PCRE UTF 16 = +PCRE UTF 32 = +PCRE word boundary = +Run time compilation = +Armv8 = +x86 = diff --git a/doc/guides/regexdevs/features/mlx5.ini b/doc/guides/regexdevs/features/mlx5.ini new file mode 100644 index 0000000000..9f1116fcbd --- /dev/null +++ b/doc/guides/regexdevs/features/mlx5.ini @@ -0,0 +1,8 @@ +; +; Supported features of the 'mlx5' RegEx driver. +; +; Refer to default.ini for the full list of available driver features. +; +[Features] +Armv8 = Y +x86 = Y diff --git a/doc/guides/regexdevs/features_overview.rst b/doc/guides/regexdevs/features_overview.rst new file mode 100644 index 0000000000..f90b394801 --- /dev/null +++ b/doc/guides/regexdevs/features_overview.rst @@ -0,0 +1,100 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2020 Mellanox Technologies, Ltd + +Overview of RegEx Drivers Features +================================== + +This section explains the supported features that are listed in the table below. + +Cross buffer + Support cross buffer detection. + +PCRE start anchor + Support PCRE start anchor. + +PCRE atomic grouping + Support PCRE atomic grouping. + +PCRE back reference + Support PCRE back regerence. + +PCRE back tracking ctrl + Support PCRE back tracking ctrl. + +PCRE call outs + Support PCRE call outes. + +PCRE forward reference + Support Forward reference. + +PCRE greedy + Support PCRE greedy mode. + +PCRE match all + Support PCRE match all. + +PCRE match as end + Support match as end. + +PCRE match point rst + Support PCRE match point reset directive. + +PCRE New line conventions + Support new line conventions. + +PCRE new line SEQ + Support new line sequence. + +PCRE look around + Support PCRE look around. + +PCRE possessive qualifiers + Support PCRE possessive qualifiers. + +PCRE subroutine references + Support PCRE subroutine references. + +PCRE UTF 8 + Support UTF-8. + +PCRE UTF 16 + Support UTF-16. + +PCRE UTF 32 + Support UTF-32. + +PCRE word boundary + Support word boundaries. + +Run time compilation + Support compilation during run time. + +Armv8 + Support armv8 (64bit) architecture. + +x86 + Support x86 architecture. + +.. note:: + + Most of the features capabilities should be provided by the drivers via the + RegEx ``info_get`` operation. + + +References +========== + + * `PCRE: PCRE pattern man page `_ + + +Features Table +============== + +.. _table_regex_pmd_features: + +.. include:: overview_feature_table.txt + +.. Note:: + + Features marked with "P" are partially supported. Refer to the appropriate + driver guide in the following sections for details. diff --git a/doc/guides/regexdevs/index.rst b/doc/guides/regexdevs/index.rst new file mode 100644 index 0000000000..49216a9328 --- /dev/null +++ b/doc/guides/regexdevs/index.rst @@ -0,0 +1,15 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2020 Mellanox Technologies, Ltd + +REGEX Device Drivers +==================== + +The following are a list of RegEx (Regular Expression) device drivers, +which can be used from an application through RegEx API. + +.. toctree:: + :maxdepth: 2 + :numbered: + + features_overview + mlx5 diff --git a/doc/guides/regexdevs/mlx5.rst b/doc/guides/regexdevs/mlx5.rst new file mode 100644 index 0000000000..0e6ee8ccfc --- /dev/null +++ b/doc/guides/regexdevs/mlx5.rst @@ -0,0 +1,53 @@ +.. SPDX-License-Identifier: BSD-3-Clause + Copyright 2020 Mellanox Technologies, Ltd + +.. include:: + +MLX5 RegEx driver +================= + +The MLX5 RegEx (Regular Expression) driver library +(**librte_pmd_mlx5_regex**) provides support for **Mellanox BlueField 2** +families of 25/50/100/200 Gb/s adapters. + +Design +------ + +This PMD is configuring the RegEx HW engine. +For the PMD to work, the application must supply +a precompiled rule file in rof2 format. + +The PMD uses libibverbs and libmlx5 to access the device firmware +or directly the hardware components. +There are different levels of objects and bypassing abilities +to get the best performances: + +- Verbs is a complete high-level generic API +- Direct Verbs is a device-specific API +- DevX allows to access firmware objects + +Enabling librte_pmd_mlx5_regex causes DPDK applications to be linked against +libibverbs. + +Mellanox mlx5 pci device can be probed by number of different pci devices, +for example net / vDPA / RegEx. To select the RegEx PMD ``class=regex`` should +be specified as device parameter. The RegEx device can be probed and used with +other Mellanox devices, by adding more options in the class. +For example: ``class=net:regex`` will probe both the net PMD and the RegEx PMD. + +Supported NICs +-------------- + +* Mellanox\ |reg| BlueField 2 SmartNIC + +Prerequisites +------------- + +- BlueField 2 running Mellanox supported kernel. +- Enable the RegEx capabilities using system call from the BlueField 2. +- Official support is not yet released. + +Run-time configuration +~~~~~~~~~~~~~~~~~~~~~~ + +- **ethtool** operations on related kernel interfaces also affect the PMD. diff --git a/doc/guides/rel_notes/release_20_08.rst b/doc/guides/rel_notes/release_20_08.rst index 2c8ac36470..75e05b6d3f 100644 --- a/doc/guides/rel_notes/release_20_08.rst +++ b/doc/guides/rel_notes/release_20_08.rst @@ -81,6 +81,8 @@ New Features Added the RegEx library which provides an API for offload of regular expressions search operations to hardware or software accelerator devices. + Added Mellanox RegEx PMD, allowing to offload RegEx searches. + * **Added eCPRI protocol support in rte_flow.** The ``ECPRI`` item has been added to support eCPRI packet offloading for diff --git a/drivers/Makefile b/drivers/Makefile index c70bdf9ccf..1551272efa 100644 --- a/drivers/Makefile +++ b/drivers/Makefile @@ -18,6 +18,8 @@ DIRS-$(CONFIG_RTE_LIBRTE_PMD_QAT) += common/qat DEPDIRS-common/qat := bus mempool DIRS-$(CONFIG_RTE_LIBRTE_COMPRESSDEV) += compress DEPDIRS-compress := bus mempool +DIRS-$(CONFIG_RTE_LIBRTE_REGEXDEV) += regex +DEPDIRS-regex := common bus DIRS-$(CONFIG_RTE_LIBRTE_VHOST) += vdpa DEPDIRS-vdpa := common bus mempool DIRS-$(CONFIG_RTE_LIBRTE_EVENTDEV) += event diff --git a/drivers/common/Makefile b/drivers/common/Makefile index df2e840cf6..cbc71077cf 100644 --- a/drivers/common/Makefile +++ b/drivers/common/Makefile @@ -36,7 +36,7 @@ ifneq (,$(findstring y,$(IAVF-y))) DIRS-y += iavf endif -ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)),y) +ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD)),y) DIRS-y += mlx5 endif diff --git a/drivers/common/mlx5/Makefile b/drivers/common/mlx5/Makefile index f6c762bf0c..5f12be3f52 100644 --- a/drivers/common/mlx5/Makefile +++ b/drivers/common/mlx5/Makefile @@ -10,7 +10,7 @@ LIB_GLUE_BASE = librte_pmd_mlx5_glue.so LIB_GLUE_VERSION = 20.02.0 # Sources. -ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)),y) +ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD)),y) ifneq ($(CONFIG_RTE_IBVERBS_LINK_DLOPEN),y) SRCS-y += linux/mlx5_glue.c endif @@ -344,7 +344,7 @@ mlx5_autoconf.h: mlx5_autoconf.h.new cmp '$<' '$@' $(AUTOCONF_OUTPUT) || \ mv '$<' '$@' -ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)),y) +ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD)),y) $(SRCS-y:.c=.o): mlx5_autoconf.h endif diff --git a/drivers/common/mlx5/mlx5_common.h b/drivers/common/mlx5/mlx5_common.h index 2851507058..a68e61cbd2 100644 --- a/drivers/common/mlx5/mlx5_common.h +++ b/drivers/common/mlx5/mlx5_common.h @@ -210,6 +210,7 @@ int mlx5_get_ifname_sysfs(const char *ibdev_path, char *ifname); enum mlx5_class { MLX5_CLASS_NET, MLX5_CLASS_VDPA, + MLX5_CLASS_REGEX, MLX5_CLASS_INVALID, }; diff --git a/drivers/meson.build b/drivers/meson.build index 161cfda043..e76ebddfa0 100644 --- a/drivers/meson.build +++ b/drivers/meson.build @@ -9,6 +9,7 @@ dpdk_driver_classes = ['common', 'raw', # depends on common, bus and net. 'crypto', # depends on common, bus and mempool (net in future). 'compress', # depends on common, bus, mempool. + 'regex', # depends on common, bus, regexdev. 'vdpa', # depends on common, bus and mempool. 'event', # depends on common, bus, mempool and net. 'baseband'] # depends on common and bus. diff --git a/drivers/regex/Makefile b/drivers/regex/Makefile new file mode 100644 index 0000000000..906b20546f --- /dev/null +++ b/drivers/regex/Makefile @@ -0,0 +1,8 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2020 Mellanox Technologies, Ltd + +include $(RTE_SDK)/mk/rte.vars.mk + +DIRS-$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD) += mlx5 + +include $(RTE_SDK)/mk/rte.subdir.mk diff --git a/drivers/regex/meson.build b/drivers/regex/meson.build new file mode 100644 index 0000000000..8edeba3a0a --- /dev/null +++ b/drivers/regex/meson.build @@ -0,0 +1,7 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2020 Mellanox Technologies, Ltd + +drivers = ['mlx5'] +std_deps = ['ethdev', 'kvargs'] # 'ethdev' also pulls in mbuf, net, eal etc +config_flag_fmt = 'RTE_LIBRTE_@0@_PMD' +driver_name_fmt = 'rte_pmd_@0@' diff --git a/drivers/regex/mlx5/Makefile b/drivers/regex/mlx5/Makefile new file mode 100644 index 0000000000..d9a1573839 --- /dev/null +++ b/drivers/regex/mlx5/Makefile @@ -0,0 +1,34 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2020 Mellanox Technologies, Ltd + +include $(RTE_SDK)/mk/rte.vars.mk + +# Library name. +LIB = librte_pmd_mlx5_regex.a + +# Sources. +SRCS-$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD) += mlx5_regex.c + +# Basic CFLAGS. +CFLAGS += -O3 +CFLAGS += -std=c11 -Wall -Wextra +CFLAGS += -g +CFLAGS += -I$(RTE_SDK)/drivers/common/mlx5 +CFLAGS += -I$(BUILDDIR)/drivers/common/mlx5 +CFLAGS += -D_BSD_SOURCE +CFLAGS += -D_DEFAULT_SOURCE +CFLAGS += -D_XOPEN_SOURCE=600 +CFLAGS += $(WERROR_FLAGS) +CFLAGS += -Wno-strict-prototypes +LDLIBS += -lrte_common_mlx5 +LDLIBS += -lm +LDLIBS += -lrte_eal -lrte_mbuf -lrte_regexdev +LDLIBS += -lrte_kvargs +LDLIBS += -lrte_bus_pci + +# A few warnings cannot be avoided in external headers. +CFLAGS += -Wno-error=cast-qual + +EXPORT_MAP := rte_pmd_mlx5_regex_version.map + +include $(RTE_SDK)/mk/rte.lib.mk diff --git a/drivers/regex/mlx5/meson.build b/drivers/regex/mlx5/meson.build new file mode 100644 index 0000000000..6ebe6d48fb --- /dev/null +++ b/drivers/regex/mlx5/meson.build @@ -0,0 +1,26 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2020 Mellanox Technologies, Ltd + +if not is_linux + build = false + reason = 'only supported on Linux' + subdir_done() +endif + +fmt_name = 'mlx5_regex' +deps += ['common_mlx5', 'bus_pci', 'eal', 'regexdev'] +sources = files( + 'mlx5_regex.c', +) +cflags_options = [ + '-std=c11', + '-Wno-strict-prototypes', + '-D_BSD_SOURCE', + '-D_DEFAULT_SOURCE', + '-D_XOPEN_SOURCE=600' +] +foreach option:cflags_options + if cc.has_argument(option) + cflags += option + endif +endforeach diff --git a/drivers/regex/mlx5/mlx5_regex.c b/drivers/regex/mlx5/mlx5_regex.c new file mode 100644 index 0000000000..b942a7511d --- /dev/null +++ b/drivers/regex/mlx5/mlx5_regex.c @@ -0,0 +1,5 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 Mellanox Technologies, Ltd + */ + +#include "mlx5_regex.h" diff --git a/drivers/regex/mlx5/mlx5_regex.h b/drivers/regex/mlx5/mlx5_regex.h new file mode 100644 index 0000000000..0e0495c263 --- /dev/null +++ b/drivers/regex/mlx5/mlx5_regex.h @@ -0,0 +1,8 @@ +/* SPDX-License-Identifier: BSD-3-Clause + * Copyright 2020 Mellanox Technologies, Ltd + */ + +#ifndef MLX5_REGEX_H +#define MLX5_REGEX_H + +#endif /* MLX5_REGEX_H */ diff --git a/drivers/regex/mlx5/rte_pmd_mlx5_regex_version.map b/drivers/regex/mlx5/rte_pmd_mlx5_regex_version.map new file mode 100644 index 0000000000..4a76d1d52d --- /dev/null +++ b/drivers/regex/mlx5/rte_pmd_mlx5_regex_version.map @@ -0,0 +1,3 @@ +DPDK_21 { + local: *; +}; diff --git a/mk/rte.app.mk b/mk/rte.app.mk index 0ce8cf5417..1b9551ecf2 100644 --- a/mk/rte.app.mk +++ b/mk/rte.app.mk @@ -201,11 +201,12 @@ endif _LDLIBS-$(CONFIG_RTE_LIBRTE_LIO_PMD) += -lrte_pmd_lio _LDLIBS-$(CONFIG_RTE_LIBRTE_PMD_MEMIF) += -lrte_pmd_memif _LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -lrte_pmd_mlx4 -ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)),y) +ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD)),y) _LDLIBS-y += -lrte_common_mlx5 endif _LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += -lrte_pmd_mlx5 _LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD) += -lrte_pmd_mlx5_vdpa +_LDLIBS-$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD) += -lrte_pmd_mlx5_regex ifeq ($(CONFIG_RTE_IBVERBS_LINK_DLOPEN),y) _LDLIBS-y += -ldl else ifeq ($(CONFIG_RTE_IBVERBS_LINK_STATIC),y) @@ -214,7 +215,7 @@ _LDLIBS-y += --no-whole-archive _LDLIBS-y += $(LIBS_IBVERBS_STATIC) _LDLIBS-y += --whole-archive else -ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)),y) +ifeq ($(findstring y,$(CONFIG_RTE_LIBRTE_MLX5_PMD)$(CONFIG_RTE_LIBRTE_MLX5_VDPA_PMD)$(CONFIG_RTE_LIBRTE_MLX5_REGEX_PMD)),y) _LDLIBS-y += -libverbs -lmlx5 endif _LDLIBS-$(CONFIG_RTE_LIBRTE_MLX4_PMD) += -libverbs -lmlx4