net/mlx5: Reduce number of vport lookups passing vport pointer instead of index
authorJiri Pirko <jiri@nvidia.com>
Wed, 31 May 2023 12:14:50 +0000 (14:14 +0200)
committerSaeed Mahameed <saeedm@nvidia.com>
Wed, 23 Aug 2023 04:34:17 +0000 (21:34 -0700)
During devlink port init/cleanup and register/unregister calls, there
are many lookups of vport. Instead of passing vport_num as argument to
functions, pass the vport struct pointer directly and avoid repeated
lookups.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
Reviewed-by: Shay Drory <shayd@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/esw/devlink_port.c
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 35cf273..2dc7b0b 100644 (file)
@@ -54,18 +54,15 @@ static void mlx5_esw_offloads_pf_vf_devlink_port_attrs_set(struct mlx5_eswitch *
        }
 }
 
-int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num)
+int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw,
+                                             struct mlx5_vport *vport)
 {
        struct mlx5_devlink_port *dl_port;
-       struct mlx5_vport *vport;
+       u16 vport_num = vport->vport;
 
        if (!mlx5_esw_devlink_port_supported(esw, vport_num))
                return 0;
 
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport))
-               return PTR_ERR(vport);
-
        dl_port = kzalloc(sizeof(*dl_port), GFP_KERNEL);
        if (!dl_port)
                return -ENOMEM;
@@ -77,12 +74,10 @@ int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vpor
        return 0;
 }
 
-void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw,
+                                                 struct mlx5_vport *vport)
 {
-       struct mlx5_vport *vport;
-
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport) || !vport->dl_port)
+       if (!vport->dl_port)
                return;
 
        kfree(vport->dl_port);
@@ -113,30 +108,18 @@ static void mlx5_esw_offloads_sf_devlink_port_attrs_set(struct mlx5_eswitch *esw
        devlink_port_attrs_pci_sf_set(dl_port, controller, pfnum, sfnum, !!controller);
 }
 
-int mlx5_esw_offloads_sf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num,
+int mlx5_esw_offloads_sf_devlink_port_init(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                                           struct mlx5_devlink_port *dl_port,
                                           u32 controller, u32 sfnum)
 {
-       struct mlx5_vport *vport;
-
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport))
-               return PTR_ERR(vport);
-
        mlx5_esw_offloads_sf_devlink_port_attrs_set(esw, &dl_port->dl_port, controller, sfnum);
 
        vport->dl_port = dl_port;
        return 0;
 }
 
-void mlx5_esw_offloads_sf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_sf_devlink_port_cleanup(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
-       struct mlx5_vport *vport;
-
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport))
-               return;
-
        vport->dl_port = NULL;
 }
 
@@ -154,20 +137,16 @@ static const struct devlink_port_ops mlx5_esw_dl_sf_port_ops = {
 #endif
 };
 
-int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, u16 vport_num)
+int mlx5_esw_offloads_devlink_port_register(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
        struct mlx5_core_dev *dev = esw->dev;
        const struct devlink_port_ops *ops;
        struct mlx5_devlink_port *dl_port;
+       u16 vport_num = vport->vport;
        unsigned int dl_port_index;
-       struct mlx5_vport *vport;
        struct devlink *devlink;
        int err;
 
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport))
-               return PTR_ERR(vport);
-
        dl_port = vport->dl_port;
        if (!dl_port)
                return 0;
@@ -196,13 +175,11 @@ rate_err:
        return err;
 }
 
-void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
        struct mlx5_devlink_port *dl_port;
-       struct mlx5_vport *vport;
 
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport) || !vport->dl_port)
+       if (!vport->dl_port)
                return;
        dl_port = vport->dl_port;
 
index 044d0ba..5368b33 100644 (file)
@@ -882,16 +882,12 @@ static void esw_vport_cleanup(struct mlx5_eswitch *esw, struct mlx5_vport *vport
        esw_vport_cleanup_acl(esw, vport);
 }
 
-int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, u16 vport_num,
+int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                          enum mlx5_eswitch_vport_event enabled_events)
 {
-       struct mlx5_vport *vport;
+       u16 vport_num = vport->vport;
        int ret;
 
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport))
-               return PTR_ERR(vport);
-
        mutex_lock(&esw->state_lock);
        WARN_ON(vport->enabled);
 
@@ -912,7 +908,7 @@ int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, u16 vport_num,
            (!vport_num && mlx5_core_is_ecpf(esw->dev)))
                vport->info.trusted = true;
 
-       if (!mlx5_esw_is_manager_vport(esw, vport->vport) &&
+       if (!mlx5_esw_is_manager_vport(esw, vport_num) &&
            MLX5_CAP_GEN(esw->dev, vhca_resource_manager)) {
                ret = mlx5_esw_vport_vhca_id_set(esw, vport_num);
                if (ret)
@@ -939,15 +935,12 @@ err_vhca_mapping:
        return ret;
 }
 
-void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
-       struct mlx5_vport *vport;
-
-       vport = mlx5_eswitch_get_vport(esw, vport_num);
-       if (IS_ERR(vport))
-               return;
+       u16 vport_num = vport->vport;
 
        mutex_lock(&esw->state_lock);
+
        if (!vport->enabled)
                goto done;
 
@@ -957,9 +950,9 @@ void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num)
 
        /* Disable events from this vport */
        if (MLX5_CAP_GEN(esw->dev, log_max_l2_table))
-               arm_vport_context_events_cmd(esw->dev, vport->vport, 0);
+               arm_vport_context_events_cmd(esw->dev, vport_num, 0);
 
-       if (!mlx5_esw_is_manager_vport(esw, vport->vport) &&
+       if (!mlx5_esw_is_manager_vport(esw, vport_num) &&
            MLX5_CAP_GEN(esw->dev, vhca_resource_manager))
                mlx5_esw_vport_vhca_id_clear(esw, vport_num);
 
@@ -1068,82 +1061,104 @@ static void mlx5_eswitch_clear_ec_vf_vports_info(struct mlx5_eswitch *esw)
        }
 }
 
-static int mlx5_eswitch_load_vport(struct mlx5_eswitch *esw, u16 vport_num,
+static int mlx5_eswitch_load_vport(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                                   enum mlx5_eswitch_vport_event enabled_events)
 {
        int err;
 
-       err = mlx5_esw_vport_enable(esw, vport_num, enabled_events);
+       err = mlx5_esw_vport_enable(esw, vport, enabled_events);
        if (err)
                return err;
 
-       err = mlx5_esw_offloads_load_rep(esw, vport_num);
+       err = mlx5_esw_offloads_load_rep(esw, vport);
        if (err)
                goto err_rep;
 
        return err;
 
 err_rep:
-       mlx5_esw_vport_disable(esw, vport_num);
+       mlx5_esw_vport_disable(esw, vport);
        return err;
 }
 
-static void mlx5_eswitch_unload_vport(struct mlx5_eswitch *esw, u16 vport_num)
+static void mlx5_eswitch_unload_vport(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
-       mlx5_esw_offloads_unload_rep(esw, vport_num);
-       mlx5_esw_vport_disable(esw, vport_num);
+       mlx5_esw_offloads_unload_rep(esw, vport);
+       mlx5_esw_vport_disable(esw, vport);
 }
 
 static int mlx5_eswitch_load_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num,
                                         enum mlx5_eswitch_vport_event enabled_events)
 {
+       struct mlx5_vport *vport;
        int err;
 
-       err = mlx5_esw_offloads_init_pf_vf_rep(esw, vport_num);
+       vport = mlx5_eswitch_get_vport(esw, vport_num);
+       if (IS_ERR(vport))
+               return PTR_ERR(vport);
+
+       err = mlx5_esw_offloads_init_pf_vf_rep(esw, vport);
        if (err)
                return err;
 
-       err = mlx5_eswitch_load_vport(esw, vport_num, enabled_events);
+       err = mlx5_eswitch_load_vport(esw, vport, enabled_events);
        if (err)
                goto err_load;
        return 0;
 
 err_load:
-       mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport_num);
+       mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport);
        return err;
 }
 
 static void mlx5_eswitch_unload_pf_vf_vport(struct mlx5_eswitch *esw, u16 vport_num)
 {
-       mlx5_eswitch_unload_vport(esw, vport_num);
-       mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport_num);
+       struct mlx5_vport *vport;
+
+       vport = mlx5_eswitch_get_vport(esw, vport_num);
+       if (IS_ERR(vport))
+               return;
+
+       mlx5_eswitch_unload_vport(esw, vport);
+       mlx5_esw_offloads_cleanup_pf_vf_rep(esw, vport);
 }
 
 int mlx5_eswitch_load_sf_vport(struct mlx5_eswitch *esw, u16 vport_num,
                               enum mlx5_eswitch_vport_event enabled_events,
                               struct mlx5_devlink_port *dl_port, u32 controller, u32 sfnum)
 {
+       struct mlx5_vport *vport;
        int err;
 
-       err = mlx5_esw_offloads_init_sf_rep(esw, vport_num, dl_port, controller, sfnum);
+       vport = mlx5_eswitch_get_vport(esw, vport_num);
+       if (IS_ERR(vport))
+               return PTR_ERR(vport);
+
+       err = mlx5_esw_offloads_init_sf_rep(esw, vport, dl_port, controller, sfnum);
        if (err)
                return err;
 
-       err = mlx5_eswitch_load_vport(esw, vport_num, enabled_events);
+       err = mlx5_eswitch_load_vport(esw, vport, enabled_events);
        if (err)
                goto err_load;
 
        return 0;
 
 err_load:
-       mlx5_esw_offloads_cleanup_sf_rep(esw, vport_num);
+       mlx5_esw_offloads_cleanup_sf_rep(esw, vport);
        return err;
 }
 
 void mlx5_eswitch_unload_sf_vport(struct mlx5_eswitch *esw, u16 vport_num)
 {
-       mlx5_eswitch_unload_vport(esw, vport_num);
-       mlx5_esw_offloads_cleanup_sf_rep(esw, vport_num);
+       struct mlx5_vport *vport;
+
+       vport = mlx5_eswitch_get_vport(esw, vport_num);
+       if (IS_ERR(vport))
+               return;
+
+       mlx5_eswitch_unload_vport(esw, vport);
+       mlx5_esw_offloads_cleanup_sf_rep(esw, vport);
 }
 
 void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs)
index b450134..8d03d4f 100644 (file)
@@ -694,9 +694,9 @@ mlx5_eswitch_enable_pf_vf_vports(struct mlx5_eswitch *esw,
                                 enum mlx5_eswitch_vport_event enabled_events);
 void mlx5_eswitch_disable_pf_vf_vports(struct mlx5_eswitch *esw);
 
-int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, u16 vport_num,
+int mlx5_esw_vport_enable(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                          enum mlx5_eswitch_vport_event enabled_events);
-void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, u16 vport_num);
+void mlx5_esw_vport_disable(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
 
 int
 esw_vport_create_offloads_acl_tables(struct mlx5_eswitch *esw,
@@ -734,16 +734,16 @@ void mlx5_esw_set_spec_source_port(struct mlx5_eswitch *esw,
                                   u16 vport,
                                   struct mlx5_flow_spec *spec);
 
-int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num);
-void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num);
+int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
+void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
 
-int mlx5_esw_offloads_init_sf_rep(struct mlx5_eswitch *esw, u16 vport_num,
+int mlx5_esw_offloads_init_sf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                                  struct mlx5_devlink_port *dl_port,
                                  u32 controller, u32 sfnum);
-void mlx5_esw_offloads_cleanup_sf_rep(struct mlx5_eswitch *esw, u16 vport_num);
+void mlx5_esw_offloads_cleanup_sf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
 
-int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, u16 vport_num);
-void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, u16 vport_num);
+int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
+void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport);
 
 int mlx5_eswitch_load_sf_vport(struct mlx5_eswitch *esw, u16 vport_num,
                               enum mlx5_eswitch_vport_event enabled_events,
@@ -754,16 +754,18 @@ int mlx5_eswitch_load_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs,
                                enum mlx5_eswitch_vport_event enabled_events);
 void mlx5_eswitch_unload_vf_vports(struct mlx5_eswitch *esw, u16 num_vfs);
 
-int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num);
-void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num);
+int mlx5_esw_offloads_pf_vf_devlink_port_init(struct mlx5_eswitch *esw,
+                                             struct mlx5_vport *vport);
+void mlx5_esw_offloads_pf_vf_devlink_port_cleanup(struct mlx5_eswitch *esw,
+                                                 struct mlx5_vport *vport);
 
-int mlx5_esw_offloads_sf_devlink_port_init(struct mlx5_eswitch *esw, u16 vport_num,
+int mlx5_esw_offloads_sf_devlink_port_init(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                                           struct mlx5_devlink_port *dl_port,
                                           u32 controller, u32 sfnum);
-void mlx5_esw_offloads_sf_devlink_port_cleanup(struct mlx5_eswitch *esw, u16 vport_num);
+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, u16 vport_num);
-void mlx5_esw_offloads_devlink_port_unregister(struct mlx5_eswitch *esw, u16 vport_num);
+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);
 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 b7ece87..609605c 100644 (file)
@@ -2535,63 +2535,63 @@ static void mlx5_esw_offloads_rep_unload(struct mlx5_eswitch *esw, u16 vport_num
                __esw_offloads_unload_rep(esw, rep, rep_type);
 }
 
-int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num)
+int mlx5_esw_offloads_init_pf_vf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
        if (esw->mode != MLX5_ESWITCH_OFFLOADS)
                return 0;
 
-       return mlx5_esw_offloads_pf_vf_devlink_port_init(esw, vport_num);
+       return mlx5_esw_offloads_pf_vf_devlink_port_init(esw, vport);
 }
 
-void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_cleanup_pf_vf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
        if (esw->mode != MLX5_ESWITCH_OFFLOADS)
                return;
 
-       mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport_num);
+       mlx5_esw_offloads_pf_vf_devlink_port_cleanup(esw, vport);
 }
 
-int mlx5_esw_offloads_init_sf_rep(struct mlx5_eswitch *esw, u16 vport_num,
+int mlx5_esw_offloads_init_sf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport,
                                  struct mlx5_devlink_port *dl_port,
                                  u32 controller, u32 sfnum)
 {
-       return mlx5_esw_offloads_sf_devlink_port_init(esw, vport_num, dl_port, controller, sfnum);
+       return mlx5_esw_offloads_sf_devlink_port_init(esw, vport, dl_port, controller, sfnum);
 }
 
-void mlx5_esw_offloads_cleanup_sf_rep(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_cleanup_sf_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
-       mlx5_esw_offloads_sf_devlink_port_cleanup(esw, vport_num);
+       mlx5_esw_offloads_sf_devlink_port_cleanup(esw, vport);
 }
 
-int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, u16 vport_num)
+int mlx5_esw_offloads_load_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
        int err;
 
        if (esw->mode != MLX5_ESWITCH_OFFLOADS)
                return 0;
 
-       err = mlx5_esw_offloads_devlink_port_register(esw, vport_num);
+       err = mlx5_esw_offloads_devlink_port_register(esw, vport);
        if (err)
                return err;
 
-       err = mlx5_esw_offloads_rep_load(esw, vport_num);
+       err = mlx5_esw_offloads_rep_load(esw, vport->vport);
        if (err)
                goto load_err;
        return err;
 
 load_err:
-       mlx5_esw_offloads_devlink_port_unregister(esw, vport_num);
+       mlx5_esw_offloads_devlink_port_unregister(esw, vport);
        return err;
 }
 
-void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, u16 vport_num)
+void mlx5_esw_offloads_unload_rep(struct mlx5_eswitch *esw, struct mlx5_vport *vport)
 {
        if (esw->mode != MLX5_ESWITCH_OFFLOADS)
                return;
 
-       mlx5_esw_offloads_rep_unload(esw, vport_num);
+       mlx5_esw_offloads_rep_unload(esw, vport->vport);
 
-       mlx5_esw_offloads_devlink_port_unregister(esw, vport_num);
+       mlx5_esw_offloads_devlink_port_unregister(esw, vport);
 }
 
 static int esw_set_slave_root_fdb(struct mlx5_core_dev *master,