net/mlx5: SF, Improve performance in SF allocation
authorEli Cohen <elic@nvidia.com>
Mon, 26 Apr 2021 06:58:55 +0000 (09:58 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Sat, 26 Jun 2021 07:31:20 +0000 (00:31 -0700)
Avoid second traversal on the SF table by recording the first free entry
and using it in case the looked up entry was not found in the table.

Signed-off-by: Eli Cohen <elic@nvidia.com>
Signed-off-by: Parav Pandit <parav@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/sf/hw_table.c

index 500c71fb6f6d866afd04caa114c84e1767f6c0f7..d9c69123c1abc4c4bc7a5bbbaf54ef01cefacf08 100644 (file)
@@ -73,26 +73,29 @@ static int mlx5_sf_hw_table_id_alloc(struct mlx5_sf_hw_table *table, u32 control
                                     u32 usr_sfnum)
 {
        struct mlx5_sf_hwc_table *hwc;
+       int free_idx = -1;
        int i;
 
        hwc = mlx5_sf_controller_to_hwc(table->dev, controller);
        if (!hwc->sfs)
                return -ENOSPC;
 
-       /* Check if sf with same sfnum already exists or not. */
        for (i = 0; i < hwc->max_fn; i++) {
+               if (!hwc->sfs[i].allocated && free_idx == -1) {
+                       free_idx = i;
+                       continue;
+               }
+
                if (hwc->sfs[i].allocated && hwc->sfs[i].usr_sfnum == usr_sfnum)
                        return -EEXIST;
        }
-       /* Find the free entry and allocate the entry from the array */
-       for (i = 0; i < hwc->max_fn; i++) {
-               if (!hwc->sfs[i].allocated) {
-                       hwc->sfs[i].usr_sfnum = usr_sfnum;
-                       hwc->sfs[i].allocated = true;
-                       return i;
-               }
-       }
-       return -ENOSPC;
+
+       if (free_idx == -1)
+               return -ENOSPC;
+
+       hwc->sfs[free_idx].usr_sfnum = usr_sfnum;
+       hwc->sfs[free_idx].allocated = true;
+       return free_idx;
 }
 
 static void mlx5_sf_hw_table_id_free(struct mlx5_sf_hw_table *table, u32 controller, int id)