drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c

Source file repositories/reference/linux-study-clean/drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/mellanox/mlx5/core/steering/hws/fs_hws.c
Extension
.c
Size
48740 bytes
Lines
1641
Domain
Driver Families
Bucket
drivers/net
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!fs_hws_data) {
			xa_unlock(cache_xa);
			return NULL;
		}
		refcount_set(&fs_hws_data->hws_action_refcount, 0);
		mutex_init(&fs_hws_data->lock);
		err = __xa_insert(cache_xa, index, fs_hws_data, GFP_ATOMIC);
		if (err) {
			kfree(fs_hws_data);
			xa_unlock(cache_xa);
			return NULL;
		}
	}
	xa_unlock(cache_xa);

	return fs_hws_data;
}

static struct mlx5hws_action *
mlx5_fs_get_action_aso_meter(struct mlx5_fs_hws_context *fs_ctx,
			     struct mlx5_exe_aso *exe_aso)
{
	struct mlx5_fs_hws_create_action_ctx create_ctx;
	struct mlx5hws_context *ctx = fs_ctx->hws_ctx;
	struct mlx5_fs_hws_data *meter_hws_data;
	u32 id = exe_aso->base_id;
	struct xarray *meters_xa;

	meters_xa = &fs_ctx->hws_pool.aso_meters;
	meter_hws_data = mlx5_fs_get_cached_hws_data(meters_xa, id);
	if (!meter_hws_data)
		return NULL;

	create_ctx.hws_ctx = ctx;
	create_ctx.actions_type = MLX5HWS_ACTION_TYP_ASO_METER;
	create_ctx.id = id;
	create_ctx.return_reg_id = exe_aso->return_reg_id;

	return mlx5_fs_get_hws_action(meter_hws_data, &create_ctx);
}

static void mlx5_fs_put_action_aso_meter(struct mlx5_fs_hws_context *fs_ctx,
					 struct mlx5_exe_aso *exe_aso)
{
	struct mlx5_fs_hws_data *meter_hws_data;
	struct xarray *meters_xa;

	meters_xa = &fs_ctx->hws_pool.aso_meters;
	meter_hws_data = xa_load(meters_xa, exe_aso->base_id);
	if (!meter_hws_data)
		return;
	return mlx5_fs_put_hws_action(meter_hws_data);
}

static struct mlx5hws_action *
mlx5_fs_get_dest_action_sampler(struct mlx5_fs_hws_context *fs_ctx,
				struct mlx5_flow_rule *dst)
{
	struct mlx5_fs_hws_create_action_ctx create_ctx;
	struct mlx5hws_context *ctx = fs_ctx->hws_ctx;
	struct mlx5_fs_hws_data *sampler_hws_data;
	u32 id = dst->dest_attr.sampler_id;
	struct xarray *sampler_xa;

	sampler_xa = &fs_ctx->hws_pool.sample_dests;
	sampler_hws_data = mlx5_fs_get_cached_hws_data(sampler_xa, id);
	if (!sampler_hws_data)
		return NULL;

	create_ctx.hws_ctx = ctx;
	create_ctx.actions_type = MLX5HWS_ACTION_TYP_SAMPLER;
	create_ctx.id = id;

	return mlx5_fs_get_hws_action(sampler_hws_data, &create_ctx);
}

static void mlx5_fs_put_dest_action_sampler(struct mlx5_fs_hws_context *fs_ctx,
					    u32 sampler_id)
{
	struct mlx5_fs_hws_data *sampler_hws_data;
	struct xarray *sampler_xa;

	sampler_xa = &fs_ctx->hws_pool.sample_dests;
	sampler_hws_data = xa_load(sampler_xa, sampler_id);
	if (!sampler_hws_data)
		return;

	mlx5_fs_put_hws_action(sampler_hws_data);
}

Annotation

Implementation Notes