Skip to content

Commit

Permalink
net/mlx5e: Add vnic devlink health reporter to representors
Browse files Browse the repository at this point in the history
Create a new devlink health reporter for representor interface, which
reports the values of representor vnic diagnostic counters when diagnosed.

This patch will allow admins to monitor VF diagnostic counters through
the representor-interface vnic reporter.

Example of usage:
$ devlink health diagnose pci/0000:08:00.0/65537 reporter vnic
  vNIC env counters:
    total_error_queues: 0 send_queue_priority_update_flow: 0
    comp_eq_overrun: 0 async_eq_overrun: 0 cq_overrun: 0
    invalid_command: 0 quota_exceeded_command: 0
    nic_receive_steering_discard: 0

Signed-off-by: Maher Sanalla <msanalla@nvidia.com>
Reviewed-by: Moshe Shemesh <moshe@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
  • Loading branch information
Maher Sanalla authored and Saeed Mahameed committed Apr 21, 2023
1 parent b0bc615 commit cf14af1
Show file tree
Hide file tree
Showing 3 changed files with 55 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -285,5 +285,8 @@ steering but were discarded due to a mismatch in flow table.
User commands examples:
- Diagnose PF/VF vnic counters
$ devlink health diagnose pci/0000:82:00.1 reporter vnic
- Diagnose representor vnic counters (performed by supplying devlink port of the
representor, which can be obtained via devlink port command)
$ devlink health diagnose pci/0000:82:00.1/65537 reporter vnic

NOTE: This command can run only on PF/VF ports.
NOTE: This command can run over all interfaces such as PF/VF and representor ports.
52 changes: 50 additions & 2 deletions drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@
#include "lib/vxlan.h"
#define CREATE_TRACE_POINTS
#include "diag/en_rep_tracepoint.h"
#include "diag/reporter_vnic.h"
#include "en_accel/ipsec.h"
#include "en/tc/int_port.h"
#include "en/ptp.h"
Expand Down Expand Up @@ -1294,6 +1295,50 @@ static unsigned int mlx5e_ul_rep_stats_grps_num(struct mlx5e_priv *priv)
return ARRAY_SIZE(mlx5e_ul_rep_stats_grps);
}

static int
mlx5e_rep_vnic_reporter_diagnose(struct devlink_health_reporter *reporter,
struct devlink_fmsg *fmsg,
struct netlink_ext_ack *extack)
{
struct mlx5e_rep_priv *rpriv = devlink_health_reporter_priv(reporter);
struct mlx5_eswitch_rep *rep = rpriv->rep;

return mlx5_reporter_vnic_diagnose_counters(rep->esw->dev, fmsg,
rep->vport, true);
}

static const struct devlink_health_reporter_ops mlx5_rep_vnic_reporter_ops = {
.name = "vnic",
.diagnose = mlx5e_rep_vnic_reporter_diagnose,
};

static void mlx5e_rep_vnic_reporter_create(struct mlx5e_priv *priv,
struct devlink_port *dl_port)
{
struct mlx5e_rep_priv *rpriv = priv->ppriv;
struct devlink_health_reporter *reporter;

reporter = devl_port_health_reporter_create(dl_port,
&mlx5_rep_vnic_reporter_ops,
0, rpriv);
if (IS_ERR(reporter)) {
mlx5_core_err(priv->mdev,
"Failed to create representor vnic reporter, err = %ld\n",
PTR_ERR(reporter));
return;
}

rpriv->rep_vnic_reporter = reporter;
}

static void mlx5e_rep_vnic_reporter_destroy(struct mlx5e_priv *priv)
{
struct mlx5e_rep_priv *rpriv = priv->ppriv;

if (!IS_ERR_OR_NULL(rpriv->rep_vnic_reporter))
devl_health_reporter_destroy(rpriv->rep_vnic_reporter);
}

static const struct mlx5e_profile mlx5e_rep_profile = {
.init = mlx5e_init_rep,
.cleanup = mlx5e_cleanup_rep,
Expand Down Expand Up @@ -1394,8 +1439,10 @@ mlx5e_vport_vf_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)

dl_port = mlx5_esw_offloads_devlink_port(dev->priv.eswitch,
rpriv->rep->vport);
if (dl_port)
if (dl_port) {
SET_NETDEV_DEVLINK_PORT(netdev, dl_port);
mlx5e_rep_vnic_reporter_create(priv, dl_port);
}

err = register_netdev(netdev);
if (err) {
Expand All @@ -1408,8 +1455,8 @@ mlx5e_vport_vf_rep_load(struct mlx5_core_dev *dev, struct mlx5_eswitch_rep *rep)
return 0;

err_detach_netdev:
mlx5e_rep_vnic_reporter_destroy(priv);
mlx5e_detach_netdev(netdev_priv(netdev));

err_cleanup_profile:
priv->profile->cleanup(priv);

Expand Down Expand Up @@ -1458,6 +1505,7 @@ mlx5e_vport_rep_unload(struct mlx5_eswitch_rep *rep)
}

unregister_netdev(netdev);
mlx5e_rep_vnic_reporter_destroy(priv);
mlx5e_detach_netdev(priv);
priv->profile->cleanup(priv);
mlx5e_destroy_netdev(priv);
Expand Down
1 change: 1 addition & 0 deletions drivers/net/ethernet/mellanox/mlx5/core/en_rep.h
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ struct mlx5e_rep_priv {
struct rtnl_link_stats64 prev_vf_vport_stats;
struct mlx5_flow_handle *send_to_vport_meta_rule;
struct rhashtable tc_ht;
struct devlink_health_reporter *rep_vnic_reporter;
};

static inline
Expand Down

0 comments on commit cf14af1

Please sign in to comment.