drivers/infiniband/hw/mlx5/restrack.c

Source file repositories/reference/linux-study-clean/drivers/infiniband/hw/mlx5/restrack.c

File Facts

System
Linux kernel
Corpus path
drivers/infiniband/hw/mlx5/restrack.c
Extension
.c
Size
4965 bytes
Lines
215
Domain
Driver Families
Bucket
drivers/infiniband
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 (cmd_err < 0 || size + offset > MAX_DUMP_SIZE) {
			err = cmd_err;
			goto destroy_cmd;
		}
		memcpy(data + offset, page_address(page), size);
		offset += size;
	} while (cmd_err > 0);
	*data_len = offset;

destroy_cmd:
	mlx5_rsc_dump_cmd_destroy(cmd);
free_page:
	__free_page(page);
	return err;
}

static int fill_res_raw(struct sk_buff *msg, struct mlx5_ib_dev *dev,
			enum mlx5_sgmt_type type, u32 key)
{
	int len = 0;
	void *data;
	int err;

	data = kzalloc(MAX_DUMP_SIZE, GFP_KERNEL);
	if (!data)
		return -ENOMEM;

	err = dump_rsc(dev->mdev, type, key, data, &len);
	if (err)
		goto out;

	err = nla_put(msg, RDMA_NLDEV_ATTR_RES_RAW, len, data);
out:
	kfree(data);
	return err;
}

static int fill_stat_mr_entry(struct sk_buff *msg, struct ib_mr *ibmr)
{
	struct mlx5_ib_mr *mr = to_mmr(ibmr);
	struct nlattr *table_attr;

	if (!(mr->access_flags & IB_ACCESS_ON_DEMAND))
		return 0;

	table_attr = nla_nest_start(msg,
				    RDMA_NLDEV_ATTR_STAT_HWCOUNTERS);

	if (!table_attr)
		goto err;

	if (rdma_nl_stat_hwcounter_entry(msg, "page_faults",
					 atomic64_read(&mr->odp_stats.faults)))
		goto err_table;
	if (rdma_nl_stat_hwcounter_entry(
		    msg, "page_faults_handled",
		    atomic64_read(&mr->odp_stats.faults_handled)))
		goto err_table;
	if (rdma_nl_stat_hwcounter_entry(
		    msg, "page_invalidations",
		    atomic64_read(&mr->odp_stats.invalidations)))
		goto err_table;
	if (rdma_nl_stat_hwcounter_entry(
		    msg, "page_invalidations_handled",
		    atomic64_read(&mr->odp_stats.invalidations_handled)))
		goto err_table;

	if (rdma_nl_stat_hwcounter_entry(msg, "page_prefetch",
					 atomic64_read(&mr->odp_stats.prefetch)))
		goto err_table;

	nla_nest_end(msg, table_attr);
	return 0;

err_table:
	nla_nest_cancel(msg, table_attr);
err:
	return -EMSGSIZE;
}

static int fill_res_mr_entry_raw(struct sk_buff *msg, struct ib_mr *ibmr)
{
	struct mlx5_ib_mr *mr = to_mmr(ibmr);

	return fill_res_raw(msg, mr_to_mdev(mr), MLX5_SGMT_TYPE_PRM_QUERY_MKEY,
			    mlx5_mkey_to_idx(mr->mmkey.key));
}

static int fill_res_mr_entry(struct sk_buff *msg, struct ib_mr *ibmr)
{

Annotation

Implementation Notes