drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c

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

File Facts

System
Linux kernel
Corpus path
drivers/net/ethernet/mellanox/mlx5/core/steering/sws/dr_send.c
Extension
.c
Size
34349 bytes
Lines
1319
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

struct dr_data_seg {
	u64 addr;
	u32 length;
	u32 lkey;
	unsigned int send_flags;
};

enum send_info_type {
	WRITE_ICM = 0,
	GTA_ARG   = 1,
};

struct postsend_info {
	enum send_info_type type;
	struct dr_data_seg write;
	struct dr_data_seg read;
	u64 remote_addr;
	u32 rkey;
};

struct dr_qp_rtr_attr {
	struct mlx5dr_cmd_gid_attr dgid_attr;
	enum ib_mtu mtu;
	u32 qp_num;
	u16 port_num;
	u8 min_rnr_timer;
	u8 sgid_index;
	u16 udp_src_port;
	u8 fl:1;
};

struct dr_qp_rts_attr {
	u8 timeout;
	u8 retry_cnt;
	u8 rnr_retry;
};

struct dr_qp_init_attr {
	u32 cqn;
	u32 pdn;
	u32 max_send_wr;
	struct mlx5_uars_page *uar;
	u8 isolate_vl_tc:1;
};

struct mlx5dr_send_info_pool_obj {
	struct mlx5dr_ste_send_info ste_send_info;
	struct mlx5dr_send_info_pool *pool;
	struct list_head list_node;
};

struct mlx5dr_send_info_pool {
	struct list_head free_list;
};

static int dr_send_info_pool_fill(struct mlx5dr_send_info_pool *pool)
{
	struct mlx5dr_send_info_pool_obj *pool_obj, *tmp_pool_obj;
	int i;

	for (i = 0; i < DR_SEND_INFO_POOL_SIZE; i++) {
		pool_obj = kzalloc_obj(*pool_obj);
		if (!pool_obj)
			goto clean_pool;

		pool_obj->pool = pool;
		list_add_tail(&pool_obj->list_node, &pool->free_list);
	}

	return 0;

clean_pool:
	list_for_each_entry_safe(pool_obj, tmp_pool_obj, &pool->free_list, list_node) {
		list_del(&pool_obj->list_node);
		kfree(pool_obj);
	}

	return -ENOMEM;
}

static void dr_send_info_pool_destroy(struct mlx5dr_send_info_pool *pool)
{
	struct mlx5dr_send_info_pool_obj *pool_obj, *tmp_pool_obj;

	list_for_each_entry_safe(pool_obj, tmp_pool_obj, &pool->free_list, list_node) {
		list_del(&pool_obj->list_node);
		kfree(pool_obj);
	}

	kfree(pool);

Annotation

Implementation Notes