[openib-general] [PATCH] kDAPL: consolidate lmr files into one

Tom Duffy tduffy at sun.com
Tue May 24 16:28:19 PDT 2005


On Tue, 2005-05-24 at 17:53 -0400, James Lentini wrote:
> I'd suggest starting with the memory subsystem. Do you want to do the 
> lmr files?

OK, here goes.  Remember that you will need to

svn delete dapl_lmr_free.c dapl_lmr_kcreate.c dapl_lmr_query.c \
dapl_lmr_sync_rdma_read.c dapl_lmr_sync_rdma_write.c dapl_lmr_util.c \
dapl_lmr_util.h

svn add dapl_lmr.c

Signed-off-by: Tom Duffy <tduffy at sun.com>

 dat-provider/Makefile                   |    7
 dat-provider/dapl_lmr.c                 |  618 ++++++++++++++++++++++++++++++++
 dat-provider/dapl_lmr_free.c            |  119 ------
 dat-provider/dapl_lmr_kcreate.c         |  395 --------------------
 dat-provider/dapl_lmr_query.c           |   60 ---
 dat-provider/dapl_lmr_sync_rdma_read.c  |   75 ---
 dat-provider/dapl_lmr_sync_rdma_write.c |   60 ---
 dat-provider/dapl_lmr_util.c            |   85 ----
 dat-provider/dapl_lmr_util.h            |   45 --
 dat-provider/dapl_openib_util.c         |    1
 patches/alt_dat_provider_makefile       |   12
 11 files changed, 621 insertions(+), 856 deletions(-)

Index: linux-kernel-lmr/dat-provider/dapl_lmr_sync_rdma_read.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_sync_rdma_read.c	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_sync_rdma_read.c	(working copy)
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#include "dapl.h"
-#include "dapl_ia_util.h"
-
-/*
- * dat_lmr_sync_rdma_read
- *
- * Ensure a region of memory is consistent by locally flushing
- * non-coherent cache
- *
- * Input:
- *	ia_handle
- *	local_segments		Array of buffer segments
- *	num_segments		Number of segments in local_segments
- *
- * Output:
- *	none
- *
- * Return Values:
- * 	DAT_SUCCESS
- * 	DAT_INVALID_HANDLE
- * 	DAT_INVALID_PARAMETER
- */
-u32 dapl_lmr_sync_rdma_read(DAT_IA_HANDLE ia_handle,
-			    const struct dat_lmr_triplet *local_segments,
-			    u64 num_segments)
-{
-	struct dapl_ia *ia_ptr;
-	u32 dat_status = DAT_SUCCESS;
-
-	dapl_dbg_log(DAPL_DBG_TYPE_API,
-		     "dat_lmr_sync_rdma_read (%p, %p, %ld)\n",
-		     ia_handle, local_segments, num_segments);
-
-	ia_ptr = (struct dapl_ia *)ia_handle;
-
-	if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) {
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
-		goto bail;
-	}
-
-bail:
-	return dat_status;
-}
Index: linux-kernel-lmr/dat-provider/dapl_lmr_util.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_util.c	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_util.c	(working copy)
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#include "dapl_lmr_util.h"
-#include "dapl_ia_util.h"
-
-struct dapl_lmr *dapl_lmr_alloc(struct dapl_ia *ia, enum dat_mem_type mem_type,
-				DAT_REGION_DESCRIPTION region_desc, u64 length,
-				DAT_PZ_HANDLE pz_handle,
-				enum dat_mem_priv_flags mem_priv)
-{
-	struct dapl_lmr *lmr;
-
-	/* Allocate LMR */
-	lmr = kmalloc(sizeof *lmr, GFP_ATOMIC);
-	if (!lmr)
-		return NULL;
-
-	/* zero the structure */
-	memset(lmr, 0, sizeof *lmr);
-
-	/*
-	 * initialize the header
-	 */
-	lmr->header.provider = ia->header.provider;
-	lmr->header.magic = DAPL_MAGIC_LMR;
-	lmr->header.handle_type = DAT_HANDLE_TYPE_LMR;
-	lmr->header.owner_ia = ia;
-	lmr->header.user_context.as_64 = 0;
-	lmr->header.user_context.as_ptr = NULL;
-	dapl_llist_init_entry(&lmr->header.ia_list_entry);
-	dapl_ia_link_lmr(ia, lmr);
-	spin_lock_init(&lmr->header.lock);
-
-	/* 
-	 * initialize the body 
-	 */
-	lmr->param.ia_handle = (DAT_IA_HANDLE) ia;
-	lmr->param.mem_type = mem_type;
-	lmr->param.region_desc = region_desc;
-	lmr->param.length = length;
-	lmr->param.pz_handle = pz_handle;
-	lmr->param.mem_priv = mem_priv;
-	atomic_set(&lmr->lmr_ref_count, 0);
-
-	return lmr;
-}
-
-void dapl_lmr_dealloc(struct dapl_lmr *lmr)
-{
-	/* reset magic to prevent reuse */
-	lmr->header.magic = DAPL_MAGIC_INVALID;
-	dapl_ia_unlink_lmr(lmr->header.owner_ia, lmr);
-	/* no need to destroy lmr->header.lock */
-
-	kfree(lmr);
-}
Index: linux-kernel-lmr/dat-provider/Makefile
===================================================================
--- linux-kernel-lmr/dat-provider/Makefile	(revision 2476)
+++ linux-kernel-lmr/dat-provider/Makefile	(working copy)
@@ -22,7 +22,6 @@ PROVIDER_MODULES := \
         dapl_evd_kquery               	\
         dapl_evd_kcreate              	\
         dapl_evd_modify_upcall        	\
-        dapl_lmr_kcreate		\
 	dapl_cookie   		      	\
 	dapl_cno_util			\
         dapl_cr_accept                	\
@@ -67,11 +66,7 @@ PROVIDER_MODULES := \
         dapl_ia_query                 	\
         dapl_ia_util                  	\
         dapl_llist                    	\
-        dapl_lmr_free                 	\
-        dapl_lmr_query                	\
-        dapl_lmr_sync_rdma_read       	\
-        dapl_lmr_sync_rdma_write      	\
-        dapl_lmr_util                 	\
+        dapl_lmr                 	\
         dapl_mr_util                  	\
         dapl_provider                 	\
         dapl_sp_util                  	\
Index: linux-kernel-lmr/dat-provider/dapl_lmr_util.h
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_util.h	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_util.h	(working copy)
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#ifndef DAPL_LMR_UTIL_H
-#define DAPL_LMR_UTIL_H
-
-#include "dapl_mr_util.h"
-
-extern struct dapl_lmr *dapl_lmr_alloc(struct dapl_ia *ia,
-				       enum dat_mem_type mem_type,
-				       DAT_REGION_DESCRIPTION region_desc,
-				       u64 length, DAT_PZ_HANDLE pz_handle,
-				       enum dat_mem_priv_flags mem_priv);
-
-extern void dapl_lmr_dealloc(struct dapl_lmr *lmr);
-
-#endif /* DAPL_LMR_UTIL_H */
Index: linux-kernel-lmr/dat-provider/dapl_lmr_query.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_query.c	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_query.c	(working copy)
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#include "dapl.h"
-
-u32 dapl_lmr_query(DAT_LMR_HANDLE lmr_handle, struct dat_lmr_param *lmr_param)
-{
-	struct dapl_lmr *lmr;
-	u32 dat_status;
-
-	dapl_dbg_log(DAPL_DBG_TYPE_API,
-		     "dapl_lmr_query (%p, %p)\n",
-		     lmr_handle, lmr_param);
-
-	if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) {
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR);
-		goto bail;
-	}
-	if (NULL == lmr_param) {
-		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
-		goto bail;
-	}
-
-	dat_status = DAT_SUCCESS;
-	lmr = (struct dapl_lmr *)lmr_handle;
-
-	memcpy(lmr_param, &lmr->param, sizeof *lmr_param);
-
-bail:
-	return dat_status;
-}
Index: linux-kernel-lmr/dat-provider/dapl_openib_util.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_openib_util.c	(revision 2476)
+++ linux-kernel-lmr/dat-provider/dapl_openib_util.c	(working copy)
@@ -37,7 +37,6 @@
 #include "dapl_openib_util.h"
 #include "dapl_evd_util.h"
 #include "dapl_cr_util.h"
-#include "dapl_lmr_util.h"
 #include "dapl_rmr_util.h"
 #include "dapl_cookie.h"
 #include "dapl_openib_cm.h"
Index: linux-kernel-lmr/dat-provider/dapl_lmr.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr.c	(revision 0)
+++ linux-kernel-lmr/dat-provider/dapl_lmr.c	(revision 0)
@@ -0,0 +1,618 @@
+/*
+ * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
+ *
+ * This Software is licensed under one of the following licenses:
+ *
+ * 1) under the terms of the "Common Public License 1.0" a copy of which is
+ *    available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/cpl.php.
+ *
+ * 2) under the terms of the "The BSD License" a copy of which is
+ *    available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/bsd-license.php.
+ *
+ * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
+ *    copy of which is available from the Open Source Initiative, see
+ *    http://www.opensource.org/licenses/gpl-license.php.
+ *
+ * Licensee has the right to choose one of the above licenses.
+ *
+ * Redistributions of source code must retain the above copyright
+ * notice and one of the license notices.
+ *
+ * Redistributions in binary form must reproduce both the above copyright
+ * notice, one of the license notices in the documentation
+ * and/or other materials provided with the distribution.
+ */
+
+/*
+ * $Id: dapl_lmr.c 2433 2005-05-21 04:11:03Z jlentini $
+ */
+
+#include "dapl_openib_util.h"
+#include "dapl_ia_util.h"
+#include "dapl_hash.h"
+
+static struct dapl_lmr *dapl_lmr_alloc(struct dapl_ia *ia,
+				       enum dat_mem_type mem_type,
+				       DAT_REGION_DESCRIPTION region_desc,
+				       u64 length, DAT_PZ_HANDLE pz_handle,
+				       enum dat_mem_priv_flags mem_priv)
+{
+	struct dapl_lmr *lmr;
+
+	/* Allocate LMR */
+	lmr = kmalloc(sizeof *lmr, GFP_ATOMIC);
+	if (!lmr)
+		return NULL;
+
+	/* zero the structure */
+	memset(lmr, 0, sizeof *lmr);
+
+	/*
+	 * initialize the header
+	 */
+	lmr->header.provider = ia->header.provider;
+	lmr->header.magic = DAPL_MAGIC_LMR;
+	lmr->header.handle_type = DAT_HANDLE_TYPE_LMR;
+	lmr->header.owner_ia = ia;
+	lmr->header.user_context.as_64 = 0;
+	lmr->header.user_context.as_ptr = NULL;
+	dapl_llist_init_entry(&lmr->header.ia_list_entry);
+	dapl_ia_link_lmr(ia, lmr);
+	spin_lock_init(&lmr->header.lock);
+
+	/* 
+	 * initialize the body 
+	 */
+	lmr->param.ia_handle = (DAT_IA_HANDLE) ia;
+	lmr->param.mem_type = mem_type;
+	lmr->param.region_desc = region_desc;
+	lmr->param.length = length;
+	lmr->param.pz_handle = pz_handle;
+	lmr->param.mem_priv = mem_priv;
+	atomic_set(&lmr->lmr_ref_count, 0);
+
+	return lmr;
+}
+
+static void dapl_lmr_dealloc(struct dapl_lmr *lmr)
+{
+	/* reset magic to prevent reuse */
+	lmr->header.magic = DAPL_MAGIC_INVALID;
+	dapl_ia_unlink_lmr(lmr->header.owner_ia, lmr);
+	/* no need to destroy lmr->header.lock */
+
+	kfree(lmr);
+}
+
+/*
+ * dapl_lmr_free
+ *
+ * Destroy an instance of the Local Memory Region
+ *
+ * Input:
+ * 	lmr_handle
+ *
+ * Output:
+ *
+ * Returns:
+ * 	DAT_SUCCESS
+ *      DAT_INVALID_HANDLE
+ * 	DAT_INVALID_PARAMETER
+ * 	DAT_INVALID_STATE 
+ */
+
+u32 dapl_lmr_free(DAT_LMR_HANDLE lmr_handle)
+{
+	struct dapl_lmr *lmr;
+	u32 dat_status;
+
+	dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_free (%p)\n", lmr_handle);
+
+	if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) {
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR);
+		goto bail;
+	}
+
+	lmr = (struct dapl_lmr *)lmr_handle;
+
+	switch (lmr->param.mem_type) {
+	case DAT_MEM_TYPE_PHYSICAL:
+	case DAT_MEM_TYPE_VIRTUAL:
+	case DAT_MEM_TYPE_LMR:
+		{
+			struct dapl_pz *pz;
+
+			if (0 != atomic_read(&lmr->lmr_ref_count))
+				return DAT_INVALID_STATE;
+
+			dat_status =
+			    dapl_hash_remove(lmr->header.owner_ia->hca_ptr->
+					     lmr_hash_table,
+					     lmr->param.lmr_context, NULL);
+			if (dat_status != DAT_SUCCESS)
+				goto bail;
+
+			dat_status = dapl_ib_mr_deregister(lmr);
+
+			if (dat_status == DAT_SUCCESS) {
+
+				pz = (struct dapl_pz *)lmr->param.pz_handle;
+				atomic_dec(&pz->pz_ref_count);
+
+				dapl_lmr_dealloc(lmr);
+			} else
+				/*
+				 * Deregister failed; put it back in the
+				 * hash table.
+				 */
+				dapl_hash_insert(lmr->header.owner_ia->
+						 hca_ptr->lmr_hash_table,
+						 lmr->param.lmr_context, lmr);
+
+			break;
+		}
+	case DAT_MEM_TYPE_PLATFORM:
+	case DAT_MEM_TYPE_IA:
+	case DAT_MEM_TYPE_BYPASS:
+		return DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
+	default:
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1);
+		break;
+	}
+bail:
+	return dat_status;
+}
+
+static inline u32 dapl_lmr_create_virtual(struct dapl_ia *ia, void *virt_addr,
+					  u64 length, struct dapl_pz *pz,
+					  enum dat_mem_priv_flags privileges,
+					  DAT_LMR_HANDLE *lmr_handle,
+					  DAT_LMR_CONTEXT *lmr_context,
+					  DAT_RMR_CONTEXT *rmr_context,
+					  u64 *registered_length,
+					  u64 *registered_address)
+{
+	struct dapl_lmr *lmr;
+	DAT_REGION_DESCRIPTION reg_desc;
+	u32 dat_status = DAT_SUCCESS;
+
+	reg_desc.for_va = virt_addr;
+
+	lmr = dapl_lmr_alloc(ia,
+			     DAT_MEM_TYPE_VIRTUAL,
+			     reg_desc, length, (DAT_PZ_HANDLE) pz, privileges);
+
+	if (NULL == lmr) {
+		dat_status =
+		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
+		goto bail;
+	}
+
+	dat_status = dapl_ib_mr_register(ia,
+					 lmr, virt_addr, length, privileges);
+
+	if (DAT_SUCCESS != dat_status) {
+		dapl_lmr_dealloc(lmr);
+		goto bail;
+	}
+
+	/* if the LMR context is already in the hash table */
+	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
+				      lmr->param.lmr_context, NULL);
+	if (dat_status == DAT_SUCCESS) {
+		(void)dapl_ib_mr_deregister(lmr);
+		dapl_lmr_dealloc(lmr);
+
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_LMR_IN_USE);
+		goto bail;
+	}
+
+	dat_status = dapl_hash_insert(ia->hca_ptr->lmr_hash_table,
+				      lmr->param.lmr_context, lmr);
+	if (dat_status != DAT_SUCCESS) {
+		(void)dapl_ib_mr_deregister(lmr);
+		dapl_lmr_dealloc(lmr);
+
+		/* The value returned by dapl_hash_insert(.) is not    */
+		/* returned to the consumer because the spec. requires */
+		/* that dat_lmr_create(.) return only certain values.  */
+		dat_status =
+		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
+		goto bail;
+	}
+
+	atomic_inc(&pz->pz_ref_count);
+
+	if (lmr_handle)
+		*lmr_handle = (DAT_LMR_HANDLE) lmr;
+	if (lmr_context)
+		*lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context;
+	if (rmr_context)
+		*rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context;
+	if (registered_address)
+		*registered_address = (u64)(unsigned long) virt_addr;
+	if (registered_length)
+		*registered_length = length;
+
+bail:
+	return dat_status;
+
+}
+
+static inline u32 dapl_lmr_create_physical(struct dapl_ia *ia,
+					   DAT_REGION_DESCRIPTION phys_addr,
+					   u64 page_count, struct dapl_pz *pz,
+					   enum dat_mem_priv_flags privileges,
+					   DAT_LMR_HANDLE *lmr_handle,
+					   DAT_LMR_CONTEXT *lmr_context,
+					   DAT_RMR_CONTEXT *rmr_context,
+					   u64 *registered_length,
+					   u64 *registered_address)
+{
+	struct dapl_lmr *lmr;
+	u32 dat_status = DAT_SUCCESS;
+	u64 *array = phys_addr.for_array;
+
+	lmr = dapl_lmr_alloc(ia,
+			     DAT_MEM_TYPE_PHYSICAL,
+			     phys_addr,
+			     page_count, (DAT_PZ_HANDLE) pz, privileges);
+
+	if (NULL == lmr) {
+		dat_status =
+		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
+		goto bail;
+	}
+
+	dat_status = dapl_ib_mr_register_physical(ia, lmr, phys_addr.for_array,
+						  page_count, privileges);
+
+	if (DAT_SUCCESS != dat_status) {
+		dapl_lmr_dealloc(lmr);
+		goto bail;
+	}
+
+	/* if the LMR context is already in the hash table */
+	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
+				      lmr->param.lmr_context, NULL);
+	if (dat_status == DAT_SUCCESS) {
+		(void)dapl_ib_mr_deregister(lmr);
+		dapl_lmr_dealloc(lmr);
+
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_LMR_IN_USE);
+		goto bail;
+	}
+
+	dat_status = dapl_hash_insert(ia->hca_ptr->lmr_hash_table,
+				      lmr->param.lmr_context, lmr);
+	if (dat_status != DAT_SUCCESS) {
+		(void)dapl_ib_mr_deregister(lmr);
+		dapl_lmr_dealloc(lmr);
+
+		/* The value returned by dapl_hash_insert(.) is not    */
+		/* returned to the consumer because the spec. requires */
+		/* that dat_lmr_create(.) return only certain values.  */
+		dat_status =
+		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
+		goto bail;
+	}
+
+	atomic_inc(&pz->pz_ref_count);
+
+	if (lmr_handle)
+		*lmr_handle = (DAT_LMR_HANDLE) lmr;
+	if (lmr_context)
+		*lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context;
+	if (rmr_context)
+		*rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context;
+	if (registered_address)
+		*registered_address = array[0];
+	if (registered_length)
+		*registered_length = page_count * PAGE_SIZE;
+
+bail:
+	return dat_status;
+}
+
+static inline u32 dapl_lmr_create_lmr(struct dapl_ia *ia,
+				      struct dapl_lmr *original_lmr,
+				      struct dapl_pz *pz,
+				      enum dat_mem_priv_flags privileges,
+				      DAT_LMR_HANDLE *lmr_handle,
+				      DAT_LMR_CONTEXT *lmr_context,
+				      DAT_RMR_CONTEXT *rmr_context,
+				      u64 *registered_length,
+				      u64 *registered_address)
+{
+	struct dapl_lmr *lmr;
+	DAT_REGION_DESCRIPTION reg_desc;
+	u32 dat_status;
+
+	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
+				      original_lmr->param.lmr_context,
+				      (DAPL_HASH_DATA *) & lmr);
+	if (dat_status != DAT_SUCCESS) {
+		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
+		goto bail;
+	}
+
+	reg_desc.for_lmr_handle = (DAT_LMR_HANDLE) original_lmr;
+
+	lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_LMR, reg_desc, 0,	/* length is meaningless */
+			     (DAT_PZ_HANDLE) pz, privileges);
+
+	if (NULL == lmr) {
+		dat_status =
+		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
+		goto bail;
+	}
+#if 0
+	dat_status = dapl_ib_mr_register_shared(ia, lmr, privileges);
+#endif
+
+	if (DAT_SUCCESS != dat_status) {
+		dapl_lmr_dealloc(lmr);
+		goto bail;
+	}
+
+	/* if the LMR context is already in the hash table */
+	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
+				      lmr->param.lmr_context, NULL);
+	if (dat_status == DAT_SUCCESS) {
+		dapl_ib_mr_deregister(lmr);
+		dapl_lmr_dealloc(lmr);
+
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_LMR_IN_USE);
+		goto bail;
+	}
+
+	dat_status = dapl_hash_insert(ia->hca_ptr->lmr_hash_table,
+				      lmr->param.lmr_context, lmr);
+	if (dat_status != DAT_SUCCESS) {
+		dapl_ib_mr_deregister(lmr);
+		dapl_lmr_dealloc(lmr);
+
+		/* The value returned by dapl_hash_insert(.) is not    */
+		/* returned to the consumer because the spec. requires */
+		/* that dat_lmr_create(.) return only certain values.  */
+		dat_status =
+		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
+		goto bail;
+	}
+
+	atomic_inc(&pz->pz_ref_count);
+
+	if (lmr_handle)
+		*lmr_handle = (DAT_LMR_HANDLE) lmr;
+	if (lmr_context)
+		*lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context;
+	if (rmr_context)
+		*rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context;
+	if (registered_address)
+		*registered_address = (u64) (unsigned long) 
+			original_lmr->param.region_desc.for_va;
+	if (registered_length)
+		*registered_length = original_lmr->param.length;
+bail:
+	return dat_status;
+}
+
+/*
+ * dapl_lmr_kcreate
+ *
+ * Register a memory region with an Interface Adaptor.
+ *
+ * Input:
+ *	ia_handle
+ *	mem_type
+ *	region_description
+ *	length
+ *	pz_handle
+ *	privileges
+ *	optimization
+ *
+ * Output:
+ *	lmr_handle
+ *	lmr_context
+ *	registered_length
+ *	registered_address
+ *
+ * Returns:
+ * 	DAT_SUCCESS
+ * 	DAT_INSUFFICIENT_RESOURCES
+ * 	DAT_INVALID_PARAMETER
+ * 	DAT_INVALID_HANDLE
+ * 	DAT_INVALID_STATE
+ * 	DAT_MODEL_NOT_SUPPORTED
+ *
+ */
+u32 dapl_lmr_kcreate(DAT_IA_HANDLE ia_handle, enum dat_mem_type mem_type,
+		     DAT_REGION_DESCRIPTION region_description, u64 length,
+		     DAT_PZ_HANDLE pz_handle,
+		     enum dat_mem_priv_flags privileges,
+		     enum dat_mem_optimize_flags optimization, DAT_LMR_HANDLE *lmr_handle,
+		     DAT_LMR_CONTEXT *lmr_context, DAT_RMR_CONTEXT *rmr_context,		     u64 *registered_length, u64 *registered_address)
+{
+	struct dapl_ia *ia;
+	struct dapl_pz *pz;
+	u32 dat_status;
+
+	dapl_dbg_log(DAPL_DBG_TYPE_API,
+		     "dapl_lmr_kcreate(ia:%p, mem_type:%x, ...)\n",
+		     ia_handle, mem_type);
+
+	if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA)) {
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
+		goto bail;
+	}
+	if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ);
+		goto bail;
+	}
+
+	ia = (struct dapl_ia *)ia_handle;
+	pz = (struct dapl_pz *)pz_handle;
+
+	switch (mem_type) {
+	case DAT_MEM_TYPE_VIRTUAL:
+		dat_status =
+		    DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
+		break;
+		/*
+		 * dat_status = dapl_lmr_create_virtual (
+		 * ia, region_description.for_va, length, pz, privileges,
+		 * lmr_handle, lmr_context, rmr_context, registered_length,
+		 * registered_address);
+		 * break;
+		 */
+	case DAT_MEM_TYPE_PHYSICAL:
+		dat_status = dapl_lmr_create_physical(ia, region_description,
+						      length, pz, privileges,
+						      lmr_handle, lmr_context,
+						      rmr_context,
+						      registered_length,
+						      registered_address);
+		break;
+	case DAT_MEM_TYPE_LMR:
+		{
+			struct dapl_lmr *lmr;
+
+			if (DAPL_BAD_HANDLE
+			    (region_description.for_lmr_handle,
+			     DAPL_MAGIC_LMR)) {
+				dat_status =
+				    DAT_ERROR(DAT_INVALID_HANDLE,
+					      DAT_INVALID_HANDLE_LMR);
+				goto bail;
+			}
+
+			lmr = (struct dapl_lmr *)region_description.for_lmr_handle;
+
+			dat_status =
+			    dapl_lmr_create_lmr(ia, lmr, pz, privileges,
+						lmr_handle, lmr_context,
+						rmr_context, registered_length,
+						registered_address);
+			break;
+		}
+	case DAT_MEM_TYPE_PLATFORM:
+	case DAT_MEM_TYPE_IA:
+	case DAT_MEM_TYPE_BYPASS:
+		dat_status =
+		    DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
+		break;
+	default:
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
+		break;
+	}
+
+bail:
+	return dat_status;
+}
+
+u32 dapl_lmr_query(DAT_LMR_HANDLE lmr_handle, struct dat_lmr_param *lmr_param)
+{
+	struct dapl_lmr *lmr;
+	u32 dat_status;
+
+	dapl_dbg_log(DAPL_DBG_TYPE_API,
+		     "dapl_lmr_query (%p, %p)\n",
+		     lmr_handle, lmr_param);
+
+	if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) {
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR);
+		goto bail;
+	}
+	if (NULL == lmr_param) {
+		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
+		goto bail;
+	}
+
+	dat_status = DAT_SUCCESS;
+	lmr = (struct dapl_lmr *)lmr_handle;
+
+	memcpy(lmr_param, &lmr->param, sizeof *lmr_param);
+
+bail:
+	return dat_status;
+}
+
+/*
+ * dat_lmr_sync_rdma_read
+ *
+ * Ensure a region of memory is consistent by locally flushing
+ * non-coherent cache
+ *
+ * Input:
+ *	ia_handle
+ *	local_segments		Array of buffer segments
+ *	num_segments		Number of segments in local_segments
+ *
+ * Output:
+ *	none
+ *
+ * Return Values:
+ * 	DAT_SUCCESS
+ * 	DAT_INVALID_HANDLE
+ * 	DAT_INVALID_PARAMETER
+ */
+u32 dapl_lmr_sync_rdma_read(DAT_IA_HANDLE ia_handle,
+			    const struct dat_lmr_triplet *local_segments,
+			    u64 num_segments)
+{
+	struct dapl_ia *ia_ptr;
+	u32 dat_status = DAT_SUCCESS;
+
+	dapl_dbg_log(DAPL_DBG_TYPE_API,
+		     "dat_lmr_sync_rdma_read (%p, %p, %ld)\n",
+		     ia_handle, local_segments, num_segments);
+
+	ia_ptr = (struct dapl_ia *)ia_handle;
+
+	if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) {
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
+		goto bail;
+	}
+
+bail:
+	return dat_status;
+}
+
+/*
+ * Ensure a region of memory is consistent by locally flushing
+ * non-coherent cache
+ */
+u32 dapl_lmr_sync_rdma_write(DAT_IA_HANDLE ia_handle,
+			     const struct dat_lmr_triplet *local_segments,
+			     u64 num_segments)
+{
+	struct dapl_ia *ia_ptr;
+	u32 dat_status = DAT_SUCCESS;
+
+	dapl_dbg_log(DAPL_DBG_TYPE_API,
+		     "dat_lmr_sync_rdma_write (%p, %p, %ld)\n",
+		     ia_handle, local_segments, num_segments);
+
+	ia_ptr = (struct dapl_ia *)ia_handle;
+
+	if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) {
+		dat_status =
+		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
+		goto bail;
+	}
+
+bail:
+	return dat_status;
+}
Index: linux-kernel-lmr/dat-provider/dapl_lmr_free.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_free.c	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_free.c	(working copy)
@@ -1,119 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#include "dapl_lmr_util.h"
-#include "dapl_openib_util.h"
-#include "dapl_ia_util.h"
-
-/*
- * dapl_lmr_free
- *
- * Destroy an instance of the Local Memory Region
- *
- * Input:
- * 	lmr_handle
- *
- * Output:
- *
- * Returns:
- * 	DAT_SUCCESS
- *      DAT_INVALID_HANDLE
- * 	DAT_INVALID_PARAMETER
- * 	DAT_INVALID_STATE 
- */
-
-u32 dapl_lmr_free(DAT_LMR_HANDLE lmr_handle)
-{
-	struct dapl_lmr *lmr;
-	u32 dat_status;
-
-	dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_free (%p)\n", lmr_handle);
-
-	if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) {
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_LMR);
-		goto bail;
-	}
-
-	lmr = (struct dapl_lmr *)lmr_handle;
-
-	switch (lmr->param.mem_type) {
-	case DAT_MEM_TYPE_PHYSICAL:
-	case DAT_MEM_TYPE_VIRTUAL:
-	case DAT_MEM_TYPE_LMR:
-		{
-			struct dapl_pz *pz;
-
-			if (0 != atomic_read(&lmr->lmr_ref_count))
-				return DAT_INVALID_STATE;
-
-			dat_status =
-			    dapl_hash_remove(lmr->header.owner_ia->hca_ptr->
-					     lmr_hash_table,
-					     lmr->param.lmr_context, NULL);
-			if (dat_status != DAT_SUCCESS)
-				goto bail;
-
-			dat_status = dapl_ib_mr_deregister(lmr);
-
-			if (dat_status == DAT_SUCCESS) {
-
-				pz = (struct dapl_pz *)lmr->param.pz_handle;
-				atomic_dec(&pz->pz_ref_count);
-
-				dapl_lmr_dealloc(lmr);
-			} else
-				/*
-				 * Deregister failed; put it back in the
-				 * hash table.
-				 */
-				dapl_hash_insert(lmr->header.owner_ia->
-						 hca_ptr->lmr_hash_table,
-						 lmr->param.lmr_context, lmr);
-
-			break;
-		}
-	case DAT_MEM_TYPE_PLATFORM:
-	case DAT_MEM_TYPE_IA:
-	case DAT_MEM_TYPE_BYPASS:
-		{
-			return DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
-		}
-	default:
-		{
-			dat_status =
-			    DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG1);
-			break;
-		}
-	}
-bail:
-	return dat_status;
-}
Index: linux-kernel-lmr/dat-provider/dapl_lmr_sync_rdma_write.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_sync_rdma_write.c	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_sync_rdma_write.c	(working copy)
@@ -1,60 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#include "dapl.h"
-#include "dapl_ia_util.h"
-
-/*
- * Ensure a region of memory is consistent by locally flushing
- * non-coherent cache
- */
-u32 dapl_lmr_sync_rdma_write(DAT_IA_HANDLE ia_handle,
-			     const struct dat_lmr_triplet *local_segments,
-			     u64 num_segments)
-{
-	struct dapl_ia *ia_ptr;
-	u32 dat_status = DAT_SUCCESS;
-
-	dapl_dbg_log(DAPL_DBG_TYPE_API,
-		     "dat_lmr_sync_rdma_write (%p, %p, %ld)\n",
-		     ia_handle, local_segments, num_segments);
-
-	ia_ptr = (struct dapl_ia *)ia_handle;
-
-	if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) {
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
-		goto bail;
-	}
-
-bail:
-	return dat_status;
-}
Index: linux-kernel-lmr/dat-provider/dapl_lmr_kcreate.c
===================================================================
--- linux-kernel-lmr/dat-provider/dapl_lmr_kcreate.c	(revision 2475)
+++ linux-kernel-lmr/dat-provider/dapl_lmr_kcreate.c	(working copy)
@@ -1,395 +0,0 @@
-/*
- * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
- *
- * This Software is licensed under one of the following licenses:
- *
- * 1) under the terms of the "Common Public License 1.0" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/cpl.php.
- *
- * 2) under the terms of the "The BSD License" a copy of which is
- *    available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/bsd-license.php.
- *
- * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
- *    copy of which is available from the Open Source Initiative, see
- *    http://www.opensource.org/licenses/gpl-license.php.
- *
- * Licensee has the right to choose one of the above licenses.
- *
- * Redistributions of source code must retain the above copyright
- * notice and one of the license notices.
- *
- * Redistributions in binary form must reproduce both the above copyright
- * notice, one of the license notices in the documentation
- * and/or other materials provided with the distribution.
- */
-
-/*
- * $Id$
- */
-
-#include "dapl_lmr_util.h"
-#include "dapl_openib_util.h"
-
-static inline u32 dapl_lmr_create_virtual(struct dapl_ia *ia, void *virt_addr,
-					  u64 length, struct dapl_pz *pz,
-					  enum dat_mem_priv_flags privileges,
-					  DAT_LMR_HANDLE *lmr_handle,
-					  DAT_LMR_CONTEXT *lmr_context,
-					  DAT_RMR_CONTEXT *rmr_context,
-					  u64 *registered_length,
-					  u64 *registered_address)
-{
-	struct dapl_lmr *lmr;
-	DAT_REGION_DESCRIPTION reg_desc;
-	u32 dat_status = DAT_SUCCESS;
-
-	reg_desc.for_va = virt_addr;
-
-	lmr = dapl_lmr_alloc(ia,
-			     DAT_MEM_TYPE_VIRTUAL,
-			     reg_desc, length, (DAT_PZ_HANDLE) pz, privileges);
-
-	if (NULL == lmr) {
-		dat_status =
-		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-		goto bail;
-	}
-
-	dat_status = dapl_ib_mr_register(ia,
-					 lmr, virt_addr, length, privileges);
-
-	if (DAT_SUCCESS != dat_status) {
-		dapl_lmr_dealloc(lmr);
-		goto bail;
-	}
-
-	/* if the LMR context is already in the hash table */
-	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
-				      lmr->param.lmr_context, NULL);
-	if (dat_status == DAT_SUCCESS) {
-		(void)dapl_ib_mr_deregister(lmr);
-		dapl_lmr_dealloc(lmr);
-
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_LMR_IN_USE);
-		goto bail;
-	}
-
-	dat_status = dapl_hash_insert(ia->hca_ptr->lmr_hash_table,
-				      lmr->param.lmr_context, lmr);
-	if (dat_status != DAT_SUCCESS) {
-		(void)dapl_ib_mr_deregister(lmr);
-		dapl_lmr_dealloc(lmr);
-
-		/* The value returned by dapl_hash_insert(.) is not    */
-		/* returned to the consumer because the spec. requires */
-		/* that dat_lmr_create(.) return only certain values.  */
-		dat_status =
-		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-		goto bail;
-	}
-
-	atomic_inc(&pz->pz_ref_count);
-
-	if (lmr_handle)
-		*lmr_handle = (DAT_LMR_HANDLE) lmr;
-	if (lmr_context)
-		*lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context;
-	if (rmr_context)
-		*rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context;
-	if (registered_address)
-		*registered_address = (u64)(unsigned long) virt_addr;
-	if (registered_length)
-		*registered_length = length;
-
-bail:
-	return dat_status;
-
-}
-
-static inline u32 dapl_lmr_create_physical(struct dapl_ia *ia,
-					   DAT_REGION_DESCRIPTION phys_addr,
-					   u64 page_count, struct dapl_pz *pz,
-					   enum dat_mem_priv_flags privileges,
-					   DAT_LMR_HANDLE *lmr_handle,
-					   DAT_LMR_CONTEXT *lmr_context,
-					   DAT_RMR_CONTEXT *rmr_context,
-					   u64 *registered_length,
-					   u64 *registered_address)
-{
-	struct dapl_lmr *lmr;
-	u32 dat_status = DAT_SUCCESS;
-	u64 *array = phys_addr.for_array;
-
-	lmr = dapl_lmr_alloc(ia,
-			     DAT_MEM_TYPE_PHYSICAL,
-			     phys_addr,
-			     page_count, (DAT_PZ_HANDLE) pz, privileges);
-
-	if (NULL == lmr) {
-		dat_status =
-		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-		goto bail;
-	}
-
-	dat_status = dapl_ib_mr_register_physical(ia, lmr, phys_addr.for_array,
-						  page_count, privileges);
-
-	if (DAT_SUCCESS != dat_status) {
-		dapl_lmr_dealloc(lmr);
-		goto bail;
-	}
-
-	/* if the LMR context is already in the hash table */
-	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
-				      lmr->param.lmr_context, NULL);
-	if (dat_status == DAT_SUCCESS) {
-		(void)dapl_ib_mr_deregister(lmr);
-		dapl_lmr_dealloc(lmr);
-
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_LMR_IN_USE);
-		goto bail;
-	}
-
-	dat_status = dapl_hash_insert(ia->hca_ptr->lmr_hash_table,
-				      lmr->param.lmr_context, lmr);
-	if (dat_status != DAT_SUCCESS) {
-		(void)dapl_ib_mr_deregister(lmr);
-		dapl_lmr_dealloc(lmr);
-
-		/* The value returned by dapl_hash_insert(.) is not    */
-		/* returned to the consumer because the spec. requires */
-		/* that dat_lmr_create(.) return only certain values.  */
-		dat_status =
-		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-		goto bail;
-	}
-
-	atomic_inc(&pz->pz_ref_count);
-
-	if (lmr_handle)
-		*lmr_handle = (DAT_LMR_HANDLE) lmr;
-	if (lmr_context)
-		*lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context;
-	if (rmr_context)
-		*rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context;
-	if (registered_address)
-		*registered_address = array[0];
-	if (registered_length)
-		*registered_length = page_count * PAGE_SIZE;
-
-bail:
-	return dat_status;
-}
-
-static inline u32 dapl_lmr_create_lmr(struct dapl_ia *ia,
-				      struct dapl_lmr *original_lmr,
-				      struct dapl_pz *pz,
-				      enum dat_mem_priv_flags privileges,
-				      DAT_LMR_HANDLE *lmr_handle,
-				      DAT_LMR_CONTEXT *lmr_context,
-				      DAT_RMR_CONTEXT *rmr_context,
-				      u64 *registered_length,
-				      u64 *registered_address)
-{
-	struct dapl_lmr *lmr;
-	DAT_REGION_DESCRIPTION reg_desc;
-	u32 dat_status;
-
-	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
-				      original_lmr->param.lmr_context,
-				      (DAPL_HASH_DATA *) & lmr);
-	if (dat_status != DAT_SUCCESS) {
-		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
-		goto bail;
-	}
-
-	reg_desc.for_lmr_handle = (DAT_LMR_HANDLE) original_lmr;
-
-	lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_LMR, reg_desc, 0,	/* length is meaningless */
-			     (DAT_PZ_HANDLE) pz, privileges);
-
-	if (NULL == lmr) {
-		dat_status =
-		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-		goto bail;
-	}
-#if 0
-	dat_status = dapl_ib_mr_register_shared(ia, lmr, privileges);
-#endif
-
-	if (DAT_SUCCESS != dat_status) {
-		dapl_lmr_dealloc(lmr);
-		goto bail;
-	}
-
-	/* if the LMR context is already in the hash table */
-	dat_status = dapl_hash_search(ia->hca_ptr->lmr_hash_table,
-				      lmr->param.lmr_context, NULL);
-	if (dat_status == DAT_SUCCESS) {
-		dapl_ib_mr_deregister(lmr);
-		dapl_lmr_dealloc(lmr);
-
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_STATE, DAT_INVALID_STATE_LMR_IN_USE);
-		goto bail;
-	}
-
-	dat_status = dapl_hash_insert(ia->hca_ptr->lmr_hash_table,
-				      lmr->param.lmr_context, lmr);
-	if (dat_status != DAT_SUCCESS) {
-		dapl_ib_mr_deregister(lmr);
-		dapl_lmr_dealloc(lmr);
-
-		/* The value returned by dapl_hash_insert(.) is not    */
-		/* returned to the consumer because the spec. requires */
-		/* that dat_lmr_create(.) return only certain values.  */
-		dat_status =
-		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
-		goto bail;
-	}
-
-	atomic_inc(&pz->pz_ref_count);
-
-	if (lmr_handle)
-		*lmr_handle = (DAT_LMR_HANDLE) lmr;
-	if (lmr_context)
-		*lmr_context = (DAT_LMR_CONTEXT) lmr->param.lmr_context;
-	if (rmr_context)
-		*rmr_context = (DAT_LMR_CONTEXT) lmr->param.rmr_context;
-	if (registered_address)
-		*registered_address = (u64) (unsigned long) 
-			original_lmr->param.region_desc.for_va;
-	if (registered_length)
-		*registered_length = original_lmr->param.length;
-bail:
-	return dat_status;
-}
-
-/*
- * dapl_lmr_kcreate
- *
- * Register a memory region with an Interface Adaptor.
- *
- * Input:
- *	ia_handle
- *	mem_type
- *	region_description
- *	length
- *	pz_handle
- *	privileges
- *	optimization
- *
- * Output:
- *	lmr_handle
- *	lmr_context
- *	registered_length
- *	registered_address
- *
- * Returns:
- * 	DAT_SUCCESS
- * 	DAT_INSUFFICIENT_RESOURCES
- * 	DAT_INVALID_PARAMETER
- * 	DAT_INVALID_HANDLE
- * 	DAT_INVALID_STATE
- * 	DAT_MODEL_NOT_SUPPORTED
- *
- */
-u32 dapl_lmr_kcreate(DAT_IA_HANDLE ia_handle, enum dat_mem_type mem_type,
-		     DAT_REGION_DESCRIPTION region_description, u64 length,
-		     DAT_PZ_HANDLE pz_handle,
-		     enum dat_mem_priv_flags privileges,
-		     enum dat_mem_optimize_flags optimization, DAT_LMR_HANDLE *lmr_handle,
-		     DAT_LMR_CONTEXT *lmr_context, DAT_RMR_CONTEXT *rmr_context,		     u64 *registered_length, u64 *registered_address)
-{
-	struct dapl_ia *ia;
-	struct dapl_pz *pz;
-	u32 dat_status;
-
-	dapl_dbg_log(DAPL_DBG_TYPE_API,
-		     "dapl_lmr_kcreate(ia:%p, mem_type:%x, ...)\n",
-		     ia_handle, mem_type);
-
-	if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA)) {
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_IA);
-		goto bail;
-	}
-	if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
-		dat_status =
-		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ);
-		goto bail;
-	}
-
-	ia = (struct dapl_ia *)ia_handle;
-	pz = (struct dapl_pz *)pz_handle;
-
-	switch (mem_type) {
-	case DAT_MEM_TYPE_VIRTUAL:
-		{
-			dat_status =
-			    DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-			break;
-			/*
-			   dat_status = dapl_lmr_create_virtual (
-			   ia, region_description.for_va, length, pz, privileges,
-			   lmr_handle, lmr_context, rmr_context, registered_length,
-			   registered_address);
-			   break;
-			 */
-		}
-	case DAT_MEM_TYPE_PHYSICAL:
-		{
-			dat_status =
-			    dapl_lmr_create_physical(ia, region_description,
-						     length, pz, privileges,
-						     lmr_handle, lmr_context,
-						     rmr_context,
-						     registered_length,
-						     registered_address);
-			break;
-		}
-	case DAT_MEM_TYPE_LMR:
-		{
-			struct dapl_lmr *lmr;
-
-			if (DAPL_BAD_HANDLE
-			    (region_description.for_lmr_handle,
-			     DAPL_MAGIC_LMR)) {
-				dat_status =
-				    DAT_ERROR(DAT_INVALID_HANDLE,
-					      DAT_INVALID_HANDLE_LMR);
-				goto bail;
-			}
-
-			lmr = (struct dapl_lmr *)region_description.for_lmr_handle;
-
-			dat_status =
-			    dapl_lmr_create_lmr(ia, lmr, pz, privileges,
-						lmr_handle, lmr_context,
-						rmr_context, registered_length,
-						registered_address);
-			break;
-		}
-	case DAT_MEM_TYPE_PLATFORM:
-	case DAT_MEM_TYPE_IA:
-	case DAT_MEM_TYPE_BYPASS:
-		{
-			dat_status =
-			    DAT_ERROR(DAT_NOT_IMPLEMENTED, DAT_NO_SUBTYPE);
-			break;
-		}
-	default:
-		{
-			dat_status =
-			    DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
-			break;
-		}
-	}
-
-bail:
-	return dat_status;
-}
Index: linux-kernel-lmr/patches/alt_dat_provider_makefile
===================================================================
--- linux-kernel-lmr/patches/alt_dat_provider_makefile	(revision 2475)
+++ linux-kernel-lmr/patches/alt_dat_provider_makefile	(working copy)
@@ -16,7 +16,6 @@ PROVIDER_MODULES := \
         dapl_evd_kquery               	\
         dapl_evd_kcreate              	\
         dapl_evd_modify_upcall        	\
-        dapl_lmr_kcreate		\
 	dapl_cookie   		      	\
 	dapl_cno_util			\
         dapl_cr_accept                	\
@@ -61,11 +60,7 @@ PROVIDER_MODULES := \
         dapl_ia_query                 	\
         dapl_ia_util                  	\
         dapl_llist                    	\
-        dapl_lmr_free                 	\
-        dapl_lmr_query                	\
-        dapl_lmr_sync_rdma_read       	\
-        dapl_lmr_sync_rdma_write      	\
-        dapl_lmr_util                 	\
+        dapl_lmr                 	\
         dapl_mr_util                  	\
         dapl_provider                 	\
         dapl_sp_util                  	\
@@ -73,10 +68,7 @@ PROVIDER_MODULES := \
         dapl_psp_create_any           	\
         dapl_psp_free                 	\
         dapl_psp_query                	\
-        dapl_pz_create                	\
-        dapl_pz_free                  	\
-        dapl_pz_query                 	\
-        dapl_pz_util                  	\
+        dapl_pz                  	\
         dapl_ring_buffer_util         	\
         dapl_rmr_bind                 	\
         dapl_rmr_create               	\




More information about the general mailing list