net/mlx5: support flow dump API
Dump fdb/nic_rx/nic_tx raw flow data into specified file. Signed-off-by: Xueming Li <xuemingl@mellanox.com> Signed-off-by: Xiaoyu Min <jackmin@mellanox.com> Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
This commit is contained in:
parent
12e6e3e78f
commit
f6d7202402
@ -8,7 +8,7 @@ include $(RTE_SDK)/mk/rte.vars.mk
|
||||
LIB = librte_pmd_mlx5.a
|
||||
LIB_GLUE = $(LIB_GLUE_BASE).$(LIB_GLUE_VERSION)
|
||||
LIB_GLUE_BASE = librte_pmd_mlx5_glue.so
|
||||
LIB_GLUE_VERSION = 19.08.0
|
||||
LIB_GLUE_VERSION = 20.02.0
|
||||
|
||||
# Sources.
|
||||
SRCS-$(CONFIG_RTE_LIBRTE_MLX5_PMD) += mlx5.c
|
||||
@ -203,6 +203,11 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh
|
||||
infiniband/mlx5dv.h \
|
||||
func mlx5dv_dr_action_create_flow_meter \
|
||||
$(AUTOCONF_OUTPUT)
|
||||
$Q sh -- '$<' '$@' \
|
||||
HAVE_MLX5_DR_FLOW_DUMP \
|
||||
infiniband/mlx5dv.h \
|
||||
func mlx5dv_dump_dr_domain \
|
||||
$(AUTOCONF_OUTPUT)
|
||||
$Q sh -- '$<' '$@' \
|
||||
HAVE_MLX5DV_MMAP_GET_NC_PAGES_CMD \
|
||||
infiniband/mlx5dv.h \
|
||||
|
@ -11,7 +11,7 @@ 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_VERSION = '20.02.0'
|
||||
LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION
|
||||
if pmd_dlopen
|
||||
dpdk_conf.set('RTE_IBVERBS_LINK_DLOPEN', 1)
|
||||
@ -186,6 +186,8 @@ if build
|
||||
'RDMA_NLDEV_ATTR_PORT_INDEX' ],
|
||||
[ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h',
|
||||
'RDMA_NLDEV_ATTR_NDEV_INDEX' ],
|
||||
[ 'HAVE_MLX5_DR_FLOW_DUMP', 'infiniband/mlx5dv.h',
|
||||
'mlx5dv_dump_dr_domain'],
|
||||
]
|
||||
config = configuration_data()
|
||||
foreach arg:has_sym_args
|
||||
|
@ -975,6 +975,8 @@ struct mlx5_flow_counter *mlx5_counter_alloc(struct rte_eth_dev *dev);
|
||||
void mlx5_counter_free(struct rte_eth_dev *dev, struct mlx5_flow_counter *cnt);
|
||||
int mlx5_counter_query(struct rte_eth_dev *dev, struct mlx5_flow_counter *cnt,
|
||||
bool clear, uint64_t *pkts, uint64_t *bytes);
|
||||
int mlx5_flow_dev_dump(struct rte_eth_dev *dev, FILE *file,
|
||||
struct rte_flow_error *error);
|
||||
|
||||
/* mlx5_mp.c */
|
||||
void mlx5_mp_req_start_rxtx(struct rte_eth_dev *dev);
|
||||
@ -1049,6 +1051,8 @@ struct mlx5_devx_obj *mlx5_devx_cmd_create_tis
|
||||
(struct ibv_context *ctx, struct mlx5_devx_tis_attr *tis_attr);
|
||||
struct mlx5_devx_obj *mlx5_devx_cmd_create_td(struct ibv_context *ctx);
|
||||
|
||||
int mlx5_devx_cmd_flow_dump(struct mlx5_ibv_shared *sh, FILE *file);
|
||||
|
||||
/* mlx5_flow_meter.c */
|
||||
|
||||
int mlx5_flow_meter_ops_get(struct rte_eth_dev *dev, void *arg);
|
||||
|
@ -927,3 +927,38 @@ mlx5_devx_cmd_create_td(struct ibv_context *ctx)
|
||||
transport_domain);
|
||||
return td;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump all flows to file.
|
||||
*
|
||||
* @param[in] sh
|
||||
* Pointer to context.
|
||||
* @param[out] file
|
||||
* Pointer to file stream.
|
||||
*
|
||||
* @return
|
||||
* 0 on success, a nagative value otherwise.
|
||||
*/
|
||||
int
|
||||
mlx5_devx_cmd_flow_dump(struct mlx5_ibv_shared *sh __rte_unused,
|
||||
FILE *file __rte_unused)
|
||||
{
|
||||
int ret = 0;
|
||||
|
||||
#ifdef HAVE_MLX5_DR_FLOW_DUMP
|
||||
if (sh->fdb_domain) {
|
||||
ret = mlx5_glue->dr_dump_domain(file, sh->fdb_domain);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
assert(sh->rx_domain);
|
||||
ret = mlx5_glue->dr_dump_domain(file, sh->rx_domain);
|
||||
if (ret)
|
||||
return ret;
|
||||
assert(sh->tx_domain);
|
||||
ret = mlx5_glue->dr_dump_domain(file, sh->tx_domain);
|
||||
#else
|
||||
ret = ENOTSUP;
|
||||
#endif
|
||||
return -ret;
|
||||
}
|
||||
|
@ -236,6 +236,7 @@ static const struct rte_flow_ops mlx5_flow_ops = {
|
||||
.flush = mlx5_flow_flush,
|
||||
.isolate = mlx5_flow_isolate,
|
||||
.query = mlx5_flow_query,
|
||||
.dev_dump = mlx5_flow_dev_dump,
|
||||
};
|
||||
|
||||
/* Convert FDIR request to Generic flow. */
|
||||
@ -5679,3 +5680,26 @@ mlx5_flow_discover_mreg_c(struct rte_eth_dev *dev)
|
||||
config->flow_mreg_c[n] = REG_NONE;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Dump flow raw hw data to file
|
||||
*
|
||||
* @param[in] dev
|
||||
* The pointer to Ethernet device.
|
||||
* @param[in] file
|
||||
* A pointer to a file for output.
|
||||
* @param[out] error
|
||||
* Perform verbose error reporting if not NULL. PMDs initialize this
|
||||
* structure in case of error only.
|
||||
* @return
|
||||
* 0 on success, a nagative value otherwise.
|
||||
*/
|
||||
int
|
||||
mlx5_flow_dev_dump(struct rte_eth_dev *dev,
|
||||
FILE *file,
|
||||
struct rte_flow_error *error __rte_unused)
|
||||
{
|
||||
struct mlx5_priv *priv = dev->data->dev_private;
|
||||
|
||||
return mlx5_devx_cmd_flow_dump(priv->sh, file);
|
||||
}
|
||||
|
@ -1037,6 +1037,18 @@ mlx5_glue_devx_port_query(struct ibv_context *ctx,
|
||||
#endif
|
||||
}
|
||||
|
||||
static int
|
||||
mlx5_glue_dr_dump_domain(FILE *file, void *domain)
|
||||
{
|
||||
#ifdef HAVE_MLX5_DR_FLOW_DUMP
|
||||
return mlx5dv_dump_dr_domain(file, domain);
|
||||
#else
|
||||
RTE_SET_USED(file);
|
||||
RTE_SET_USED(domain);
|
||||
return -ENOTSUP;
|
||||
#endif
|
||||
}
|
||||
|
||||
alignas(RTE_CACHE_LINE_SIZE)
|
||||
const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
|
||||
.version = MLX5_GLUE_VERSION,
|
||||
@ -1134,4 +1146,5 @@ const struct mlx5_glue *mlx5_glue = &(const struct mlx5_glue){
|
||||
.devx_umem_dereg = mlx5_glue_devx_umem_dereg,
|
||||
.devx_qp_query = mlx5_glue_devx_qp_query,
|
||||
.devx_port_query = mlx5_glue_devx_port_query,
|
||||
.dr_dump_domain = mlx5_glue_dr_dump_domain,
|
||||
};
|
||||
|
@ -256,6 +256,7 @@ struct mlx5_glue {
|
||||
int (*devx_port_query)(struct ibv_context *ctx,
|
||||
uint32_t port_num,
|
||||
struct mlx5dv_devx_port *mlx5_devx_port);
|
||||
int (*dr_dump_domain)(FILE *file, void *domain);
|
||||
};
|
||||
|
||||
const struct mlx5_glue *mlx5_glue;
|
||||
|
Loading…
Reference in New Issue
Block a user