[dpdk-dev] [PATCH v3] net/mlx: add meson build support

Bruce Richardson bruce.richardson at intel.com
Thu Aug 30 16:46:17 CEST 2018


On Wed, Aug 29, 2018 at 03:48:17PM +0200, Nelio Laranjeiro wrote:
> Compile Mellanox drivers when their external dependencies are met.  A
> glue version of the driver can still be requested by using the
> -Denable_driver_mlx_glue=true
> 
> To avoid modifying the whole sources and keep the compatibility with
> current build systems (e.g. make), the mlx{4,5}_autoconf.h is still
> generated by invoking DPDK scripts though meson's run_command() instead
> of using has_types, has_members, ... commands.
> 
> Meson will try to find the required external libraries.  When they are
> not installed system wide, they can be provided though CFLAGS, LDFLAGS
> and LD_LIBRARY_PATH environment variables, example (considering
> RDMA-Core is installed in /tmp/rdma-core):
> 
>  # CLFAGS=-I/tmp/rdma-core/build/include \
>    LDFLAGS=-L/tmp/rdma-core/build/lib \
>    LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
>    meson output
>  # LD_LIBRARY_PATH=/tmp/rdma-core/build/lib \
>    ninja -C output install
> 
> Note: LD_LIBRARY_PATH before ninja is necessary when the meson
> configuration has changed (e.g. meson configure has been called), in
> such situation the LD_LIBRARY_PATH is necessary to invoke the
> autoconfiguration script.
> 
> Signed-off-by: Nelio Laranjeiro <nelio.laranjeiro at 6wind.com>
> 

Couple of minor comments inline below. Otherwise:

Acked-by: Bruce Richardson <bruce.richardson at intel.com>

> ---
> 
> Changes in v3:
> 
> Sanitize the build files:
> - remove enable_driver_mlx{4,5} options,
> - test cflags capabilities before using them,
> - remove old autoconfiguration file,
> - use an array for autoconfiguration and put them in the build directory,
> - use dependencies in shared_library for link arguments.
> 
> Changes in v2:
> 
> - dropped patch https://patches.dpdk.org/patch/43897/
> - remove extra_{cflags,ldflags} as already honored by meson through
> environment variables.
> ---
>  drivers/net/meson.build      |   2 +
>  drivers/net/mlx4/meson.build |  97 +++++++++++++++
>  drivers/net/mlx5/meson.build | 232 +++++++++++++++++++++++++++++++++++
>  meson_options.txt            |   2 +
>  4 files changed, 333 insertions(+)
>  create mode 100644 drivers/net/mlx4/meson.build
>  create mode 100644 drivers/net/mlx5/meson.build
> 
> diff --git a/drivers/net/meson.build b/drivers/net/meson.build
> index 9c28ed4da..c7a2d0e7d 100644
> --- a/drivers/net/meson.build
> +++ b/drivers/net/meson.build
> @@ -18,6 +18,8 @@ drivers = ['af_packet',
>  	'ixgbe',
>  	'kni',
>  	'liquidio',
> +	'mlx4',
> +	'mlx5',
>  	'mvpp2',
>  	'netvsc',
>  	'nfp',
> diff --git a/drivers/net/mlx4/meson.build b/drivers/net/mlx4/meson.build
> new file mode 100644
> index 000000000..6b5460b91
> --- /dev/null
> +++ b/drivers/net/mlx4/meson.build
> @@ -0,0 +1,97 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright 2018 6WIND S.A.
> +# Copyright 2018 Mellanox Technologies, Ltd
> +
> +pmd_dlopen = get_option('enable_driver_mlx_glue')
> +LIB_GLUE_BASE = 'librte_pmd_mlx4_glue.so'
> +LIB_GLUE_VERSION = '18.02.0'
> +LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
> +if pmd_dlopen
> +        dpdk_conf.set('RTE_LIBRTE_MLX4_DLOPEN_DEPS', 1)
> +        cflags += [
> +                '-DMLX4_GLUE="@0@"'.format(LIB_GLUE),
> +                '-DMLX4_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION),
> +        ]
> +endif
> +libs = [
> +        cc.find_library('mnl', required:false),
> +        cc.find_library('mlx4', required:false),
> +        cc.find_library('ibverbs', required:false),
> +]
> +build = true
> +foreach lib:libs
> +        if not lib.found()
> +                build = false
> +        endif
> +endforeach
> +# Compile PMD
> +if build
> +        allow_experimental_apis = true
> +        ext_deps += libs
> +        sources = files(
> +               'mlx4.c',
> +               'mlx4_ethdev.c',
> +               'mlx4_flow.c',
> +               'mlx4_intr.c',
> +               'mlx4_mr.c',
> +               'mlx4_rxq.c',
> +               'mlx4_rxtx.c',
> +               'mlx4_txq.c',
> +               'mlx4_utils.c',
> +        )
> +        if not pmd_dlopen
> +                sources += files('mlx4_glue.c')
> +        endif
> +        cflags_options = [
> +                '-Wall',
> +                '-Wextra',

I believe -Wall is already passed to all meson build commands by default,
but it's presence here doesn't hurt.

> +                '-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
> +        if get_option('buildtype').contains('debug')
> +                cflags += [ '-pedantic', '-UNDEBUG', '-DPEDANTIC' ]
> +        else
> +                cflags += [ '-DNDEBUG', '-UPEDANTIC' ]
> +        endif
> +        # To maintain the compatibility with the make build system
> +        # mlx4_autoconf.h file is still generated.
> +        run_command('rm', '-f', meson.current_build_dir() + '/mlx4_autoconf.h')
> +        r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                        meson.current_build_dir() + '/mlx4_autoconf.h',
> +                        'HAVE_IBV_MLX4_WQE_LSO_SEG',
> +                        'infiniband/mlx4dv.h',
> +                        'type', 'struct mlx4_wqe_lso_seg')
> +        if r.returncode() != 0
> +                error('autoconfiguration fail')
> +        endif
> +endif
> +# Build Glue Library
> +if pmd_dlopen and build
> +        dlopen_name = 'mlx4_glue'
> +        dlopen_lib_name = driver_name_fmt.format(dlopen_name)
> +        dlopen_so_version = LIB_GLUE_VERSION
> +        dlopen_sources = files('mlx4_glue.c')
> +        dlopen_install_dir = [ eal_pmd_path + '-glue' ]
> +        shared_lib = shared_library(
> +               dlopen_lib_name,
> +               dlopen_sources,
> +               include_directories: global_inc,
> +               c_args: cflags,
> +               dependencies: libs,
> +               link_args: [
> +                       '-Wl,-export-dynamic',
> +                       '-Wl,-h, at 0@'.format(LIB_GLUE),
> +                       ],
> +               soversion: dlopen_so_version,
> +               install: true,
> +               install_dir: dlopen_install_dir,
> +        )
> +endif
> diff --git a/drivers/net/mlx5/meson.build b/drivers/net/mlx5/meson.build
> new file mode 100644
> index 000000000..fbca00849
> --- /dev/null
> +++ b/drivers/net/mlx5/meson.build
> @@ -0,0 +1,232 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright 2018 6WIND S.A.
> +# Copyright 2018 Mellanox Technologies, Ltd
> +
> +pmd_dlopen = get_option('enable_driver_mlx_glue')
> +LIB_GLUE_BASE = 'librte_pmd_mlx5_glue.so'
> +LIB_GLUE_VERSION = '18.05.0'
> +LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
> +if pmd_dlopen
> +        dpdk_conf.set('RTE_LIBRTE_MLX5_DLOPEN_DEPS', 1)
> +        cflags += [
> +                '-DMLX5_GLUE="@0@"'.format(LIB_GLUE),
> +                '-DMLX5_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION),
> +        ]
> +endif
> +libs = [
> +        cc.find_library('mnl', required:false),
> +        cc.find_library('mlx5', required:false),
> +        cc.find_library('ibverbs', required:false),
> +]
> +build = true
> +foreach lib:libs
> +        if not lib.found()
> +                build = false
> +        endif
> +endforeach
> +if build
> +        allow_experimental_apis = true
> +        ext_deps += libs
> +        sources = files(
> +                'mlx5.c',
> +                'mlx5_ethdev.c',
> +                'mlx5_flow.c',
> +                'mlx5_mac.c',
> +                'mlx5_mr.c',
> +                'mlx5_nl.c',
> +                'mlx5_nl_flow.c',
> +                'mlx5_rss.c',
> +                'mlx5_rxmode.c',
> +                'mlx5_rxq.c',
> +                'mlx5_rxtx.c',
> +                'mlx5_socket.c',
> +                'mlx5_stats.c',
> +                'mlx5_trigger.c',
> +                'mlx5_txq.c',
> +                'mlx5_vlan.c',
> +        )
> +        if dpdk_conf.has('RTE_ARCH_X86_64') or dpdk_conf.has('RTE_ARCH_ARM64')
> +                sources += files('mlx5_rxtx_vec.c')
> +        endif
> +        if not pmd_dlopen
> +                sources += files('mlx5_glue.c')
> +        endif
> +        cflags_options = [
> +                '-Wall',
> +                '-Wextra',
> +                '-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
> +        if get_option('buildtype').contains('debug')
> +                cflags += [ '-pedantic', '-UNDEBUG', '-DPEDANTIC' ]
> +        else
> +                cflags += [ '-DNDEBUG', '-UPEDANTIC' ]
> +        endif
> +        # To maintain the compatibility with the make build system
> +        # mlx5_autoconf.h file is still generated.
> +        args = [
> +                [ 'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX' ],
> +                [ 'HAVE_IBV_DEVICE_TUNNEL_SUPPORT', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS' ],
> +                [ 'HAVE_IBV_DEVICE_MPLS_SUPPORT', 'infiniband/verbs.h',
> +                  'enum', 'IBV_FLOW_SPEC_MPLS' ],
> +                [ 'HAVE_IBV_WQ_FLAG_RX_END_PADDING', 'infiniband/verbs.h',
> +                  'enum', 'IBV_WQ_FLAG_RX_END_PADDING' ],
> +                [ 'HAVE_IBV_MLX5_MOD_SWP', 'infiniband/mlx5dv.h', 'type',
> +                  'struct mlx5dv_sw_parsing_caps' ],
> +                [ 'HAVE_IBV_MLX5_MOD_MPW', 'infiniband/mlx5dv.h', 'enum',
> +                  'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED' ],
> +                [ 'HAVE_IBV_MLX5_MOD_CQE_128B_COMP', 'infiniband/mlx5dv.h',
> +                  'enum', 'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP' ],
> +                [ 'HAVE_ETHTOOL_LINK_MODE_25G',
> +                  '/usr/include/linux/ethtool.h', 'enum',
> +                  'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT' ],
> +                [ 'HAVE_ETHTOOL_LINK_MODE_50G',
> +                  '/usr/include/linux/ethtool.h', 'enum',
> +                  'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT' ],
> +                [ 'HAVE_ETHTOOL_LINK_MODE_100G',
> +                  '/usr/include/linux/ethtool.h', 'enum',
> +                  'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT' ],
> +                [ 'HAVE_IBV_DEVICE_COUNTERS_SET_SUPPORT',
> +                  'infiniband/verbs.h', 'type',
> +                  'struct ibv_counter_set_init_attr' ],
> +                [ 'HAVE_RDMA_NL_NLDEV', 'rdma/rdma_netlink.h', 'enum',
> +                  'RDMA_NL_NLDEV' ],
> +                [ 'HAVE_RDMA_NLDEV_CMD_GET', 'rdma/rdma_netlink.h', 'enum',
> +                  'RDMA_NLDEV_CMD_GET' ],
> +                [ 'HAVE_RDMA_NLDEV_CMD_PORT_GET', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_CMD_PORT_GET' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_DEV_INDEX' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_DEV_NAME', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_DEV_NAME' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_PORT_INDEX' ],
> +                [ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
> +                  'enum', 'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
> +                [ 'HAVE_IFLA_PHYS_SWITCH_ID', 'linux/if_link.h', 'enum',
> +                  'IFLA_PHYS_SWITCH_ID' ],
> +                [ 'HAVE_IFLA_PHYS_PORT_NAME', 'linux/if_link.h', 'enum',
> +                  'IFLA_PHYS_PORT_NAME' ],
> +                [ 'HAVE_TCA_FLOWER_ACT', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_ACT' ],
> +                [ 'HAVE_TCA_FLOWER_FLAGS', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_FLAGS' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_TYPE', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_ETH_TYPE' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_ETH_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_ETH_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_ETH_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IP_PROTO', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_IP_PROTO' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_IPV4_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV4_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_IPV4_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV4_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_IPV6_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV6_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_IPV6_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_IPV6_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_TCP_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_TCP_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_TCP_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_TCP_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_TCP_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_UDP_SRC' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_UDP_SRC_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_UDP_DST' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_UDP_DST_MASK', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_UDP_DST_MASK' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ID', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_VLAN_ID' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_PRIO', 'linux/pkt_cls.h', 'enum',
> +                  'TCA_FLOWER_KEY_VLAN_PRIO' ],
> +                [ 'HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE', 'linux/pkt_cls.h',
> +                  'enum', 'TCA_FLOWER_KEY_VLAN_ETH_TYPE' ],
> +                [ 'HAVE_TC_ACT_VLAN', 'linux/tc_act/tc_vlan.h', 'enum',
> +                  'TCA_VLAN_PUSH_VLAN_PRIORITY' ],
> +                [ 'HAVE_SUPPORTED_40000baseKR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_40000baseKR4_Full' ],
> +                [ 'HAVE_SUPPORTED_40000baseCR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_40000baseCR4_Full' ],
> +                [ 'HAVE_SUPPORTED_40000baseSR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_40000baseSR4_Full' ],
> +                [ 'HAVE_SUPPORTED_40000baseLR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_40000baseLR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseKR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_56000baseKR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseCR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_56000baseCR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseSR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_56000baseSR4_Full' ],
> +                [ 'HAVE_SUPPORTED_56000baseLR4_Full',
> +                  '/usr/include/linux/ethtool.h', 'define',
> +                  'SUPPORTED_56000baseLR4_Full' ],
> +        ]
> +        run_command('rm', '-f', meson.current_build_dir() + '/mlx5_autoconf.h')
> +        foreach arg:args
> +                r = run_command('sh', '../../../buildtools/auto-config-h.sh',
> +                                meson.current_build_dir() +
> +                                '/mlx5_autoconf.h', arg)
> +                if r.returncode() != 0
> +                        error('autoconfiguration fail')
> +                endif
> +        endforeach

Having it as a loop doesn't really help much, does it! :-) The array is
still pretty ugly. You could probably improve the error message to include
the failing arguments to make debug easier, but otherwise it's ok.

> +endif
> +# Build Glue Library
> +if pmd_dlopen and build
> +        dlopen_name = 'mlx5_glue'
> +        dlopen_lib_name = driver_name_fmt.format(dlopen_name)
> +        dlopen_so_version = LIB_GLUE_VERSION
> +        dlopen_sources = files('mlx5_glue.c')
> +        dlopen_install_dir = [ eal_pmd_path + '-glue' ]
> +        shared_lib = shared_library(
> +                dlopen_lib_name,
> +                dlopen_sources,
> +                include_directories: global_inc,
> +                c_args: cflags,
> +                dependencies: libs,
> +                link_args: [
> +                        '-Wl,-export-dynamic',
> +                        '-Wl,-h, at 0@'.format(LIB_GLUE),
> +                        ],
> +                soversion: dlopen_so_version,
> +                install: true,
> +                install_dir: dlopen_install_dir,
> +        )
> +endif
> diff --git a/meson_options.txt b/meson_options.txt
> index c84327858..583ce3249 100644
> --- a/meson_options.txt
> +++ b/meson_options.txt
> @@ -1,5 +1,7 @@
>  option('allow_invalid_socket_id', type: 'boolean', value: false,
>  	description: 'allow out-of-range NUMA socket id\'s for platforms that don\'t report the value correctly')
> +option('enable_driver_mlx_glue', type: 'boolean', value: false,
> +	description: 'Enable Mellanox PMD for ConnectX-3/4/5 NIC glue library')

I think the description might be better as:
"Enable glue library for Mellanox ConnectX-3/4/5 NIC PMD".
Having the glue library at the end doesn't read well, IMHO

>  option('enable_kmods', type: 'boolean', value: true,
>  	description: 'build kernel modules')
>  option('examples', type: 'string', value: '',
> -- 
> 2.18.0
> 


More information about the dev mailing list