From: Tal Shnaiderman Date: Fri, 24 Dec 2021 06:46:46 +0000 (+0200) Subject: net/mlx5: support imissed counter on Windows X-Git-Url: http://git.droids-corp.org/?a=commitdiff_plain;h=e50fe91ae329aa1b3ce499897378286353aaf262;p=dpdk.git net/mlx5: support imissed counter on Windows Add support for the imissed counter using the DevX API on Windows. imissed is queried by creating a queue counter for the port, attaching it to all created RQs and querying the "out_of_buffer" field. If the counter cannot be created, imissed will always report 0. Signed-off-by: Tal Shnaiderman Acked-by: Matan Azrad --- diff --git a/drivers/common/mlx5/version.map b/drivers/common/mlx5/version.map index 34e86004a0..462b7cea5e 100644 --- a/drivers/common/mlx5/version.map +++ b/drivers/common/mlx5/version.map @@ -55,8 +55,8 @@ INTERNAL { mlx5_devx_cmd_query_parse_samples; mlx5_devx_cmd_query_virtio_q_counters; # WINDOWS_NO_EXPORT mlx5_devx_cmd_query_virtq; - mlx5_devx_cmd_queue_counter_alloc; # WINDOWS_NO_EXPORT - mlx5_devx_cmd_queue_counter_query; # WINDOWS_NO_EXPORT + mlx5_devx_cmd_queue_counter_alloc; + mlx5_devx_cmd_queue_counter_query; mlx5_devx_cmd_register_read; mlx5_devx_cmd_register_write; mlx5_devx_cmd_wq_query; # WINDOWS_NO_EXPORT diff --git a/drivers/net/mlx5/windows/mlx5_ethdev_os.c b/drivers/net/mlx5/windows/mlx5_ethdev_os.c index 359f73df7c..c6315ce368 100644 --- a/drivers/net/mlx5/windows/mlx5_ethdev_os.c +++ b/drivers/net/mlx5/windows/mlx5_ethdev_os.c @@ -203,7 +203,16 @@ mlx5_os_get_stats_n(struct rte_eth_dev *dev) void mlx5_os_stats_init(struct rte_eth_dev *dev) { - RTE_SET_USED(dev); + struct mlx5_priv *priv = dev->data->dev_private; + struct mlx5_stats_ctrl *stats_ctrl = &priv->stats_ctrl; + int ret; + + /* Copy to base at first time. */ + ret = mlx5_os_read_dev_stat(priv, "out_of_buffer", &stats_ctrl->imissed_base); + if (ret) + DRV_LOG(ERR, "port %u cannot read device counters: %s", + dev->data->port_id, strerror(rte_errno)); + stats_ctrl->imissed = 0; } /** diff --git a/drivers/net/mlx5/windows/mlx5_os.c b/drivers/net/mlx5/windows/mlx5_os.c index f143724990..ac0af0ff7d 100644 --- a/drivers/net/mlx5/windows/mlx5_os.c +++ b/drivers/net/mlx5/windows/mlx5_os.c @@ -72,6 +72,22 @@ static struct mlx5_indexed_pool_config icfg[] = { }, }; +static void +mlx5_queue_counter_id_prepare(struct rte_eth_dev *dev) +{ + struct mlx5_priv *priv = dev->data->dev_private; + void *ctx = priv->sh->cdev->ctx; + + priv->q_counters = mlx5_devx_cmd_queue_counter_alloc(ctx); + if (!priv->q_counters) { + DRV_LOG(ERR, "Port %d queue counter object cannot be created " + "by DevX - imissed counter will be unavailable", + dev->data->port_id); + return; + } + priv->counter_set_id = priv->q_counters->id; +} + /** * Initialize shared data between primary and secondary process. * @@ -655,6 +671,7 @@ mlx5_dev_spawn(struct rte_device *dpdk_dev, goto error; } mlx5_flow_counter_mode_config(eth_dev); + mlx5_queue_counter_id_prepare(eth_dev); return eth_dev; error: if (priv) { @@ -718,7 +735,8 @@ mlx5_os_dev_shared_handler_uninstall(struct mlx5_dev_ctx_shared *sh) * @param[out] stat * Pointer to read statistic value. * @return - * 0 on success and stat is valud, 1 if failed to read the value + * 0 on success and stat is valid, non-zero if failed to read the value + * or counter is not supported. * rte_errno is set. * */ @@ -726,10 +744,11 @@ int mlx5_os_read_dev_stat(struct mlx5_priv *priv, const char *ctr_name, uint64_t *stat) { - RTE_SET_USED(priv); - RTE_SET_USED(ctr_name); - RTE_SET_USED(stat); - DRV_LOG(WARNING, "%s: is not supported", __func__); + if (priv->q_counters != NULL && strcmp(ctr_name, "out_of_buffer") == 0) + return mlx5_devx_cmd_queue_counter_query + (priv->q_counters, 0, (uint32_t *)stat); + DRV_LOG(WARNING, "%s: is not supported for the %s counter", + __func__, ctr_name); return -ENOTSUP; }