[openib-general] [PATCH] kDAPL: consolidate rmr files into one
Tom Duffy
tduffy at sun.com
Wed May 25 10:54:18 PDT 2005
Signed-off-by: Tom Duffy <tduffy at sun.com>
Index: linux-kernel-rmr/dat-provider/dapl_rmr_create.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr_create.c (revision 2483)
+++ linux-kernel-rmr/dat-provider/dapl_rmr_create.c (working copy)
@@ -1,89 +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_rmr_util.h"
-#include "dapl_openib_util.h"
-
-/*
- * dapl_rmr_create
- *
- * Create a remote memory region for the specified protection zone
- *
- * Input:
- * pz_handle
- *
- * Output:
- * rmr_handle
- *
- * Returns:
- * DAT_SUCCESS
- * DAT_INSUFFICIENT_RESOURCES
- * DAT_INVALID_PARAMETER
- */
-u32 dapl_rmr_create(DAT_PZ_HANDLE pz_handle, DAT_RMR_HANDLE *rmr_handle)
-{
- struct dapl_pz *pz;
- struct dapl_rmr *rmr;
- u32 dat_status = DAT_SUCCESS;
-
- if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
- dat_status =
- DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ);
- goto bail;
- }
-
- pz = (struct dapl_pz *)pz_handle;
-
- rmr = dapl_rmr_alloc(pz);
-
- if (rmr == NULL) {
- dat_status =
- DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
- goto bail;
- }
-
- dat_status = dapl_ib_mw_alloc(rmr);
-
- if (dat_status != DAT_SUCCESS) {
- dapl_rmr_dealloc(rmr);
- dat_status =
- DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
- DAT_RESOURCE_MEMORY_REGION);
- goto bail;
- }
-
- atomic_inc(&pz->pz_ref_count);
-
- *rmr_handle = rmr;
-
-bail:
- return dat_status;
-}
Index: linux-kernel-rmr/dat-provider/Makefile
===================================================================
--- linux-kernel-rmr/dat-provider/Makefile (revision 2483)
+++ linux-kernel-rmr/dat-provider/Makefile (working copy)
@@ -76,11 +61,7 @@ PROVIDER_MODULES := \
dapl_psp_query \
dapl_pz \
dapl_ring_buffer_util \
- dapl_rmr_bind \
- dapl_rmr_create \
- dapl_rmr_free \
- dapl_rmr_query \
- dapl_rmr_util \
+ dapl_rmr \
dapl_rsp_create \
dapl_rsp_free \
dapl_rsp_query \
@@ -98,5 +79,25 @@ PROVIDER_MODULES := \
Index: linux-kernel-rmr/dat-provider/dapl_rmr_free.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr_free.c (revision 2483)
+++ linux-kernel-rmr/dat-provider/dapl_rmr_free.c (working copy)
@@ -1,84 +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_rmr_util.h"
-#include "dapl_openib_util.h"
-#include "dapl_ia_util.h"
-
-/*
- * dapl_rmr_free
- *
- * Destroy an instance of the Remote Memory Region
- *
- * Input:
- * rmr_handle
- *
- * Output:
- * none
- *
- * Returns:
- * DAT_SUCCESS
- * DAT_INVALID_PARAMETER
- */
-u32 dapl_rmr_free(DAT_RMR_HANDLE rmr_handle)
-{
- struct dapl_rmr *rmr;
- u32 dat_status = DAT_SUCCESS;
-
- if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
- dat_status =
- DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
- goto bail;
- }
-
- rmr = (struct dapl_rmr *)rmr_handle;
-
- /*
- * If the user did not perform an unbind op, release
- * counts here.
- */
- if (rmr->param.lmr_triplet.virtual_address != 0) {
- atomic_dec(&rmr->lmr->lmr_ref_count);
- rmr->param.lmr_triplet.virtual_address = 0;
- }
-
- dat_status = dapl_ib_mw_free(rmr);
-
- if (dat_status != DAT_SUCCESS)
- goto bail;
-
- atomic_dec(&rmr->pz->pz_ref_count);
-
- dapl_rmr_dealloc(rmr);
-
-bail:
- return dat_status;
-}
Index: linux-kernel-rmr/dat-provider/dapl_rmr_query.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr_query.c (revision 2483)
+++ linux-kernel-rmr/dat-provider/dapl_rmr_query.c (working copy)
@@ -1,55 +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_rmr_query(DAT_RMR_HANDLE rmr_handle, struct dat_rmr_param *rmr_param)
-{
- struct dapl_rmr *rmr;
- u32 dat_status = DAT_SUCCESS;
-
- if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
- dat_status =
- DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
- goto bail;
- }
- if (NULL == rmr_param) {
- dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
- goto bail;
- }
-
- rmr = (struct dapl_rmr *)rmr_handle;
-
- memcpy(rmr_param, &rmr->param, sizeof *rmr_param);
-
-bail:
- return dat_status;
-}
Index: linux-kernel-rmr/dat-provider/dapl_rmr_bind.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr_bind.c (revision 2483)
+++ linux-kernel-rmr/dat-provider/dapl_rmr_bind.c (working copy)
@@ -1,273 +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_rmr_util.h"
-#include "dapl_ep_util.h"
-#include "dapl_cookie.h"
-#include "dapl_openib_util.h"
-
-/*********************************************************************
- * *
- * Function Definitions *
- * *
- *********************************************************************/
-
-static inline u32 dapl_rmr_bind_fuse(struct dapl_rmr *rmr,
- const struct dat_lmr_triplet *lmr_triplet,
- enum dat_mem_priv_flags mem_priv,
- struct dapl_ep *ep_ptr,
- DAT_RMR_COOKIE user_cookie,
- enum dat_completion_flags completion_flags,
- DAT_RMR_CONTEXT *rmr_context)
-{
- struct dapl_lmr *lmr;
- struct dapl_cookie *cookie;
- u32 status;
- boolean_t is_signaled;
-
- status = dapl_hash_search(rmr->header.owner_ia->hca_ptr->lmr_hash_table,
- lmr_triplet->lmr_context,
- (DAPL_HASH_DATA *) &lmr);
- if (DAT_SUCCESS != status) {
- status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
- goto bail;
- }
-
- /* if the ep in unconnected return an error. IB requires that the */
- /* QP be connected to change a memory window binding since: */
- /* */
- /* - memory window bind operations are WQEs placed on a QP's */
- /* send queue */
- /* */
- /* - QP's only process WQEs on the send queue when the QP is in */
- /* the RTS state */
- if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
- status =
- DAT_ERROR(DAT_INVALID_STATE, dapl_ep_state_subtype(ep_ptr));
- goto bail;
- }
-
- if (FALSE ==
- dapl_mr_bounds_check(dapl_mr_get_address
- (lmr->param.region_desc, lmr->param.mem_type),
- lmr->param.length,
- lmr_triplet->virtual_address,
- lmr_triplet->segment_length)) {
- status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
- goto bail;
- }
-
- /* If the LMR, RMR, and EP are not in the same PZ, there is an error */
- if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) ||
- (ep_ptr->param.pz_handle != rmr->param.pz_handle)) {
- status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
- goto bail;
- }
-
- if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
- ep_ptr->param.ep_attr.
- request_completion_flags,
- completion_flags) ||
- !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
- ep_ptr->param.ep_attr.
- request_completion_flags,
- completion_flags) ||
- !dapl_rmr_validate_completion_flag(
- DAT_COMPLETION_BARRIER_FENCE_FLAG,
- ep_ptr->param.ep_attr.request_completion_flags,
- completion_flags)) {
- status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
- goto bail;
- }
-
- status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
- &cookie);
- if (DAT_SUCCESS != status)
- goto bail;
-
- is_signaled = (completion_flags & DAT_COMPLETION_SUPPRESS_FLAG) ?
- FALSE : TRUE;
-
- /*
- * Take reference before posting to avoid race conditions with
- * completions
- */
- atomic_inc(&ep_ptr->req_count);
-
- status = dapl_ib_mw_bind(rmr, lmr, ep_ptr, cookie,
- lmr_triplet->virtual_address,
- lmr_triplet->segment_length,
- mem_priv, is_signaled);
- if (DAT_SUCCESS != status) {
- atomic_dec(&ep_ptr->req_count);
- dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
- goto bail;
- }
-
- atomic_inc(&lmr->lmr_ref_count);
-
- /* if the RMR was previously bound */
- if (NULL != rmr->lmr)
- atomic_dec(&rmr->lmr->lmr_ref_count);
-
- rmr->param.mem_priv = mem_priv;
- rmr->param.lmr_triplet = *lmr_triplet;
- rmr->ep = ep_ptr;
- rmr->lmr = lmr;
-
- if (NULL != rmr_context)
- *rmr_context = rmr->param.rmr_context;
-
-bail:
- return status;
-}
-
-static inline u32 dapl_rmr_bind_unfuse(struct dapl_rmr *rmr,
- struct dapl_ep *ep_ptr,
- DAT_RMR_COOKIE user_cookie,
- enum dat_completion_flags cflags)
-{
- struct dapl_cookie *cookie;
- u32 status = DAT_SUCCESS;
- boolean_t is_signaled;
-
- /*
- * if the ep in unconnected return an error. IB requires that the
- * QP be connected to change a memory window binding since:
- *
- * - memory window bind operations are WQEs placed on a QP's
- * send queue
- *
- * - QP's only process WQEs on the send queue when the QP is in
- * the RTS state
- */
- if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
- status =
- DAT_ERROR(DAT_INVALID_STATE, dapl_ep_state_subtype(ep_ptr));
- goto bail1;
- }
-
- /* If the RMR and EP are not in the same PZ, there is an error */
- if (ep_ptr->param.pz_handle != rmr->param.pz_handle) {
- status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
- goto bail1;
- }
-
- if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
- ep_ptr->param.ep_attr.
- request_completion_flags,
- cflags) ||
- !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
- ep_ptr->param.ep_attr.
- request_completion_flags,
- cflags) ||
- !dapl_rmr_validate_completion_flag(
- DAT_COMPLETION_BARRIER_FENCE_FLAG,
- ep_ptr->param.ep_attr.request_completion_flags, cflags)) {
- status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
- goto bail1;
- }
-
- status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
- &cookie);
- if (DAT_SUCCESS != status)
- goto bail1;
-
- is_signaled = (cflags & DAT_COMPLETION_UNSIGNALLED_FLAG) ? FALSE : TRUE;
-
- /*
- * Take reference before posting to avoid race conditions with
- * completions
- */
- atomic_inc(&ep_ptr->req_count);
-
- status = dapl_ib_mw_unbind(rmr, ep_ptr, cookie, is_signaled);
- if (DAT_SUCCESS != status) {
- atomic_dec(&ep_ptr->req_count);
- dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
- goto bail1;
- }
-
- /* if the RMR was previously bound */
- if (NULL != rmr->lmr)
- atomic_dec(&rmr->lmr->lmr_ref_count);
-
- rmr->param.mem_priv = DAT_MEM_PRIV_NONE_FLAG;
- rmr->param.lmr_triplet.lmr_context = 0;
- rmr->param.lmr_triplet.virtual_address = 0;
- rmr->param.lmr_triplet.segment_length = 0;
- rmr->ep = ep_ptr;
- rmr->lmr = NULL;
-
-bail1:
- return status;
-}
-
-/*
- * dapl_rmr_bind
- *
- * DAPL Requirements Version xxx, 6.6.4.4
- *
- * Bind the RMR to the specified memory region within the LMR and
- * provide a new rmr_context value.
- *
- * Input:
- * Output:
- */
-u32 dapl_rmr_bind(DAT_RMR_HANDLE rmr_handle,
- const struct dat_lmr_triplet *lmr_triplet,
- enum dat_mem_priv_flags mem_priv, DAT_EP_HANDLE ep_handle,
- DAT_RMR_COOKIE user_cookie,
- enum dat_completion_flags completion_flags,
- DAT_RMR_CONTEXT *rmr_context)
-{
- struct dapl_rmr *rmr;
- struct dapl_ep *ep_ptr;
-
- if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR))
- return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
-
- if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))
- return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
-
- rmr = (struct dapl_rmr *)rmr_handle;
- ep_ptr = (struct dapl_ep *)ep_handle;
-
- /* if the rmr should be bound */
- if (0 != lmr_triplet->segment_length)
- return dapl_rmr_bind_fuse(rmr, lmr_triplet, mem_priv, ep_ptr,
- user_cookie, completion_flags,
- rmr_context);
- else /* the rmr should be unbound */
- return dapl_rmr_bind_unfuse(rmr, ep_ptr, user_cookie,
- completion_flags);
-}
Index: linux-kernel-rmr/dat-provider/dapl_openib_util.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_openib_util.c (revision 2483)
+++ linux-kernel-rmr/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_rmr_util.h"
#include "dapl_cookie.h"
#include "dapl_openib_cm.h"
Index: linux-kernel-rmr/dat-provider/dapl_rmr_util.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr_util.c (revision 2483)
+++ linux-kernel-rmr/dat-provider/dapl_rmr_util.c (working copy)
@@ -1,82 +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.
- */
-
-#include "dapl_rmr_util.h"
-#include "dapl_ia_util.h"
-
-struct dapl_rmr *dapl_rmr_alloc(struct dapl_pz *pz)
-{
- struct dapl_rmr *rmr;
-
- /* Allocate LMR */
- rmr = kmalloc(sizeof *rmr, GFP_ATOMIC);
- if (!rmr)
- return NULL;
-
- /* zero the structure */
- memset(rmr, 0, sizeof *rmr);
-
- /*
- * initialize the header
- */
- rmr->header.provider = pz->header.provider;
- rmr->header.magic = DAPL_MAGIC_RMR;
- rmr->header.handle_type = DAT_HANDLE_TYPE_RMR;
- rmr->header.owner_ia = pz->header.owner_ia;
- rmr->header.user_context.as_64 = 0;
- rmr->header.user_context.as_ptr = NULL;
- dapl_llist_init_entry(&rmr->header.ia_list_entry);
- dapl_ia_link_rmr(rmr->header.owner_ia, rmr);
- spin_lock_init(&rmr->header.lock);
-
- /*
- * initialize the body
- */
- rmr->param.ia_handle = (DAT_IA_HANDLE) pz->header.owner_ia;
- rmr->param.pz_handle = (DAT_PZ_HANDLE) pz;
- rmr->param.lmr_triplet.lmr_context = 0;
- rmr->param.lmr_triplet.pad = 0;
- rmr->param.lmr_triplet.virtual_address = 0;
- rmr->param.lmr_triplet.segment_length = 0;
-
- rmr->param.mem_priv = 0;
- rmr->pz = pz;
- rmr->lmr = NULL;
-
- return rmr;
-}
-
-void dapl_rmr_dealloc(struct dapl_rmr *rmr)
-{
- /* reset magic to prevent reuse */
- rmr->header.magic = DAPL_MAGIC_INVALID;
-
- dapl_ia_unlink_rmr(rmr->header.owner_ia, rmr);
- /* no need to destroy rmr->header.lock */
-
- kfree(rmr);
-}
Index: linux-kernel-rmr/dat-provider/dapl_rmr.c
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr.c (revision 0)
+++ linux-kernel-rmr/dat-provider/dapl_rmr.c (revision 0)
@@ -0,0 +1,461 @@
+/*
+ * 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_ep_util.h"
+#include "dapl_ia_util.h"
+#include "dapl_mr_util.h"
+#include "dapl_hash.h"
+#include "dapl_cookie.h"
+#include "dapl_openib_util.h"
+
+static inline boolean_t
+dapl_rmr_validate_completion_flag(enum dat_completion_flags mask,
+ enum dat_completion_flags allow,
+ enum dat_completion_flags request)
+{
+ if ((mask & request) && !(mask & allow))
+ return FALSE;
+ else
+ return TRUE;
+}
+
+
+static struct dapl_rmr *dapl_rmr_alloc(struct dapl_pz *pz)
+{
+ struct dapl_rmr *rmr;
+
+ /* Allocate LMR */
+ rmr = kmalloc(sizeof *rmr, GFP_ATOMIC);
+ if (!rmr)
+ return NULL;
+
+ /* zero the structure */
+ memset(rmr, 0, sizeof *rmr);
+
+ /*
+ * initialize the header
+ */
+ rmr->header.provider = pz->header.provider;
+ rmr->header.magic = DAPL_MAGIC_RMR;
+ rmr->header.handle_type = DAT_HANDLE_TYPE_RMR;
+ rmr->header.owner_ia = pz->header.owner_ia;
+ rmr->header.user_context.as_64 = 0;
+ rmr->header.user_context.as_ptr = NULL;
+ dapl_llist_init_entry(&rmr->header.ia_list_entry);
+ dapl_ia_link_rmr(rmr->header.owner_ia, rmr);
+ spin_lock_init(&rmr->header.lock);
+
+ /*
+ * initialize the body
+ */
+ rmr->param.ia_handle = (DAT_IA_HANDLE)pz->header.owner_ia;
+ rmr->param.pz_handle = (DAT_PZ_HANDLE)pz;
+ rmr->param.lmr_triplet.lmr_context = 0;
+ rmr->param.lmr_triplet.pad = 0;
+ rmr->param.lmr_triplet.virtual_address = 0;
+ rmr->param.lmr_triplet.segment_length = 0;
+
+ rmr->param.mem_priv = 0;
+ rmr->pz = pz;
+ rmr->lmr = NULL;
+
+ return rmr;
+}
+
+static void dapl_rmr_dealloc(struct dapl_rmr *rmr)
+{
+ /* reset magic to prevent reuse */
+ rmr->header.magic = DAPL_MAGIC_INVALID;
+
+ dapl_ia_unlink_rmr(rmr->header.owner_ia, rmr);
+ /* no need to destroy rmr->header.lock */
+
+ kfree(rmr);
+}
+
+static inline u32 dapl_rmr_bind_fuse(struct dapl_rmr *rmr,
+ const struct dat_lmr_triplet *lmr_triplet,
+ enum dat_mem_priv_flags mem_priv,
+ struct dapl_ep *ep_ptr,
+ DAT_RMR_COOKIE user_cookie,
+ enum dat_completion_flags completion_flags,
+ DAT_RMR_CONTEXT *rmr_context)
+{
+ struct dapl_lmr *lmr;
+ struct dapl_cookie *cookie;
+ u32 status;
+ boolean_t is_signaled;
+
+ status = dapl_hash_search(rmr->header.owner_ia->hca_ptr->lmr_hash_table,
+ lmr_triplet->lmr_context,
+ (DAPL_HASH_DATA *) &lmr);
+ if (DAT_SUCCESS != status) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
+ goto bail;
+ }
+
+ /*
+ * if the ep in unconnected return an error. IB requires that the
+ * QP be connected to change a memory window binding since:
+ *
+ * - memory window bind operations are WQEs placed on a QP's
+ * send queue
+ *
+ * - QP's only process WQEs on the send queue when the QP is in
+ * the RTS state
+ */
+ if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
+ status =
+ DAT_ERROR(DAT_INVALID_STATE, dapl_ep_state_subtype(ep_ptr));
+ goto bail;
+ }
+
+ if (FALSE ==
+ dapl_mr_bounds_check(dapl_mr_get_address
+ (lmr->param.region_desc, lmr->param.mem_type),
+ lmr->param.length,
+ lmr_triplet->virtual_address,
+ lmr_triplet->segment_length)) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
+ goto bail;
+ }
+
+ /* If the LMR, RMR, and EP are not in the same PZ, there is an error */
+ if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) ||
+ (ep_ptr->param.pz_handle != rmr->param.pz_handle)) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
+ goto bail;
+ }
+
+ if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
+ ep_ptr->param.ep_attr.
+ request_completion_flags,
+ completion_flags) ||
+ !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
+ ep_ptr->param.ep_attr.
+ request_completion_flags,
+ completion_flags) ||
+ !dapl_rmr_validate_completion_flag(
+ DAT_COMPLETION_BARRIER_FENCE_FLAG,
+ ep_ptr->param.ep_attr.request_completion_flags,
+ completion_flags)) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
+ goto bail;
+ }
+
+ status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
+ &cookie);
+ if (DAT_SUCCESS != status)
+ goto bail;
+
+ is_signaled = (completion_flags & DAT_COMPLETION_SUPPRESS_FLAG) ?
+ FALSE : TRUE;
+
+ /*
+ * Take reference before posting to avoid race conditions with
+ * completions
+ */
+ atomic_inc(&ep_ptr->req_count);
+
+ status = dapl_ib_mw_bind(rmr, lmr, ep_ptr, cookie,
+ lmr_triplet->virtual_address,
+ lmr_triplet->segment_length,
+ mem_priv, is_signaled);
+ if (DAT_SUCCESS != status) {
+ atomic_dec(&ep_ptr->req_count);
+ dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
+ goto bail;
+ }
+
+ atomic_inc(&lmr->lmr_ref_count);
+
+ /* if the RMR was previously bound */
+ if (NULL != rmr->lmr)
+ atomic_dec(&rmr->lmr->lmr_ref_count);
+
+ rmr->param.mem_priv = mem_priv;
+ rmr->param.lmr_triplet = *lmr_triplet;
+ rmr->ep = ep_ptr;
+ rmr->lmr = lmr;
+
+ if (NULL != rmr_context)
+ *rmr_context = rmr->param.rmr_context;
+
+bail:
+ return status;
+}
+
+static inline u32 dapl_rmr_bind_unfuse(struct dapl_rmr *rmr,
+ struct dapl_ep *ep_ptr,
+ DAT_RMR_COOKIE user_cookie,
+ enum dat_completion_flags cflags)
+{
+ struct dapl_cookie *cookie;
+ u32 status = DAT_SUCCESS;
+ boolean_t is_signaled;
+
+ /*
+ * if the ep in unconnected return an error. IB requires that the
+ * QP be connected to change a memory window binding since:
+ *
+ * - memory window bind operations are WQEs placed on a QP's
+ * send queue
+ *
+ * - QP's only process WQEs on the send queue when the QP is in
+ * the RTS state
+ */
+ if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
+ status = DAT_ERROR(DAT_INVALID_STATE,
+ dapl_ep_state_subtype(ep_ptr));
+ goto bail1;
+ }
+
+ /* If the RMR and EP are not in the same PZ, there is an error */
+ if (ep_ptr->param.pz_handle != rmr->param.pz_handle) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
+ goto bail1;
+ }
+
+ if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
+ ep_ptr->param.ep_attr.
+ request_completion_flags,
+ cflags) ||
+ !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
+ ep_ptr->param.ep_attr.
+ request_completion_flags,
+ cflags) ||
+ !dapl_rmr_validate_completion_flag(
+ DAT_COMPLETION_BARRIER_FENCE_FLAG,
+ ep_ptr->param.ep_attr.request_completion_flags, cflags)) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
+ goto bail1;
+ }
+
+ status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
+ &cookie);
+ if (DAT_SUCCESS != status)
+ goto bail1;
+
+ is_signaled = (cflags & DAT_COMPLETION_UNSIGNALLED_FLAG) ? FALSE : TRUE;
+
+ /*
+ * Take reference before posting to avoid race conditions with
+ * completions
+ */
+ atomic_inc(&ep_ptr->req_count);
+
+ status = dapl_ib_mw_unbind(rmr, ep_ptr, cookie, is_signaled);
+ if (DAT_SUCCESS != status) {
+ atomic_dec(&ep_ptr->req_count);
+ dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
+ goto bail1;
+ }
+
+ /* if the RMR was previously bound */
+ if (NULL != rmr->lmr)
+ atomic_dec(&rmr->lmr->lmr_ref_count);
+
+ rmr->param.mem_priv = DAT_MEM_PRIV_NONE_FLAG;
+ rmr->param.lmr_triplet.lmr_context = 0;
+ rmr->param.lmr_triplet.virtual_address = 0;
+ rmr->param.lmr_triplet.segment_length = 0;
+ rmr->ep = ep_ptr;
+ rmr->lmr = NULL;
+
+bail1:
+ return status;
+}
+
+/*
+ * dapl_rmr_bind
+ *
+ * DAPL Requirements Version xxx, 6.6.4.4
+ *
+ * Bind the RMR to the specified memory region within the LMR and
+ * provide a new rmr_context value.
+ *
+ * Input:
+ * Output:
+ */
+u32 dapl_rmr_bind(DAT_RMR_HANDLE rmr_handle,
+ const struct dat_lmr_triplet *lmr_triplet,
+ enum dat_mem_priv_flags mem_priv, DAT_EP_HANDLE ep_handle,
+ DAT_RMR_COOKIE user_cookie,
+ enum dat_completion_flags completion_flags,
+ DAT_RMR_CONTEXT *rmr_context)
+{
+ struct dapl_rmr *rmr;
+ struct dapl_ep *ep_ptr;
+
+ if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR))
+ return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
+
+ if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))
+ return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
+
+ rmr = (struct dapl_rmr *)rmr_handle;
+ ep_ptr = (struct dapl_ep *)ep_handle;
+
+ /* if the rmr should be bound */
+ if (0 != lmr_triplet->segment_length)
+ return dapl_rmr_bind_fuse(rmr, lmr_triplet, mem_priv, ep_ptr,
+ user_cookie, completion_flags,
+ rmr_context);
+ else /* the rmr should be unbound */
+ return dapl_rmr_bind_unfuse(rmr, ep_ptr, user_cookie,
+ completion_flags);
+}
+
+/*
+ * dapl_rmr_create
+ *
+ * Create a remote memory region for the specified protection zone
+ *
+ * Input:
+ * pz_handle
+ *
+ * Output:
+ * rmr_handle
+ *
+ * Returns:
+ * DAT_SUCCESS
+ * DAT_INSUFFICIENT_RESOURCES
+ * DAT_INVALID_PARAMETER
+ */
+u32 dapl_rmr_create(DAT_PZ_HANDLE pz_handle, DAT_RMR_HANDLE *rmr_handle)
+{
+ struct dapl_pz *pz;
+ struct dapl_rmr *rmr;
+ u32 status = DAT_SUCCESS;
+
+ if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
+ status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ);
+ goto bail;
+ }
+
+ pz = (struct dapl_pz *)pz_handle;
+
+ rmr = dapl_rmr_alloc(pz);
+
+ if (rmr == NULL) {
+ status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
+ DAT_RESOURCE_MEMORY);
+ goto bail;
+ }
+
+ status = dapl_ib_mw_alloc(rmr);
+
+ if (status != DAT_SUCCESS) {
+ dapl_rmr_dealloc(rmr);
+ status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
+ DAT_RESOURCE_MEMORY_REGION);
+ goto bail;
+ }
+
+ atomic_inc(&pz->pz_ref_count);
+
+ *rmr_handle = rmr;
+
+bail:
+ return status;
+}
+
+/*
+ * dapl_rmr_free
+ *
+ * Destroy an instance of the Remote Memory Region
+ *
+ * Input:
+ * rmr_handle
+ *
+ * Output:
+ * none
+ *
+ * Returns:
+ * DAT_SUCCESS
+ * DAT_INVALID_PARAMETER
+ */
+u32 dapl_rmr_free(DAT_RMR_HANDLE rmr_handle)
+{
+ struct dapl_rmr *rmr;
+ u32 status = DAT_SUCCESS;
+
+ if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
+ status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
+ goto bail;
+ }
+
+ rmr = (struct dapl_rmr *)rmr_handle;
+
+ /*
+ * If the user did not perform an unbind op, release
+ * counts here.
+ */
+ if (rmr->param.lmr_triplet.virtual_address != 0) {
+ atomic_dec(&rmr->lmr->lmr_ref_count);
+ rmr->param.lmr_triplet.virtual_address = 0;
+ }
+
+ status = dapl_ib_mw_free(rmr);
+
+ if (status != DAT_SUCCESS)
+ goto bail;
+
+ atomic_dec(&rmr->pz->pz_ref_count);
+
+ dapl_rmr_dealloc(rmr);
+
+bail:
+ return status;
+}
+
+u32 dapl_rmr_query(DAT_RMR_HANDLE rmr_handle, struct dat_rmr_param *rmr_param)
+{
+ struct dapl_rmr *rmr;
+ u32 status = DAT_SUCCESS;
+
+ if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
+ status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
+ goto bail;
+ }
+ if (NULL == rmr_param) {
+ status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
+ goto bail;
+ }
+
+ rmr = (struct dapl_rmr *)rmr_handle;
+
+ memcpy(rmr_param, &rmr->param, sizeof *rmr_param);
+
+bail:
+ return status;
+}
Index: linux-kernel-rmr/dat-provider/dapl_rmr_util.h
===================================================================
--- linux-kernel-rmr/dat-provider/dapl_rmr_util.h (revision 2483)
+++ linux-kernel-rmr/dat-provider/dapl_rmr_util.h (working copy)
@@ -1,52 +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_RMR_UTIL_H
-#define DAPL_RMR_UTIL_H
-
-#include "dapl_mr_util.h"
-
-extern struct dapl_rmr *dapl_rmr_alloc(struct dapl_pz *pz);
-
-extern void dapl_rmr_dealloc(struct dapl_rmr *rmr);
-
-static inline boolean_t
-dapl_rmr_validate_completion_flag(enum dat_completion_flags mask,
- enum dat_completion_flags allow,
- enum dat_completion_flags request)
-{
- if ((mask & request) && !(mask & allow))
- return FALSE;
- else
- return TRUE;
-}
-
-#endif /* DAPL_RMR_UTIL_H */
Index: linux-kernel-rmr/patches/alt_dat_provider_makefile
===================================================================
--- linux-kernel-rmr/patches/alt_dat_provider_makefile (revision 2483)
+++ linux-kernel-rmr/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,16 +68,9 @@ 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 \
- dapl_rmr_free \
- dapl_rmr_query \
- dapl_rmr_util \
+ dapl_rmr \
dapl_rsp_create \
dapl_rsp_free \
dapl_rsp_query \
@@ -103,7 +91,7 @@ PROVIDER_OBJS := $(foreach s, $(PROVIDER
KDAPL_DEBUG = 1
ifeq (1,$(KDAPL_DEBUG))
EXTRA_CFLAGS += -O0 -g
- EXTRA_CFLAGS += -DDAPL_DBG # -DDAPL_DBG_IO_TRC
+ EXTRA_CFLAGS += -DDAPL_DBG
endif
EXTRA_CFLAGS += -DDAPL_ATS -Idrivers/infiniband/include -I$(obj)/../dat -I$(obj)/../patches/
@@ -121,4 +109,4 @@ default:
endif
clean:
- rm -f *.o *.ko
+ rm -f *.o *.ko .*.d .*.o.tmp *.mod.* .tmp_versions .*.cmd
Index: linux-kernel-rmr/patches/Makefile
===================================================================
--- linux-kernel-rmr/patches/Makefile (revision 2483)
+++ linux-kernel-rmr/patches/Makefile (working copy)
@@ -20,4 +20,4 @@ default:
endif
clean:
- rm -f *.o *.ko
+ rm -rf *.o *.ko .*.d .*.o.tmp *.mod.* .tmp_versions .*.cmd
More information about the general
mailing list