Commit 5bd8cee2 authored by Eli Cohen's avatar Eli Cohen Committed by Saeed Mahameed
Browse files

net/mlx5: SF, Improve performance in SF allocation



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: default avatarEli Cohen <elic@nvidia.com>
Signed-off-by: default avatarParav Pandit <parav@nvidia.com>
Signed-off-by: default avatarSaeed Mahameed <saeedm@nvidia.com>
parent 6cdc686a
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -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;
		}
	}

	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)