8409a28573
The rdma core library can map doorbell register in two ways,
depending on the environment variable "MLX5_SHUT_UP_BF":
- as regular cached memory, the variable is either missing or
set to zero. This type of mapping may cause the significant
doorbell register writing latency and requires explicit
memory write barrier to mitigate this issue and prevent
write combining.
- as non-cached memory, the variable is present and set to
not "0" value. This type of mapping may cause performance
impact under heavy loading conditions but the explicit write
memory barrier is not required and it may improve core
performance.
The new devarg is introduced "tx_db_nc", if this parameter is
set to zero, the doorbell register is forced to be mapped to
cached memory and requires explicit memory barrier after
writing to. If "tx_db_nc" is set to non-zero value the doorbell
will be mapped as non-cached memory, not requiring the memory
barrier. If "tx_db_nc" is missing the behaviour will be defined
by presence of "MLX5_SHUT_UP_BF" in environment. If variable
is missed the default value zero will be set for ARM64 hosts
and one for others.
In run time the code checks the mapping type and provides the
memory barrier after writing to tx doorbell register if it is
needed. The mapping type is extracted directly from the
uar_mmap_offset field in the queue properties.
Fixes: 18a1c20044
("net/mlx5: implement Tx burst template")
Cc: stable@dpdk.org
Signed-off-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
224 lines
7.3 KiB
Meson
224 lines
7.3 KiB
Meson
# SPDX-License-Identifier: BSD-3-Clause
|
|
# Copyright 2018 6WIND S.A.
|
|
# Copyright 2018 Mellanox Technologies, Ltd
|
|
|
|
if not is_linux
|
|
build = false
|
|
reason = 'only supported on Linux'
|
|
subdir_done()
|
|
endif
|
|
build = true
|
|
|
|
pmd_dlopen = (get_option('ibverbs_link') == 'dlopen')
|
|
LIB_GLUE_BASE = 'librte_pmd_mlx5_glue.so'
|
|
LIB_GLUE_VERSION = '19.08.0'
|
|
LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
|
|
if pmd_dlopen
|
|
dpdk_conf.set('RTE_IBVERBS_LINK_DLOPEN', 1)
|
|
cflags += [
|
|
'-DMLX5_GLUE="@0@"'.format(LIB_GLUE),
|
|
'-DMLX5_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION),
|
|
]
|
|
endif
|
|
|
|
libnames = [ 'mlx5', 'ibverbs' ]
|
|
libs = []
|
|
foreach libname:libnames
|
|
lib = dependency('lib' + libname, required:false)
|
|
if not lib.found()
|
|
lib = cc.find_library(libname, required:false)
|
|
endif
|
|
if lib.found()
|
|
libs += [ lib ]
|
|
else
|
|
build = false
|
|
reason = 'missing dependency, "' + libname + '"'
|
|
endif
|
|
endforeach
|
|
|
|
if build
|
|
allow_experimental_apis = true
|
|
deps += ['hash']
|
|
ext_deps += libs
|
|
sources = files(
|
|
'mlx5.c',
|
|
'mlx5_ethdev.c',
|
|
'mlx5_flow.c',
|
|
'mlx5_flow_meter.c',
|
|
'mlx5_flow_dv.c',
|
|
'mlx5_flow_verbs.c',
|
|
'mlx5_mac.c',
|
|
'mlx5_mr.c',
|
|
'mlx5_nl.c',
|
|
'mlx5_rss.c',
|
|
'mlx5_rxmode.c',
|
|
'mlx5_rxq.c',
|
|
'mlx5_rxtx.c',
|
|
'mlx5_mp.c',
|
|
'mlx5_stats.c',
|
|
'mlx5_trigger.c',
|
|
'mlx5_txq.c',
|
|
'mlx5_vlan.c',
|
|
'mlx5_devx_cmds.c',
|
|
'mlx5_utils.c',
|
|
)
|
|
if (dpdk_conf.has('RTE_ARCH_X86_64')
|
|
or dpdk_conf.has('RTE_ARCH_ARM64')
|
|
or dpdk_conf.has('RTE_ARCH_PPC_64'))
|
|
sources += files('mlx5_rxtx_vec.c')
|
|
endif
|
|
if not pmd_dlopen
|
|
sources += files('mlx5_glue.c')
|
|
endif
|
|
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
|
|
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.
|
|
# input array for meson member search:
|
|
# [ "MACRO to define if found", "header for the search",
|
|
# "symbol to search", "struct member to search" ]
|
|
has_member_args = [
|
|
[ 'HAVE_IBV_MLX5_MOD_SWP', 'infiniband/mlx5dv.h',
|
|
'struct mlx5dv_sw_parsing_caps', 'sw_parsing_offloads' ],
|
|
[ 'HAVE_IBV_DEVICE_COUNTERS_SET_V42', 'infiniband/verbs.h',
|
|
'struct ibv_counter_set_init_attr', 'counter_set_id' ],
|
|
[ 'HAVE_IBV_DEVICE_COUNTERS_SET_V45', 'infiniband/verbs.h',
|
|
'struct ibv_counters_init_attr', 'comp_mask' ],
|
|
]
|
|
# input array for meson symbol search:
|
|
# [ "MACRO to define if found", "header for the search",
|
|
# "symbol to search" ]
|
|
has_sym_args = [
|
|
[ 'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX' ],
|
|
[ 'HAVE_IBV_DEVICE_TUNNEL_SUPPORT', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS' ],
|
|
[ 'HAVE_IBV_MLX5_MOD_MPW', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED' ],
|
|
[ 'HAVE_IBV_MLX5_MOD_CQE_128B_COMP', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP' ],
|
|
[ 'HAVE_IBV_MLX5_MOD_CQE_128B_PAD', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_CQ_INIT_ATTR_FLAGS_CQE_PAD' ],
|
|
[ 'HAVE_IBV_FLOW_DV_SUPPORT', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_create_flow_action_packet_reformat' ],
|
|
[ 'HAVE_IBV_DEVICE_MPLS_SUPPORT', 'infiniband/verbs.h',
|
|
'IBV_FLOW_SPEC_MPLS' ],
|
|
[ 'HAVE_IBV_WQ_FLAGS_PCI_WRITE_END_PADDING', 'infiniband/verbs.h',
|
|
'IBV_WQ_FLAGS_PCI_WRITE_END_PADDING' ],
|
|
[ 'HAVE_IBV_WQ_FLAG_RX_END_PADDING', 'infiniband/verbs.h',
|
|
'IBV_WQ_FLAG_RX_END_PADDING' ],
|
|
[ 'HAVE_MLX5DV_DR_DEVX_PORT', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_query_devx_port' ],
|
|
[ 'HAVE_IBV_DEVX_OBJ', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_devx_obj_create' ],
|
|
[ 'HAVE_IBV_FLOW_DEVX_COUNTERS', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_FLOW_ACTION_COUNTERS_DEVX' ],
|
|
[ 'HAVE_IBV_DEVX_ASYNC', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_devx_obj_query_async' ],
|
|
[ 'HAVE_MLX5DV_DR_ACTION_DEST_DEVX_TIR', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_dr_action_create_dest_devx_tir' ],
|
|
[ 'HAVE_MLX5_DR_CREATE_ACTION_FLOW_METER', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_dr_action_create_flow_meter' ],
|
|
[ 'HAVE_MLX5DV_MMAP_GET_NC_PAGES_CMD', 'infiniband/mlx5dv.h',
|
|
'MLX5_MMAP_GET_NC_PAGES_CMD' ],
|
|
[ 'HAVE_MLX5DV_DR', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_DR_DOMAIN_TYPE_NIC_RX' ],
|
|
[ 'HAVE_MLX5DV_DR_ESWITCH', 'infiniband/mlx5dv.h',
|
|
'MLX5DV_DR_DOMAIN_TYPE_FDB' ],
|
|
[ 'HAVE_MLX5DV_DR_VLAN', 'infiniband/mlx5dv.h',
|
|
'mlx5dv_dr_action_create_push_vlan' ],
|
|
[ 'HAVE_SUPPORTED_40000baseKR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_40000baseKR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_40000baseCR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_40000baseCR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_40000baseSR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_40000baseSR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_40000baseLR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_40000baseLR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_56000baseKR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_56000baseKR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_56000baseCR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_56000baseCR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_56000baseSR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_56000baseSR4_Full' ],
|
|
[ 'HAVE_SUPPORTED_56000baseLR4_Full', 'linux/ethtool.h',
|
|
'SUPPORTED_56000baseLR4_Full' ],
|
|
[ 'HAVE_ETHTOOL_LINK_MODE_25G', 'linux/ethtool.h',
|
|
'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT' ],
|
|
[ 'HAVE_ETHTOOL_LINK_MODE_50G', 'linux/ethtool.h',
|
|
'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT' ],
|
|
[ 'HAVE_ETHTOOL_LINK_MODE_100G', 'linux/ethtool.h',
|
|
'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT' ],
|
|
[ 'HAVE_IFLA_NUM_VF', 'linux/if_link.h',
|
|
'IFLA_NUM_VF' ],
|
|
[ 'HAVE_IFLA_EXT_MASK', 'linux/if_link.h',
|
|
'IFLA_EXT_MASK' ],
|
|
[ 'HAVE_IFLA_PHYS_SWITCH_ID', 'linux/if_link.h',
|
|
'IFLA_PHYS_SWITCH_ID' ],
|
|
[ 'HAVE_IFLA_PHYS_PORT_NAME', 'linux/if_link.h',
|
|
'IFLA_PHYS_PORT_NAME' ],
|
|
[ 'HAVE_RDMA_NL_NLDEV', 'rdma/rdma_netlink.h',
|
|
'RDMA_NL_NLDEV' ],
|
|
[ 'HAVE_RDMA_NLDEV_CMD_GET', 'rdma/rdma_netlink.h',
|
|
'RDMA_NLDEV_CMD_GET' ],
|
|
[ 'HAVE_RDMA_NLDEV_CMD_PORT_GET', 'rdma/rdma_netlink.h',
|
|
'RDMA_NLDEV_CMD_PORT_GET' ],
|
|
[ 'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX', 'rdma/rdma_netlink.h',
|
|
'RDMA_NLDEV_ATTR_DEV_INDEX' ],
|
|
[ 'HAVE_RDMA_NLDEV_ATTR_DEV_NAME', 'rdma/rdma_netlink.h',
|
|
'RDMA_NLDEV_ATTR_DEV_NAME' ],
|
|
[ 'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX', 'rdma/rdma_netlink.h',
|
|
'RDMA_NLDEV_ATTR_PORT_INDEX' ],
|
|
[ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
|
|
'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
|
|
]
|
|
config = configuration_data()
|
|
foreach arg:has_sym_args
|
|
config.set(arg[0], cc.has_header_symbol(arg[1], arg[2],
|
|
dependencies: libs))
|
|
endforeach
|
|
foreach arg:has_member_args
|
|
file_prefix = '#include <' + arg[1] + '>'
|
|
config.set(arg[0], cc.has_member(arg[2], arg[3],
|
|
prefix : file_prefix, dependencies: libs))
|
|
endforeach
|
|
configure_file(output : 'mlx5_autoconf.h', configuration : config)
|
|
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
|