[Openib-windows] [PATCH] MTHCA: Support kernel virtual memory registration

Fab Tillier ftillier at silverstorm.com
Fri Aug 11 14:55:09 PDT 2006


Hi Leonid,

Here is a patch that enables kernel clients to register virtual memory
regions.  Note that this change was actually quite a bit simpler than I
anticipated.  I have tested this with the SRP driver and validated that it
works.

Please apply, or let me know if you have any questions about it.

Thanks!

- Fab

Index: hw/mthca/kernel/ib_verbs.h
===================================================================
--- hw/mthca/kernel/ib_verbs.h	(revision 445)
+++ hw/mthca/kernel/ib_verbs.h	(working copy)
@@ -776,8 +776,9 @@
 						  int num_phys_buf,
 						  mthca_qp_access_t
mr_access_flags,
 						  u64 *iova_start);
-	struct ib_mr *             (*reg_user_mr)(struct ib_pd *pd, 
-						void* __ptr64	vaddr,
uint64_t length, uint64_t hca_va, mthca_qp_access_t acc);
+	struct ib_mr *             (*reg_virt_mr)(struct ib_pd *pd, 
+						void* __ptr64	vaddr,
uint64_t length, uint64_t hca_va,
+						mthca_qp_access_t acc,
boolean_t um_call);
 	int                        (*query_mr)(struct ib_mr *mr,
 					       struct ib_mr_attr *mr_attr);
 	int                        (*dereg_mr)(struct ib_mr *mr);
Index: hw/mthca/kernel/mt_verbs.c
===================================================================
--- hw/mthca/kernel/mt_verbs.c	(revision 445)
+++ hw/mthca/kernel/mt_verbs.c	(working copy)
@@ -625,14 +625,8 @@
 	struct ib_mr *ib_mr;
 	int                          err;
 	HCA_ENTER(HCA_DBG_MEMORY);
-	/* sanity check */
-	if (!um_call) {
-		err = -ENOSYS;
-		HCA_PRINT(TRACE_LEVEL_ERROR,HCA_DBG_MEMORY ,("ibv_reg_mr for
kernel mode is not supported (%d)\n", err));
-		goto err_not_supported;
-	}
 
-	ib_mr = pd->device->reg_user_mr(pd, vaddr, length, hca_va,
mr_access_flags);
+	ib_mr = pd->device->reg_virt_mr(pd, vaddr, length, hca_va,
mr_access_flags, um_call);
 	if (IS_ERR(ib_mr)) {
 		err = PTR_ERR(ib_mr);
 		HCA_PRINT(TRACE_LEVEL_ERROR,HCA_DBG_MEMORY
,("mthca_reg_user_mr failed (%d)\n", err));
@@ -649,7 +643,6 @@
 	return ib_mr;
 
 err_reg_user_mr:
-err_not_supported:
 	HCA_EXIT(HCA_DBG_MEMORY);
 	return ERR_PTR(err);
 }
Index: hw/mthca/kernel/hca_memory.c
===================================================================
--- hw/mthca/kernel/hca_memory.c	(revision 445)
+++ hw/mthca/kernel/hca_memory.c	(working copy)
@@ -408,7 +408,7 @@
 	if (err) {
 		status = errno_to_iberr(err);
 		HCA_PRINT(TRACE_LEVEL_ERROR  , HCA_DBG_MEMORY  ,
-			("mthca_dereg_mr failed (%d) for mr %p\n",	err,
h_fmr));
+			("ibv_map_phys_fmr failed (%d) for mr %p\n",	err,
h_fmr));
 		goto err_dealloc_fmr;
 	}
 
@@ -494,7 +494,7 @@
 	if (err) {
 		status = errno_to_iberr(err);
 		HCA_PRINT(TRACE_LEVEL_ERROR  , HCA_DBG_MEMORY  ,
-			("mthca_dereg_mr failed (%d) for mr %p\n",	err,
h_fmr));
+			("ibv_dealloc_fmr failed (%d) for mr %p\n",	err,
h_fmr));
 		goto err_dealloc_fmr;
 	}
 
Index: hw/mthca/kernel/mt_memory.c
===================================================================
--- hw/mthca/kernel/mt_memory.c	(revision 445)
+++ hw/mthca/kernel/mt_memory.c	(working copy)
@@ -375,15 +375,15 @@
 	// make context-dependent things
 	if (is_user) {
 		ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);
-	mode = UserMode;
+		mode = UserMode;
 	}
 	else {  /* Mapping to kernel virtual address */
 		//    MmBuildMdlForNonPagedPool(mdl_p);   // fill MDL ??? -
should we do that really ?
-	mode = KernelMode;
+		mode = KernelMode;
 	}
 
 	__try { /* try */
-	MmProbeAndLockPages( mdl_p, mode, Operation );   /* lock memory */
+		MmProbeAndLockPages( mdl_p, mode, Operation );   /* lock
memory */
 	} /* try */
 		
 	__except (EXCEPTION_EXECUTE_HANDLER)	{
@@ -431,10 +431,6 @@
 
 	ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL);
 
-	// init IOBUF object
-	InitializeListHead( &iobuf_p->seg_que );
-	iobuf_p->seg_num = 0;
-
 	// Round the seg_va down to a page boundary so that we always get a
seg_size
 	// that is an integral number of pages.
 	delta = va & (PAGE_SIZE - 1);
Index: hw/mthca/kernel/mthca_provider.c
===================================================================
--- hw/mthca/kernel/mthca_provider.c	(revision 445)
+++ hw/mthca/kernel/mthca_provider.c	(working copy)
@@ -876,6 +876,10 @@
 		return ERR_PTR(-ENOMEM);
 	RtlZeroMemory(mr, sizeof *mr);
 
+	// init IOBUF object
+	InitializeListHead( &mr->iobuf.seg_que );
+	mr->iobuf.seg_num = 0;
+
 	err = mthca_mr_alloc_notrans(to_mdev(pd->device),
 				     to_mpd(pd)->pd_num,
 				     map_qp_mpt(acc), mr);
@@ -945,6 +949,10 @@
 		return ERR_PTR(-ENOMEM);
 	RtlZeroMemory(mr, sizeof *mr);
 
+	// init IOBUF object
+	InitializeListHead( &mr->iobuf.seg_que );
+	mr->iobuf.seg_num = 0;
+
 	npages = 0;
 	for (i = 0; i < num_phys_buf; ++i)
 		npages += (int)((buffer_list[i].size + (1Ui64 << shift) - 1)
>> shift);
@@ -988,8 +996,9 @@
 	return &mr->ibmr;
 }
 
-struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, 
-	void* __ptr64	vaddr, uint64_t length, uint64_t hca_va,
mthca_qp_access_t acc)
+struct ib_mr *mthca_reg_virt_mr(struct ib_pd *pd, 
+	void* __ptr64	vaddr, uint64_t length, uint64_t hca_va,
+	mthca_qp_access_t acc, boolean_t um_call)
 {
 	struct mthca_dev *dev = to_mdev(pd->device);
 	struct mthca_mr *mr;
@@ -1007,13 +1016,16 @@
 
 	HCA_ENTER(HCA_DBG_MEMORY);
 
-
 	mr = kzalloc(sizeof *mr, GFP_KERNEL);
 	if (!mr) {
 		err = -ENOMEM;
 		goto err_nomem;
 	}
 
+	// init IOBUF object
+	InitializeListHead( &mr->iobuf.seg_que );
+	mr->iobuf.seg_num = 0;
+
 	/*
 	 * We ask for writable memory if any access flags other than
 	 * "remote read" are set.  "Local write" and "remote write"
@@ -1024,7 +1036,7 @@
 
 	// try register the buffer
 	iobuf_p = &mr->iobuf;
-	err =  iobuf_register( (u64)vaddr, length, TRUE, 
+	err =  iobuf_register( (u64)vaddr, length, um_call, 
 		(acc & ~MTHCA_ACCESS_REMOTE_READ) ? IB_AC_LOCAL_WRITE : 0,
iobuf_p );
 	if (err)
 		goto err_reg_mem;
@@ -1117,13 +1129,11 @@
 	struct mthca_mr *mmr = to_mmr(mr);
 	struct mthca_dev* dev = to_mdev(mr->device);
 
-	if (mr->pd->ucontext) {
-		MmUnsecureVirtualMemory ( mmr->secure_handle );
-		mthca_free_mr(dev, mmr);
-		iobuf_deregister(&mmr->iobuf);
-	}
-	else
-		mthca_free_mr(dev, mmr);
+	if (mr->pd->ucontext)
+		MmUnsecureVirtualMemory( mmr->secure_handle );
+
+	mthca_free_mr(dev, mmr);
+	iobuf_deregister(&mmr->iobuf);
 	kfree(mmr);
 	return 0;
 }
@@ -1272,7 +1282,7 @@
 	dev->ib_dev.poll_cq              = mthca_poll_cq;
 	dev->ib_dev.get_dma_mr           = mthca_get_dma_mr;
 	dev->ib_dev.reg_phys_mr          = mthca_reg_phys_mr;
-	dev->ib_dev.reg_user_mr          = mthca_reg_user_mr;
+	dev->ib_dev.reg_virt_mr          = mthca_reg_virt_mr;
 	dev->ib_dev.dereg_mr             = mthca_dereg_mr;
 
 	if (dev->mthca_flags & MTHCA_FLAG_FMR) {
Index: hw/mthca/kernel/mthca_provider.h
===================================================================
--- hw/mthca/kernel/mthca_provider.h	(revision 445)
+++ hw/mthca/kernel/mthca_provider.h	(working copy)
@@ -420,8 +420,9 @@
 				       mthca_qp_access_t
acc,
 				       u64                *iova_start);
 
-struct ib_mr *mthca_reg_user_mr(struct ib_pd *pd, 
-	 void* __ptr64	vaddr, uint64_t	length, uint64_t hca_va,
mthca_qp_access_t acc);
+struct ib_mr *mthca_reg_virt_mr(struct ib_pd *pd, 
+	 void* __ptr64	vaddr, uint64_t	length, uint64_t hca_va,
+	 mthca_qp_access_t acc, boolean_t um_call);
 
 int mthca_dereg_mr(struct ib_mr *mr);

-------------- next part --------------
A non-text attachment was scrubbed...
Name: mthca_reg_virt.patch
Type: application/octet-stream
Size: 6956 bytes
Desc: not available
URL: <http://lists.openfabrics.org/pipermail/ofw/attachments/20060811/f2435ffb/attachment.obj>


More information about the ofw mailing list