net/mlx5: qos: Drop 'esw' param from vport qos functions
authorCosmin Ratiu <cratiu@nvidia.com>
Tue, 8 Oct 2024 18:32:15 +0000 (21:32 +0300)
committerPaolo Abeni <pabeni@redhat.com>
Thu, 10 Oct 2024 11:11:59 +0000 (13:11 +0200)
The vport has a pointer to its own eswitch in vport->dev->priv.eswitch,
so passing the same eswitch as a parameter to the various functions
manipulating vport qos is superfluous at best and prone to errors at
worst.

More importantly, with the upcoming cross-esw scheduling changes, the
eswitch that should receive the various scheduling element commands is
NOT the same as the vport's eswitch, so the current code's assumptions
will break.

To avoid confusion and bugs, this commit drops the 'esw' parameter from
all vport qos functions and uses the vport's own eswitch pointer
instead.

Signed-off-by: Cosmin Ratiu <cratiu@nvidia.com>
Reviewed-by: Carolina Jubran <cjubran@nvidia.com>
Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
drivers/net/ethernet/mellanox/mlx5/core/esw/legacy.c
drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c
drivers/net/ethernet/mellanox/mlx5/core/esw/qos.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch.c
drivers/net/ethernet/mellanox/mlx5/core/eswitch.h
drivers/net/ethernet/mellanox/mlx5/core/eswitch_offloads.c

index f8869c9b68029f726f7af9bb608c7ef3469d88df..86af1891395f0f4aa8143971c436369bfda404d3 100644 (file)
@@ -187,7 +187,7 @@ rate_err:
        return err;
 }
 
-void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
+void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_vport *vport)
 {
        struct mlx5_devlink_port *dl_port;
 
@@ -195,7 +195,7 @@ void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, struct
                return;
        dl_port = vport->dl_port;
 
-       mlx5_esw_qos_vport_update_group(esw, vport, NULL, NULL);
+       mlx5_esw_qos_vport_update_group(vport, NULL, NULL);
        devl_rate_leaf_destroy(&dl_port->dl_port);
 
        devl_port_unregister(&dl_port->dl_port);
index 8587cd572da536b45cf7088e658db940470c253d..3c8388706e152917092bf69b5e8af5bfbbf7fc36 100644 (file)
@@ -521,7 +521,7 @@ int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
                return PTR_ERR(evport);
 
        mutex_lock(&esw->state_lock);
-       err = mlx5_esw_qos_set_vport_rate(esw, evport, max_rate, min_rate);
+       err = mlx5_esw_qos_set_vport_rate(evport, max_rate, min_rate);
        mutex_unlock(&esw->state_lock);
        return err;
 }
index 958b8894f5c096ce2477daff173d6add0fc87912..baf68ffb07ccbe1ddc2c892434e5d2f90f2b3ef8 100644 (file)
@@ -67,20 +67,19 @@ static int esw_qos_group_config(struct mlx5_eswitch *esw, struct mlx5_esw_rate_g
        return err;
 }
 
-static int esw_qos_vport_config(struct mlx5_eswitch *esw,
-                               struct mlx5_vport *vport,
+static int esw_qos_vport_config(struct mlx5_vport *vport,
                                u32 max_rate, u32 bw_share,
                                struct netlink_ext_ack *extack)
 {
-       struct mlx5_core_dev *dev = esw->dev;
        int err;
 
        if (!vport->qos.enabled)
                return -EIO;
 
-       err = esw_qos_sched_elem_config(dev, vport->qos.esw_sched_elem_ix, max_rate, bw_share);
+       err = esw_qos_sched_elem_config(vport->dev, vport->qos.esw_sched_elem_ix, max_rate,
+                                       bw_share);
        if (err) {
-               esw_warn(esw->dev,
+               esw_warn(vport->dev,
                         "E-Switch modify vport scheduling element failed (vport=%d,err=%d)\n",
                         vport->vport, err);
                NL_SET_ERR_MSG_MOD(extack, "E-Switch modify vport scheduling element failed");
@@ -169,7 +168,7 @@ static int esw_qos_normalize_group_min_rate(struct mlx5_eswitch *esw,
                if (bw_share == vport->qos.bw_share)
                        continue;
 
-               err = esw_qos_vport_config(esw, vport, vport->qos.max_rate, bw_share, extack);
+               err = esw_qos_vport_config(vport, vport->qos.max_rate, bw_share, extack);
                if (err)
                        return err;
 
@@ -213,16 +212,17 @@ static int esw_qos_normalize_min_rate(struct mlx5_eswitch *esw, struct netlink_e
        return 0;
 }
 
-static int esw_qos_set_vport_min_rate(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
+static int esw_qos_set_vport_min_rate(struct mlx5_vport *vport,
                                      u32 min_rate, struct netlink_ext_ack *extack)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        u32 fw_max_bw_share, previous_min_rate;
        bool min_rate_supported;
        int err;
 
        lockdep_assert_held(&esw->state_lock);
-       fw_max_bw_share = MLX5_CAP_QOS(esw->dev, max_tsar_bw_share);
-       min_rate_supported = MLX5_CAP_QOS(esw->dev, esw_bw_share) &&
+       fw_max_bw_share = MLX5_CAP_QOS(vport->dev, max_tsar_bw_share);
+       min_rate_supported = MLX5_CAP_QOS(vport->dev, esw_bw_share) &&
                                fw_max_bw_share >= MLX5_MIN_BW_SHARE;
        if (min_rate && !min_rate_supported)
                return -EOPNOTSUPP;
@@ -238,15 +238,16 @@ static int esw_qos_set_vport_min_rate(struct mlx5_eswitch *esw, struct mlx5_vpor
        return err;
 }
 
-static int esw_qos_set_vport_max_rate(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
+static int esw_qos_set_vport_max_rate(struct mlx5_vport *vport,
                                      u32 max_rate, struct netlink_ext_ack *extack)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        u32 act_max_rate = max_rate;
        bool max_rate_supported;
        int err;
 
        lockdep_assert_held(&esw->state_lock);
-       max_rate_supported = MLX5_CAP_QOS(esw->dev, esw_rate_limit);
+       max_rate_supported = MLX5_CAP_QOS(vport->dev, esw_rate_limit);
 
        if (max_rate && !max_rate_supported)
                return -EOPNOTSUPP;
@@ -257,7 +258,7 @@ static int esw_qos_set_vport_max_rate(struct mlx5_eswitch *esw, struct mlx5_vpor
        if (!max_rate)
                act_max_rate = vport->qos.group->max_rate;
 
-       err = esw_qos_vport_config(esw, vport, act_max_rate, vport->qos.bw_share, extack);
+       err = esw_qos_vport_config(vport, act_max_rate, vport->qos.bw_share, extack);
 
        if (!err)
                vport->qos.max_rate = max_rate;
@@ -315,7 +316,7 @@ static int esw_qos_set_group_max_rate(struct mlx5_eswitch *esw,
                if (vport->qos.max_rate)
                        continue;
 
-               err = esw_qos_vport_config(esw, vport, max_rate, vport->qos.bw_share, extack);
+               err = esw_qos_vport_config(vport, max_rate, vport->qos.bw_share, extack);
                if (err)
                        NL_SET_ERR_MSG_MOD(extack,
                                           "E-Switch vport implicit rate limit setting failed");
@@ -343,13 +344,12 @@ static bool esw_qos_element_type_supported(struct mlx5_core_dev *dev, int type)
        return false;
 }
 
-static int esw_qos_vport_create_sched_element(struct mlx5_eswitch *esw,
-                                             struct mlx5_vport *vport,
+static int esw_qos_vport_create_sched_element(struct mlx5_vport *vport,
                                              u32 max_rate, u32 bw_share)
 {
        u32 sched_ctx[MLX5_ST_SZ_DW(scheduling_context)] = {};
        struct mlx5_esw_rate_group *group = vport->qos.group;
-       struct mlx5_core_dev *dev = esw->dev;
+       struct mlx5_core_dev *dev = vport->dev;
        void *attr;
        int err;
 
@@ -369,7 +369,7 @@ static int esw_qos_vport_create_sched_element(struct mlx5_eswitch *esw,
                                                 sched_ctx,
                                                 &vport->qos.esw_sched_elem_ix);
        if (err) {
-               esw_warn(vport->dev,
+               esw_warn(dev,
                         "E-Switch create vport scheduling element failed (vport=%d,err=%d)\n",
                         vport->vport, err);
                return err;
@@ -378,8 +378,7 @@ static int esw_qos_vport_create_sched_element(struct mlx5_eswitch *esw,
        return 0;
 }
 
-static int esw_qos_update_group_scheduling_element(struct mlx5_eswitch *esw,
-                                                  struct mlx5_vport *vport,
+static int esw_qos_update_group_scheduling_element(struct mlx5_vport *vport,
                                                   struct mlx5_esw_rate_group *curr_group,
                                                   struct mlx5_esw_rate_group *new_group,
                                                   struct netlink_ext_ack *extack)
@@ -387,7 +386,7 @@ static int esw_qos_update_group_scheduling_element(struct mlx5_eswitch *esw,
        u32 max_rate;
        int err;
 
-       err = mlx5_destroy_scheduling_element_cmd(esw->dev,
+       err = mlx5_destroy_scheduling_element_cmd(vport->dev,
                                                  SCHEDULING_HIERARCHY_E_SWITCH,
                                                  vport->qos.esw_sched_elem_ix);
        if (err) {
@@ -398,7 +397,7 @@ static int esw_qos_update_group_scheduling_element(struct mlx5_eswitch *esw,
        esw_qos_vport_set_group(vport, new_group);
        /* Use new group max rate if vport max rate is unlimited. */
        max_rate = vport->qos.max_rate ? vport->qos.max_rate : new_group->max_rate;
-       err = esw_qos_vport_create_sched_element(esw, vport, max_rate, vport->qos.bw_share);
+       err = esw_qos_vport_create_sched_element(vport, max_rate, vport->qos.bw_share);
        if (err) {
                NL_SET_ERR_MSG_MOD(extack, "E-Switch vport group set failed.");
                goto err_sched;
@@ -409,18 +408,18 @@ static int esw_qos_update_group_scheduling_element(struct mlx5_eswitch *esw,
 err_sched:
        esw_qos_vport_set_group(vport, curr_group);
        max_rate = vport->qos.max_rate ? vport->qos.max_rate : curr_group->max_rate;
-       if (esw_qos_vport_create_sched_element(esw, vport, max_rate, vport->qos.bw_share))
-               esw_warn(esw->dev, "E-Switch vport group restore failed (vport=%d)\n",
+       if (esw_qos_vport_create_sched_element(vport, max_rate, vport->qos.bw_share))
+               esw_warn(vport->dev, "E-Switch vport group restore failed (vport=%d)\n",
                         vport->vport);
 
        return err;
 }
 
-static int esw_qos_vport_update_group(struct mlx5_eswitch *esw,
-                                     struct mlx5_vport *vport,
+static int esw_qos_vport_update_group(struct mlx5_vport *vport,
                                      struct mlx5_esw_rate_group *group,
                                      struct netlink_ext_ack *extack)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        struct mlx5_esw_rate_group *new_group, *curr_group;
        int err;
 
@@ -432,7 +431,7 @@ static int esw_qos_vport_update_group(struct mlx5_eswitch *esw,
        if (curr_group == new_group)
                return 0;
 
-       err = esw_qos_update_group_scheduling_element(esw, vport, curr_group, new_group, extack);
+       err = esw_qos_update_group_scheduling_element(vport, curr_group, new_group, extack);
        if (err)
                return err;
 
@@ -669,9 +668,10 @@ static void esw_qos_put(struct mlx5_eswitch *esw)
                esw_qos_destroy(esw);
 }
 
-static int esw_qos_vport_enable(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
+static int esw_qos_vport_enable(struct mlx5_vport *vport,
                                u32 max_rate, u32 bw_share, struct netlink_ext_ack *extack)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        int err;
 
        lockdep_assert_held(&esw->state_lock);
@@ -685,7 +685,7 @@ static int esw_qos_vport_enable(struct mlx5_eswitch *esw, struct mlx5_vport *vpo
        INIT_LIST_HEAD(&vport->qos.group_entry);
        esw_qos_vport_set_group(vport, esw->qos.group0);
 
-       err = esw_qos_vport_create_sched_element(esw, vport, max_rate, bw_share);
+       err = esw_qos_vport_create_sched_element(vport, max_rate, bw_share);
        if (err)
                goto err_out;
 
@@ -700,8 +700,9 @@ err_out:
        return err;
 }
 
-void mlx5_esw_qos_vport_disable(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
+void mlx5_esw_qos_vport_disable(struct mlx5_vport *vport)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        int err;
 
        lockdep_assert_held(&esw->state_lock);
@@ -723,20 +724,19 @@ void mlx5_esw_qos_vport_disable(struct mlx5_eswitch *esw, struct mlx5_vport *vpo
        esw_qos_put(esw);
 }
 
-int mlx5_esw_qos_set_vport_rate(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
-                               u32 max_rate, u32 min_rate)
+int mlx5_esw_qos_set_vport_rate(struct mlx5_vport *vport, u32 max_rate, u32 min_rate)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        int err;
 
        lockdep_assert_held(&esw->state_lock);
-       err = esw_qos_vport_enable(esw, vport, 0, 0, NULL);
+       err = esw_qos_vport_enable(vport, 0, 0, NULL);
        if (err)
                return err;
 
-       err = esw_qos_set_vport_min_rate(esw, vport, min_rate, NULL);
+       err = esw_qos_set_vport_min_rate(vport, min_rate, NULL);
        if (!err)
-               err = esw_qos_set_vport_max_rate(esw, vport, max_rate, NULL);
-
+               err = esw_qos_set_vport_max_rate(vport, max_rate, NULL);
        return err;
 }
 
@@ -830,12 +830,12 @@ int mlx5_esw_qos_modify_vport_rate(struct mlx5_eswitch *esw, u16 vport_num, u32
        mutex_lock(&esw->state_lock);
        if (!vport->qos.enabled) {
                /* Eswitch QoS wasn't enabled yet. Enable it and vport QoS. */
-               err = esw_qos_vport_enable(esw, vport, rate_mbps, vport->qos.bw_share, NULL);
+               err = esw_qos_vport_enable(vport, rate_mbps, vport->qos.bw_share, NULL);
        } else {
                MLX5_SET(scheduling_context, ctx, max_average_bw, rate_mbps);
 
                bitmask = MODIFY_SCHEDULING_ELEMENT_IN_MODIFY_BITMASK_MAX_AVERAGE_BW;
-               err = mlx5_modify_scheduling_element_cmd(esw->dev,
+               err = mlx5_modify_scheduling_element_cmd(vport->dev,
                                                         SCHEDULING_HIERARCHY_E_SWITCH,
                                                         ctx,
                                                         vport->qos.esw_sched_elem_ix,
@@ -897,11 +897,11 @@ int mlx5_esw_devlink_rate_leaf_tx_share_set(struct devlink_rate *rate_leaf, void
                return err;
 
        mutex_lock(&esw->state_lock);
-       err = esw_qos_vport_enable(esw, vport, 0, 0, extack);
+       err = esw_qos_vport_enable(vport, 0, 0, extack);
        if (err)
                goto unlock;
 
-       err = esw_qos_set_vport_min_rate(esw, vport, tx_share, extack);
+       err = esw_qos_set_vport_min_rate(vport, tx_share, extack);
 unlock:
        mutex_unlock(&esw->state_lock);
        return err;
@@ -923,11 +923,11 @@ int mlx5_esw_devlink_rate_leaf_tx_max_set(struct devlink_rate *rate_leaf, void *
                return err;
 
        mutex_lock(&esw->state_lock);
-       err = esw_qos_vport_enable(esw, vport, 0, 0, extack);
+       err = esw_qos_vport_enable(vport, 0, 0, extack);
        if (err)
                goto unlock;
 
-       err = esw_qos_set_vport_max_rate(esw, vport, tx_max, extack);
+       err = esw_qos_set_vport_max_rate(vport, tx_max, extack);
 unlock:
        mutex_unlock(&esw->state_lock);
        return err;
@@ -1017,20 +1017,20 @@ int mlx5_esw_devlink_rate_node_del(struct devlink_rate *rate_node, void *priv,
        return err;
 }
 
-int mlx5_esw_qos_vport_update_group(struct mlx5_eswitch *esw,
-                                   struct mlx5_vport *vport,
+int mlx5_esw_qos_vport_update_group(struct mlx5_vport *vport,
                                    struct mlx5_esw_rate_group *group,
                                    struct netlink_ext_ack *extack)
 {
+       struct mlx5_eswitch *esw = vport->dev->priv.eswitch;
        int err = 0;
 
        mutex_lock(&esw->state_lock);
        if (!vport->qos.enabled && !group)
                goto unlock;
 
-       err = esw_qos_vport_enable(esw, vport, 0, 0, extack);
+       err = esw_qos_vport_enable(vport, 0, 0, extack);
        if (!err)
-               err = esw_qos_vport_update_group(esw, vport, group, extack);
+               err = esw_qos_vport_update_group(vport, group, extack);
 unlock:
        mutex_unlock(&esw->state_lock);
        return err;
@@ -1045,9 +1045,8 @@ int mlx5_esw_devlink_rate_parent_set(struct devlink_rate *devlink_rate,
        struct mlx5_vport *vport = priv;
 
        if (!parent)
-               return mlx5_esw_qos_vport_update_group(vport->dev->priv.eswitch,
-                                                      vport, NULL, extack);
+               return mlx5_esw_qos_vport_update_group(vport, NULL, extack);
 
        group = parent_priv;
-       return mlx5_esw_qos_vport_update_group(vport->dev->priv.eswitch, vport, group, extack);
+       return mlx5_esw_qos_vport_update_group(vport, group, extack);
 }
index 0141e9d52037fa6a564219da2b2cb89abe3032fc..c4f04c3e6a5949b1c8536e42d670fb9fd03f2964 100644 (file)
@@ -6,9 +6,8 @@
 
 #ifdef CONFIG_MLX5_ESWITCH
 
-int mlx5_esw_qos_set_vport_rate(struct mlx5_eswitch *esw, struct mlx5_vport *evport,
-                               u32 max_rate, u32 min_rate);
-void mlx5_esw_qos_vport_disable(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
+int mlx5_esw_qos_set_vport_rate(struct mlx5_vport *evport, u32 max_rate, u32 min_rate);
+void mlx5_esw_qos_vport_disable(struct mlx5_vport *vport);
 
 int mlx5_esw_devlink_rate_leaf_tx_share_set(struct devlink_rate *rate_leaf, void *priv,
                                            u64 tx_share, struct netlink_ext_ack *extack);
index 17f78091ad30efea30f33d8c6f785e3138531ce5..4a187f39dabaeeb162fd99f6619bac4d36af853e 100644 (file)
@@ -894,7 +894,7 @@ static void esw_vport_cleanup(struct mlx5_eswitch *esw, struct mlx5_vport *vport
                                              vport_num, 1,
                                              MLX5_VPORT_ADMIN_STATE_DOWN);
 
-       mlx5_esw_qos_vport_disable(esw, vport);
+       mlx5_esw_qos_vport_disable(vport);
        esw_vport_cleanup_acl(esw, vport);
 }
 
index fec9e843f67314a02ef0dffe68e52de9da21418b..567276900a37f88527767335f3f2580953b6d7f1 100644 (file)
@@ -433,8 +433,7 @@ int mlx5_eswitch_set_vport_trust(struct mlx5_eswitch *esw,
                                 u16 vport_num, bool setting);
 int mlx5_eswitch_set_vport_rate(struct mlx5_eswitch *esw, u16 vport,
                                u32 max_rate, u32 min_rate);
-int mlx5_esw_qos_vport_update_group(struct mlx5_eswitch *esw,
-                                   struct mlx5_vport *vport,
+int mlx5_esw_qos_vport_update_group(struct mlx5_vport *vport,
                                    struct mlx5_esw_rate_group *group,
                                    struct netlink_ext_ack *extack);
 int mlx5_eswitch_set_vepa(struct mlx5_eswitch *esw, u8 setting);
@@ -812,7 +811,7 @@ int mlx5_esw_offloads_sf_devlink_port_init(struct mlx5_eswitch *esw, struct mlx5
 void mlx5_esw_offloads_sf_devlink_port_cleanup(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
 
 int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
-void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
+void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_vport *vport);
 struct devlink_port *mlx5_esw_offloads_devlink_port(struct mlx5_eswitch *esw, u16 vport_num);
 
 int mlx5_esw_sf_max_hpf_functions(struct mlx5_core_dev *dev, u16 *max_sfs, u16 *sf_base_id);
index f24f91d213f24c782dfaaa9cef00259f7261ba69..fd34f43d18d583f56337d49201cfe2168e1867d8 100644 (file)
@@ -2617,7 +2617,7 @@ int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vpor
        return err;
 
 load_err:
-       mlx5_esw_offloads_devlink_port_unregister(esw, vport);
+       mlx5_esw_offloads_devlink_port_unregister(vport);
        return err;
 }
 
@@ -2628,7 +2628,7 @@ void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, struct mlx5_vport *v
 
        mlx5_esw_offloads_rep_unload(esw, vport->vport);
 
-       mlx5_esw_offloads_devlink_port_unregister(esw, vport);
+       mlx5_esw_offloads_devlink_port_unregister(vport);
 }
 
 static int esw_set_slave_root_fdb(struct mlx5_core_dev *master,