drivers/infiniband/sw/rxe/rxe_mr.c

Source file repositories/reference/linux-study-clean/drivers/infiniband/sw/rxe/rxe_mr.c

File Facts

System
Linux kernel
Corpus path
drivers/infiniband/sw/rxe/rxe_mr.c
Extension
.c
Size
18263 bytes
Lines
817
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 (persistent && !is_pmem_page(page)) {
			rxe_dbg_mr(mr, "Page can't be persistent\n");
			return -EINVAL;
		}

		mr->page_info[mr->nbuf].page = page;
		mr->page_info[mr->nbuf].offset = 0;
		mr->nbuf++;

		if (!__sg_page_iter_next(&sg_iter))
			break;
	}

	return 0;
}

static int __alloc_mr_page_info(struct rxe_mr *mr, int num_pages)
{
	mr->page_info = kzalloc_objs(struct rxe_mr_page, num_pages);
	if (!mr->page_info)
		return -ENOMEM;

	mr->max_allowed_buf = num_pages;
	mr->nbuf = 0;

	return 0;
}

static int alloc_mr_page_info(struct rxe_mr *mr, int num_pages)
{
	int ret;

	WARN_ON(mr->num_buf);
	ret = __alloc_mr_page_info(mr, num_pages);
	if (ret)
		return ret;

	mr->num_buf = num_pages;

	return 0;
}

static void free_mr_page_info(struct rxe_mr *mr)
{
	if (!mr->page_info)
		return;

	kfree(mr->page_info);
	mr->page_info = NULL;
}

int rxe_mr_init_user(struct rxe_dev *rxe, u64 start, u64 length,
		     int access, struct rxe_mr *mr)
{
	struct ib_umem *umem;
	int err;

	rxe_mr_init(access, mr);

	umem = ib_umem_get_va(&rxe->ib_dev, start, length, access);
	if (IS_ERR(umem)) {
		rxe_dbg_mr(mr, "Unable to pin memory region err = %d\n",
			(int)PTR_ERR(umem));
		return PTR_ERR(umem);
	}

	err = alloc_mr_page_info(mr, ib_umem_num_pages(umem));
	if (err)
		goto err2;

	err = rxe_mr_fill_pages_from_sgt(mr, &umem->sgt_append.sgt);
	if (err)
		goto err1;

	mr->umem = umem;
	mr->ibmr.type = IB_MR_TYPE_USER;
	mr->state = RXE_MR_STATE_VALID;

	return 0;
err1:
	free_mr_page_info(mr);
err2:
	ib_umem_release(umem);
	return err;
}

int rxe_mr_init_fast(int max_pages, struct rxe_mr *mr)
{
	int err;

Annotation

Implementation Notes