From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by dpdk.org (Postfix) with ESMTP id B90F12B92 for ; Thu, 30 Aug 2018 16:46:27 +0200 (CEST) X-Amp-Result: UNSCANNABLE X-Amp-File-Uploaded: False Received: from fmsmga005.fm.intel.com ([10.253.24.32]) by orsmga104.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Aug 2018 07:46:26 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.53,307,1531810800"; d="scan'208";a="258517701" Received: from bricha3-mobl.ger.corp.intel.com ([10.237.221.107]) by fmsmga005.fm.intel.com with SMTP; 30 Aug 2018 07:46:18 -0700 Received: by (sSMTP sendmail emulation); Thu, 30 Aug 2018 15:46:18 +0100 Date: Thu, 30 Aug 2018 15:46:17 +0100 From: Bruce Richardson To: Nelio Laranjeiro Cc: dev@dpdk.org, Yongseok Koh , Shahaf Shuler , Matan Azrad Message-ID: <20180830144617.GA14552@bricha3-MOBL.ger.corp.intel.com> References: <85a2b398fecdf917dc22810ea0974a91ccca1d13.1535373640.git.nelio.laranjeiro@6wind.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Organization: Intel Research and Development Ireland Ltd. User-Agent: Mutt/1.10.1 (2018-07-13) Subject: Re: [dpdk-dev] [PATCH v3] net/mlx: add meson build support X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 30 Aug 2018 14:46:28 -0000 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 > Couple of minor comments inline below. Otherwise: Acked-by: Bruce Richardson > --- > > 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,@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,@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 >