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

James Lentini jlentini at netapp.com
Wed May 25 14:13:11 PDT 2005


Committed in revision 2488.

On Wed, 25 May 2005, Tom Duffy wrote:

tduffy> Signed-off-by: Tom Duffy <tduffy at sun.com>
tduffy> 
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr_create.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr_create.c	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr_create.c	(working copy)
tduffy> @@ -1,89 +0,0 @@
tduffy> -/*
tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> - *
tduffy> - * This Software is licensed under one of the following licenses:
tduffy> - *
tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/cpl.php.
tduffy> - *
tduffy> - * 2) under the terms of the "The BSD License" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> - *
tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> - *    copy of which is available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> - *
tduffy> - * Licensee has the right to choose one of the above licenses.
tduffy> - *
tduffy> - * Redistributions of source code must retain the above copyright
tduffy> - * notice and one of the license notices.
tduffy> - *
tduffy> - * Redistributions in binary form must reproduce both the above copyright
tduffy> - * notice, one of the license notices in the documentation
tduffy> - * and/or other materials provided with the distribution.
tduffy> - */
tduffy> -
tduffy> -/*
tduffy> - * $Id$
tduffy> - */
tduffy> -
tduffy> -#include "dapl_rmr_util.h"
tduffy> -#include "dapl_openib_util.h"
tduffy> -
tduffy> -/*
tduffy> - * dapl_rmr_create
tduffy> - *
tduffy> - * Create a remote memory region for the specified protection zone
tduffy> - *
tduffy> - * Input:
tduffy> - * 	pz_handle
tduffy> - *
tduffy> - * Output:
tduffy> - * 	rmr_handle
tduffy> - *
tduffy> - * Returns:
tduffy> - * 	DAT_SUCCESS
tduffy> - * 	DAT_INSUFFICIENT_RESOURCES
tduffy> - * 	DAT_INVALID_PARAMETER
tduffy> - */
tduffy> -u32 dapl_rmr_create(DAT_PZ_HANDLE pz_handle, DAT_RMR_HANDLE *rmr_handle)
tduffy> -{
tduffy> -	struct dapl_pz *pz;
tduffy> -	struct dapl_rmr *rmr;
tduffy> -	u32 dat_status = DAT_SUCCESS;
tduffy> -
tduffy> -	if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
tduffy> -		dat_status =
tduffy> -		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	pz = (struct dapl_pz *)pz_handle;
tduffy> -
tduffy> -	rmr = dapl_rmr_alloc(pz);
tduffy> -
tduffy> -	if (rmr == NULL) {
tduffy> -		dat_status =
tduffy> -		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES, DAT_RESOURCE_MEMORY);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	dat_status = dapl_ib_mw_alloc(rmr);
tduffy> -
tduffy> -	if (dat_status != DAT_SUCCESS) {
tduffy> -		dapl_rmr_dealloc(rmr);
tduffy> -		dat_status =
tduffy> -		    DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
tduffy> -			      DAT_RESOURCE_MEMORY_REGION);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	atomic_inc(&pz->pz_ref_count);
tduffy> -
tduffy> -	*rmr_handle = rmr;
tduffy> -
tduffy> -bail:
tduffy> -	return dat_status;
tduffy> -}
tduffy> Index: linux-kernel-rmr/dat-provider/Makefile
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/Makefile	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/Makefile	(working copy)
tduffy> @@ -76,11 +61,7 @@ PROVIDER_MODULES := \
tduffy>          dapl_psp_query                	\
tduffy>          dapl_pz                         \
tduffy>          dapl_ring_buffer_util         	\
tduffy> -        dapl_rmr_bind                 	\
tduffy> -        dapl_rmr_create               	\
tduffy> -        dapl_rmr_free                 	\
tduffy> -        dapl_rmr_query                	\
tduffy> -        dapl_rmr_util                 	\
tduffy> +        dapl_rmr                 	\
tduffy>          dapl_rsp_create               	\
tduffy>          dapl_rsp_free                 	\
tduffy>          dapl_rsp_query                	\
tduffy> @@ -98,5 +79,25 @@ PROVIDER_MODULES := \
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr_free.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr_free.c	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr_free.c	(working copy)
tduffy> @@ -1,84 +0,0 @@
tduffy> -/*
tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> - *
tduffy> - * This Software is licensed under one of the following licenses:
tduffy> - *
tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/cpl.php.
tduffy> - *
tduffy> - * 2) under the terms of the "The BSD License" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> - *
tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> - *    copy of which is available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> - *
tduffy> - * Licensee has the right to choose one of the above licenses.
tduffy> - *
tduffy> - * Redistributions of source code must retain the above copyright
tduffy> - * notice and one of the license notices.
tduffy> - *
tduffy> - * Redistributions in binary form must reproduce both the above copyright
tduffy> - * notice, one of the license notices in the documentation
tduffy> - * and/or other materials provided with the distribution.
tduffy> - */
tduffy> -
tduffy> -/*
tduffy> - * $Id$
tduffy> - */
tduffy> -
tduffy> -#include "dapl_rmr_util.h"
tduffy> -#include "dapl_openib_util.h"
tduffy> -#include "dapl_ia_util.h"
tduffy> -
tduffy> -/*
tduffy> - * dapl_rmr_free
tduffy> - *
tduffy> - * Destroy an instance of the Remote Memory Region
tduffy> - *
tduffy> - * Input:
tduffy> - * 	rmr_handle
tduffy> - *
tduffy> - * Output:
tduffy> - * 	none
tduffy> - *
tduffy> - * Returns:
tduffy> - * 	DAT_SUCCESS
tduffy> - * 	DAT_INVALID_PARAMETER
tduffy> - */
tduffy> -u32 dapl_rmr_free(DAT_RMR_HANDLE rmr_handle)
tduffy> -{
tduffy> -	struct dapl_rmr *rmr;
tduffy> -	u32 dat_status = DAT_SUCCESS;
tduffy> -
tduffy> -	if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
tduffy> -		dat_status =
tduffy> -		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	rmr = (struct dapl_rmr *)rmr_handle;
tduffy> -
tduffy> -	/*
tduffy> -	 * If the user did not perform an unbind op, release
tduffy> -	 * counts here.
tduffy> -	 */
tduffy> -	if (rmr->param.lmr_triplet.virtual_address != 0) {
tduffy> -		atomic_dec(&rmr->lmr->lmr_ref_count);
tduffy> -		rmr->param.lmr_triplet.virtual_address = 0;
tduffy> -	}
tduffy> -
tduffy> -	dat_status = dapl_ib_mw_free(rmr);
tduffy> -
tduffy> -	if (dat_status != DAT_SUCCESS)
tduffy> -		goto bail;
tduffy> -
tduffy> -	atomic_dec(&rmr->pz->pz_ref_count);
tduffy> -
tduffy> -	dapl_rmr_dealloc(rmr);
tduffy> -
tduffy> -bail:
tduffy> -	return dat_status;
tduffy> -}
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr_query.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr_query.c	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr_query.c	(working copy)
tduffy> @@ -1,55 +0,0 @@
tduffy> -/*
tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> - *
tduffy> - * This Software is licensed under one of the following licenses:
tduffy> - *
tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/cpl.php.
tduffy> - *
tduffy> - * 2) under the terms of the "The BSD License" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> - *
tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> - *    copy of which is available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> - *
tduffy> - * Licensee has the right to choose one of the above licenses.
tduffy> - *
tduffy> - * Redistributions of source code must retain the above copyright
tduffy> - * notice and one of the license notices.
tduffy> - *
tduffy> - * Redistributions in binary form must reproduce both the above copyright
tduffy> - * notice, one of the license notices in the documentation
tduffy> - * and/or other materials provided with the distribution.
tduffy> - */
tduffy> -
tduffy> -/*
tduffy> - * $Id$
tduffy> - */
tduffy> -
tduffy> -#include "dapl.h"
tduffy> -
tduffy> -u32 dapl_rmr_query(DAT_RMR_HANDLE rmr_handle, struct dat_rmr_param *rmr_param)
tduffy> -{
tduffy> -	struct dapl_rmr *rmr;
tduffy> -	u32 dat_status = DAT_SUCCESS;
tduffy> -
tduffy> -	if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
tduffy> -		dat_status =
tduffy> -		    DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -	if (NULL == rmr_param) {
tduffy> -		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	rmr = (struct dapl_rmr *)rmr_handle;
tduffy> -
tduffy> -	memcpy(rmr_param, &rmr->param, sizeof *rmr_param);
tduffy> -
tduffy> -bail:
tduffy> -	return dat_status;
tduffy> -}
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr_bind.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr_bind.c	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr_bind.c	(working copy)
tduffy> @@ -1,273 +0,0 @@
tduffy> -/*
tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> - *
tduffy> - * This Software is licensed under one of the following licenses:
tduffy> - *
tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/cpl.php.
tduffy> - *
tduffy> - * 2) under the terms of the "The BSD License" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> - *
tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> - *    copy of which is available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> - *
tduffy> - * Licensee has the right to choose one of the above licenses.
tduffy> - *
tduffy> - * Redistributions of source code must retain the above copyright
tduffy> - * notice and one of the license notices.
tduffy> - *
tduffy> - * Redistributions in binary form must reproduce both the above copyright
tduffy> - * notice, one of the license notices in the documentation
tduffy> - * and/or other materials provided with the distribution.
tduffy> - */
tduffy> -
tduffy> -/*
tduffy> - * $Id$
tduffy> - */
tduffy> -
tduffy> -#include "dapl.h"
tduffy> -#include "dapl_rmr_util.h"
tduffy> -#include "dapl_ep_util.h"
tduffy> -#include "dapl_cookie.h"
tduffy> -#include "dapl_openib_util.h"
tduffy> -
tduffy> -/*********************************************************************
tduffy> - *                                                                   *
tduffy> - * Function Definitions                                              *
tduffy> - *                                                                   *
tduffy> - *********************************************************************/
tduffy> -
tduffy> -static inline u32 dapl_rmr_bind_fuse(struct dapl_rmr *rmr,
tduffy> -				     const struct dat_lmr_triplet *lmr_triplet,
tduffy> -				     enum dat_mem_priv_flags mem_priv,
tduffy> -				     struct dapl_ep *ep_ptr,
tduffy> -				     DAT_RMR_COOKIE user_cookie,
tduffy> -				     enum dat_completion_flags completion_flags,
tduffy> -				     DAT_RMR_CONTEXT *rmr_context)
tduffy> -{
tduffy> -	struct dapl_lmr *lmr;
tduffy> -	struct dapl_cookie *cookie;
tduffy> -	u32 status;
tduffy> -	boolean_t is_signaled;
tduffy> -
tduffy> -	status = dapl_hash_search(rmr->header.owner_ia->hca_ptr->lmr_hash_table,
tduffy> -                                  lmr_triplet->lmr_context,
tduffy> -                                  (DAPL_HASH_DATA *) &lmr);
tduffy> -	if (DAT_SUCCESS != status) {
tduffy> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	/* if the ep in unconnected return an error. IB requires that the */
tduffy> -	/* QP be connected to change a memory window binding since:       */
tduffy> -	/*                                                                */
tduffy> -	/* - memory window bind operations are WQEs placed on a QP's      */
tduffy> -	/*   send queue                                                   */
tduffy> -	/*                                                                */
tduffy> -	/* - QP's only process WQEs on the send queue when the QP is in   */
tduffy> -	/*   the RTS state                                                */
tduffy> -	if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
tduffy> -		status =
tduffy> -		    DAT_ERROR(DAT_INVALID_STATE, dapl_ep_state_subtype(ep_ptr));
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	if (FALSE ==
tduffy> -	    dapl_mr_bounds_check(dapl_mr_get_address
tduffy> -				 (lmr->param.region_desc, lmr->param.mem_type),
tduffy> -				 lmr->param.length,
tduffy> -				 lmr_triplet->virtual_address,
tduffy> -				 lmr_triplet->segment_length)) {
tduffy> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	/* If the LMR, RMR, and EP are not in the same PZ, there is an error */
tduffy> -	if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) ||
tduffy> -	    (ep_ptr->param.pz_handle != rmr->param.pz_handle)) {
tduffy> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
tduffy> -					       ep_ptr->param.ep_attr.
tduffy> -					       request_completion_flags,
tduffy> -					       completion_flags) ||
tduffy> -	    !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
tduffy> -					       ep_ptr->param.ep_attr.
tduffy> -					       request_completion_flags,
tduffy> -					       completion_flags) ||
tduffy> -	    !dapl_rmr_validate_completion_flag(
tduffy> -                    DAT_COMPLETION_BARRIER_FENCE_FLAG,
tduffy> -                    ep_ptr->param.ep_attr.request_completion_flags,
tduffy> -                    completion_flags)) {
tduffy> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
tduffy> -                                       &cookie);
tduffy> -	if (DAT_SUCCESS != status)
tduffy> -		goto bail;
tduffy> -
tduffy> -	is_signaled = (completion_flags & DAT_COMPLETION_SUPPRESS_FLAG) ? 
tduffy> -                FALSE : TRUE;
tduffy> -        
tduffy> -	/*
tduffy> -	 * Take reference before posting to avoid race conditions with
tduffy> -	 * completions
tduffy> -	 */
tduffy> -	atomic_inc(&ep_ptr->req_count);
tduffy> -
tduffy> -	status = dapl_ib_mw_bind(rmr, lmr, ep_ptr, cookie,
tduffy> -                                 lmr_triplet->virtual_address,
tduffy> -                                 lmr_triplet->segment_length,
tduffy> -                                 mem_priv, is_signaled);
tduffy> -	if (DAT_SUCCESS != status) {
tduffy> -		atomic_dec(&ep_ptr->req_count);
tduffy> -		dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
tduffy> -		goto bail;
tduffy> -	}
tduffy> -
tduffy> -	atomic_inc(&lmr->lmr_ref_count);
tduffy> -
tduffy> -	/* if the RMR was previously bound */
tduffy> -	if (NULL != rmr->lmr)
tduffy> -		atomic_dec(&rmr->lmr->lmr_ref_count);
tduffy> -
tduffy> -	rmr->param.mem_priv = mem_priv;
tduffy> -	rmr->param.lmr_triplet = *lmr_triplet;
tduffy> -	rmr->ep = ep_ptr;
tduffy> -	rmr->lmr = lmr;
tduffy> -
tduffy> -	if (NULL != rmr_context)
tduffy> -		*rmr_context = rmr->param.rmr_context;
tduffy> -
tduffy> -bail:
tduffy> -	return status;
tduffy> -}
tduffy> -
tduffy> -static inline u32 dapl_rmr_bind_unfuse(struct dapl_rmr *rmr,
tduffy> -				       struct dapl_ep *ep_ptr,
tduffy> -				       DAT_RMR_COOKIE user_cookie,
tduffy> -				       enum dat_completion_flags cflags)
tduffy> -{
tduffy> -	struct dapl_cookie *cookie;
tduffy> -	u32 status = DAT_SUCCESS;
tduffy> -	boolean_t is_signaled;
tduffy> -
tduffy> -	/*
tduffy> -	 * if the ep in unconnected return an error. IB requires that the
tduffy> -	 * QP be connected to change a memory window binding since:
tduffy> -	 *
tduffy> -	 * - memory window bind operations are WQEs placed on a QP's
tduffy> -	 *   send queue
tduffy> -	 *
tduffy> -	 * - QP's only process WQEs on the send queue when the QP is in
tduffy> -	 *   the RTS state
tduffy> -	 */
tduffy> -	if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
tduffy> -		status =
tduffy> -		    DAT_ERROR(DAT_INVALID_STATE, dapl_ep_state_subtype(ep_ptr));
tduffy> -		goto bail1;
tduffy> -	}
tduffy> -
tduffy> -	/* If the RMR and EP are not in the same PZ, there is an error */
tduffy> -	if (ep_ptr->param.pz_handle != rmr->param.pz_handle) {
tduffy> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> -		goto bail1;
tduffy> -	}
tduffy> -
tduffy> -	if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
tduffy> -					       ep_ptr->param.ep_attr.
tduffy> -					       request_completion_flags,
tduffy> -					       cflags) ||
tduffy> -	    !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
tduffy> -					       ep_ptr->param.ep_attr.
tduffy> -					       request_completion_flags,
tduffy> -					       cflags) ||
tduffy> -	    !dapl_rmr_validate_completion_flag(
tduffy> -                    DAT_COMPLETION_BARRIER_FENCE_FLAG,
tduffy> -                    ep_ptr->param.ep_attr.request_completion_flags, cflags)) {
tduffy> -		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> -		goto bail1;
tduffy> -	}
tduffy> -
tduffy> -	status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
tduffy> -                                       &cookie);
tduffy> -	if (DAT_SUCCESS != status)
tduffy> -		goto bail1;
tduffy> -
tduffy> -	is_signaled = (cflags & DAT_COMPLETION_UNSIGNALLED_FLAG) ? FALSE : TRUE;
tduffy> -
tduffy> -	/*
tduffy> -	 * Take reference before posting to avoid race conditions with 
tduffy> -	 * completions 
tduffy> -	 */
tduffy> -	atomic_inc(&ep_ptr->req_count);
tduffy> -
tduffy> -	status = dapl_ib_mw_unbind(rmr, ep_ptr, cookie, is_signaled);
tduffy> -	if (DAT_SUCCESS != status) {
tduffy> -		atomic_dec(&ep_ptr->req_count);
tduffy> -		dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
tduffy> -		goto bail1;
tduffy> -	}
tduffy> -
tduffy> -	/* if the RMR was previously bound */
tduffy> -	if (NULL != rmr->lmr)
tduffy> -		atomic_dec(&rmr->lmr->lmr_ref_count);
tduffy> -
tduffy> -	rmr->param.mem_priv = DAT_MEM_PRIV_NONE_FLAG;
tduffy> -	rmr->param.lmr_triplet.lmr_context = 0;
tduffy> -	rmr->param.lmr_triplet.virtual_address = 0;
tduffy> -	rmr->param.lmr_triplet.segment_length = 0;
tduffy> -	rmr->ep = ep_ptr;
tduffy> -	rmr->lmr = NULL;
tduffy> -
tduffy> -bail1:
tduffy> -	return status;
tduffy> -}
tduffy> -
tduffy> -/*
tduffy> - * dapl_rmr_bind
tduffy> - *
tduffy> - * DAPL Requirements Version xxx, 6.6.4.4
tduffy> - *
tduffy> - * Bind the RMR to the specified memory region within the LMR and
tduffy> - * provide a new rmr_context value.
tduffy> - *
tduffy> - * Input:
tduffy> - * Output:
tduffy> - */
tduffy> -u32 dapl_rmr_bind(DAT_RMR_HANDLE rmr_handle,
tduffy> -		  const struct dat_lmr_triplet *lmr_triplet,
tduffy> -		  enum dat_mem_priv_flags mem_priv, DAT_EP_HANDLE ep_handle,
tduffy> -		  DAT_RMR_COOKIE user_cookie,
tduffy> -		  enum dat_completion_flags completion_flags,
tduffy> -		  DAT_RMR_CONTEXT *rmr_context)
tduffy> -{
tduffy> -	struct dapl_rmr *rmr;
tduffy> -	struct dapl_ep *ep_ptr;
tduffy> -
tduffy> -	if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR))
tduffy> -		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
tduffy> -
tduffy> -	if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))
tduffy> -		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
tduffy> -
tduffy> -	rmr = (struct dapl_rmr *)rmr_handle;
tduffy> -	ep_ptr = (struct dapl_ep *)ep_handle;
tduffy> -
tduffy> -	/* if the rmr should be bound */
tduffy> -	if (0 != lmr_triplet->segment_length)
tduffy> -		return dapl_rmr_bind_fuse(rmr, lmr_triplet, mem_priv, ep_ptr,
tduffy> -					  user_cookie, completion_flags, 
tduffy> -                                          rmr_context);
tduffy> -	else /* the rmr should be unbound */
tduffy> -		return dapl_rmr_bind_unfuse(rmr, ep_ptr, user_cookie, 
tduffy> -                                            completion_flags);
tduffy> -}
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_openib_util.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_openib_util.c	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_openib_util.c	(working copy)
tduffy> @@ -37,7 +37,6 @@
tduffy>  #include "dapl_openib_util.h"
tduffy>  #include "dapl_evd_util.h"
tduffy>  #include "dapl_cr_util.h"
tduffy> -#include "dapl_rmr_util.h"
tduffy>  #include "dapl_cookie.h"
tduffy>  #include "dapl_openib_cm.h"
tduffy>  
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr_util.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr_util.c	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr_util.c	(working copy)
tduffy> @@ -1,82 +0,0 @@
tduffy> -/*
tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> - *
tduffy> - * This Software is licensed under one of the following licenses:
tduffy> - *
tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/cpl.php.
tduffy> - *
tduffy> - * 2) under the terms of the "The BSD License" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> - *
tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> - *    copy of which is available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> - *
tduffy> - * Licensee has the right to choose one of the above licenses.
tduffy> - *
tduffy> - * Redistributions of source code must retain the above copyright
tduffy> - * notice and one of the license notices.
tduffy> - *
tduffy> - * Redistributions in binary form must reproduce both the above copyright
tduffy> - * notice, one of the license notices in the documentation
tduffy> - * and/or other materials provided with the distribution.
tduffy> - */
tduffy> -
tduffy> -#include "dapl_rmr_util.h"
tduffy> -#include "dapl_ia_util.h"
tduffy> -
tduffy> -struct dapl_rmr *dapl_rmr_alloc(struct dapl_pz *pz)
tduffy> -{
tduffy> -	struct dapl_rmr *rmr;
tduffy> -
tduffy> -	/* Allocate LMR */
tduffy> -	rmr = kmalloc(sizeof *rmr, GFP_ATOMIC);
tduffy> -	if (!rmr)
tduffy> -		return NULL;
tduffy> -
tduffy> -	/* zero the structure */
tduffy> -	memset(rmr, 0, sizeof *rmr);
tduffy> -
tduffy> -	/*
tduffy> -	 * initialize the header
tduffy> -	 */
tduffy> -	rmr->header.provider = pz->header.provider;
tduffy> -	rmr->header.magic = DAPL_MAGIC_RMR;
tduffy> -	rmr->header.handle_type = DAT_HANDLE_TYPE_RMR;
tduffy> -	rmr->header.owner_ia = pz->header.owner_ia;
tduffy> -	rmr->header.user_context.as_64 = 0;
tduffy> -	rmr->header.user_context.as_ptr = NULL;
tduffy> -	dapl_llist_init_entry(&rmr->header.ia_list_entry);
tduffy> -	dapl_ia_link_rmr(rmr->header.owner_ia, rmr);
tduffy> -	spin_lock_init(&rmr->header.lock);
tduffy> -
tduffy> -	/* 
tduffy> -	 * initialize the body 
tduffy> -	 */
tduffy> -	rmr->param.ia_handle = (DAT_IA_HANDLE) pz->header.owner_ia;
tduffy> -	rmr->param.pz_handle = (DAT_PZ_HANDLE) pz;
tduffy> -	rmr->param.lmr_triplet.lmr_context = 0;
tduffy> -	rmr->param.lmr_triplet.pad = 0;
tduffy> -	rmr->param.lmr_triplet.virtual_address = 0;
tduffy> -	rmr->param.lmr_triplet.segment_length = 0;
tduffy> -
tduffy> -	rmr->param.mem_priv = 0;
tduffy> -	rmr->pz = pz;
tduffy> -	rmr->lmr = NULL;
tduffy> -
tduffy> -	return rmr;
tduffy> -}
tduffy> -
tduffy> -void dapl_rmr_dealloc(struct dapl_rmr *rmr)
tduffy> -{
tduffy> -	/* reset magic to prevent reuse */
tduffy> -	rmr->header.magic = DAPL_MAGIC_INVALID;
tduffy> -
tduffy> -	dapl_ia_unlink_rmr(rmr->header.owner_ia, rmr);
tduffy> -	/* no need to destroy rmr->header.lock */
tduffy> -
tduffy> -	kfree(rmr);
tduffy> -}
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr.c
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr.c	(revision 0)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr.c	(revision 0)
tduffy> @@ -0,0 +1,461 @@
tduffy> +/*
tduffy> + * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> + *
tduffy> + * This Software is licensed under one of the following licenses:
tduffy> + *
tduffy> + * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> + *    available from the Open Source Initiative, see
tduffy> + *    http://www.opensource.org/licenses/cpl.php.
tduffy> + *
tduffy> + * 2) under the terms of the "The BSD License" a copy of which is
tduffy> + *    available from the Open Source Initiative, see
tduffy> + *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> + *
tduffy> + * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> + *    copy of which is available from the Open Source Initiative, see
tduffy> + *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> + *
tduffy> + * Licensee has the right to choose one of the above licenses.
tduffy> + *
tduffy> + * Redistributions of source code must retain the above copyright
tduffy> + * notice and one of the license notices.
tduffy> + *
tduffy> + * Redistributions in binary form must reproduce both the above copyright
tduffy> + * notice, one of the license notices in the documentation
tduffy> + * and/or other materials provided with the distribution.
tduffy> + */
tduffy> +
tduffy> +/*
tduffy> + * $Id$
tduffy> + */
tduffy> +
tduffy> +#include "dapl.h"
tduffy> +#include "dapl_ep_util.h"
tduffy> +#include "dapl_ia_util.h"
tduffy> +#include "dapl_mr_util.h"
tduffy> +#include "dapl_hash.h"
tduffy> +#include "dapl_cookie.h"
tduffy> +#include "dapl_openib_util.h"
tduffy> +
tduffy> +static inline boolean_t
tduffy> +dapl_rmr_validate_completion_flag(enum dat_completion_flags mask,
tduffy> +				  enum dat_completion_flags allow,
tduffy> +				  enum dat_completion_flags request)
tduffy> +{
tduffy> +	if ((mask & request) && !(mask & allow))
tduffy> +		return FALSE;
tduffy> +	else
tduffy> +		return TRUE;
tduffy> +}
tduffy> +
tduffy> +
tduffy> +static struct dapl_rmr *dapl_rmr_alloc(struct dapl_pz *pz)
tduffy> +{
tduffy> +	struct dapl_rmr *rmr;
tduffy> +
tduffy> +	/* Allocate LMR */
tduffy> +	rmr = kmalloc(sizeof *rmr, GFP_ATOMIC);
tduffy> +	if (!rmr)
tduffy> +		return NULL;
tduffy> +
tduffy> +	/* zero the structure */
tduffy> +	memset(rmr, 0, sizeof *rmr);
tduffy> +
tduffy> +	/*
tduffy> +	 * initialize the header
tduffy> +	 */
tduffy> +	rmr->header.provider = pz->header.provider;
tduffy> +	rmr->header.magic = DAPL_MAGIC_RMR;
tduffy> +	rmr->header.handle_type = DAT_HANDLE_TYPE_RMR;
tduffy> +	rmr->header.owner_ia = pz->header.owner_ia;
tduffy> +	rmr->header.user_context.as_64 = 0;
tduffy> +	rmr->header.user_context.as_ptr = NULL;
tduffy> +	dapl_llist_init_entry(&rmr->header.ia_list_entry);
tduffy> +	dapl_ia_link_rmr(rmr->header.owner_ia, rmr);
tduffy> +	spin_lock_init(&rmr->header.lock);
tduffy> +
tduffy> +	/* 
tduffy> +	 * initialize the body 
tduffy> +	 */
tduffy> +	rmr->param.ia_handle = (DAT_IA_HANDLE)pz->header.owner_ia;
tduffy> +	rmr->param.pz_handle = (DAT_PZ_HANDLE)pz;
tduffy> +	rmr->param.lmr_triplet.lmr_context = 0;
tduffy> +	rmr->param.lmr_triplet.pad = 0;
tduffy> +	rmr->param.lmr_triplet.virtual_address = 0;
tduffy> +	rmr->param.lmr_triplet.segment_length = 0;
tduffy> +
tduffy> +	rmr->param.mem_priv = 0;
tduffy> +	rmr->pz = pz;
tduffy> +	rmr->lmr = NULL;
tduffy> +
tduffy> +	return rmr;
tduffy> +}
tduffy> +
tduffy> +static void dapl_rmr_dealloc(struct dapl_rmr *rmr)
tduffy> +{
tduffy> +	/* reset magic to prevent reuse */
tduffy> +	rmr->header.magic = DAPL_MAGIC_INVALID;
tduffy> +
tduffy> +	dapl_ia_unlink_rmr(rmr->header.owner_ia, rmr);
tduffy> +	/* no need to destroy rmr->header.lock */
tduffy> +
tduffy> +	kfree(rmr);
tduffy> +}
tduffy> +
tduffy> +static inline u32 dapl_rmr_bind_fuse(struct dapl_rmr *rmr,
tduffy> +				     const struct dat_lmr_triplet *lmr_triplet,
tduffy> +				     enum dat_mem_priv_flags mem_priv,
tduffy> +				     struct dapl_ep *ep_ptr,
tduffy> +				     DAT_RMR_COOKIE user_cookie,
tduffy> +				     enum dat_completion_flags completion_flags,
tduffy> +				     DAT_RMR_CONTEXT *rmr_context)
tduffy> +{
tduffy> +	struct dapl_lmr *lmr;
tduffy> +	struct dapl_cookie *cookie;
tduffy> +	u32 status;
tduffy> +	boolean_t is_signaled;
tduffy> +
tduffy> +	status = dapl_hash_search(rmr->header.owner_ia->hca_ptr->lmr_hash_table,
tduffy> +                                  lmr_triplet->lmr_context,
tduffy> +                                  (DAPL_HASH_DATA *) &lmr);
tduffy> +	if (DAT_SUCCESS != status) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	/*
tduffy> +	 * if the ep in unconnected return an error. IB requires that the
tduffy> +	 * QP be connected to change a memory window binding since:
tduffy> +	 *
tduffy> +	 * - memory window bind operations are WQEs placed on a QP's
tduffy> +	 *   send queue
tduffy> +	 *
tduffy> +	 * - QP's only process WQEs on the send queue when the QP is in
tduffy> +	 *   the RTS state
tduffy> +	 */
tduffy> +	if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
tduffy> +		status =
tduffy> +		    DAT_ERROR(DAT_INVALID_STATE, dapl_ep_state_subtype(ep_ptr));
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	if (FALSE ==
tduffy> +	    dapl_mr_bounds_check(dapl_mr_get_address
tduffy> +				 (lmr->param.region_desc, lmr->param.mem_type),
tduffy> +				 lmr->param.length,
tduffy> +				 lmr_triplet->virtual_address,
tduffy> +				 lmr_triplet->segment_length)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	/* If the LMR, RMR, and EP are not in the same PZ, there is an error */
tduffy> +	if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) ||
tduffy> +	    (ep_ptr->param.pz_handle != rmr->param.pz_handle)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
tduffy> +					       ep_ptr->param.ep_attr.
tduffy> +					       request_completion_flags,
tduffy> +					       completion_flags) ||
tduffy> +	    !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
tduffy> +					       ep_ptr->param.ep_attr.
tduffy> +					       request_completion_flags,
tduffy> +					       completion_flags) ||
tduffy> +	    !dapl_rmr_validate_completion_flag(
tduffy> +                    DAT_COMPLETION_BARRIER_FENCE_FLAG,
tduffy> +                    ep_ptr->param.ep_attr.request_completion_flags,
tduffy> +                    completion_flags)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
tduffy> +                                       &cookie);
tduffy> +	if (DAT_SUCCESS != status)
tduffy> +		goto bail;
tduffy> +
tduffy> +	is_signaled = (completion_flags & DAT_COMPLETION_SUPPRESS_FLAG) ? 
tduffy> +                FALSE : TRUE;
tduffy> +        
tduffy> +	/*
tduffy> +	 * Take reference before posting to avoid race conditions with
tduffy> +	 * completions
tduffy> +	 */
tduffy> +	atomic_inc(&ep_ptr->req_count);
tduffy> +
tduffy> +	status = dapl_ib_mw_bind(rmr, lmr, ep_ptr, cookie,
tduffy> +                                 lmr_triplet->virtual_address,
tduffy> +                                 lmr_triplet->segment_length,
tduffy> +                                 mem_priv, is_signaled);
tduffy> +	if (DAT_SUCCESS != status) {
tduffy> +		atomic_dec(&ep_ptr->req_count);
tduffy> +		dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	atomic_inc(&lmr->lmr_ref_count);
tduffy> +
tduffy> +	/* if the RMR was previously bound */
tduffy> +	if (NULL != rmr->lmr)
tduffy> +		atomic_dec(&rmr->lmr->lmr_ref_count);
tduffy> +
tduffy> +	rmr->param.mem_priv = mem_priv;
tduffy> +	rmr->param.lmr_triplet = *lmr_triplet;
tduffy> +	rmr->ep = ep_ptr;
tduffy> +	rmr->lmr = lmr;
tduffy> +
tduffy> +	if (NULL != rmr_context)
tduffy> +		*rmr_context = rmr->param.rmr_context;
tduffy> +
tduffy> +bail:
tduffy> +	return status;
tduffy> +}
tduffy> +
tduffy> +static inline u32 dapl_rmr_bind_unfuse(struct dapl_rmr *rmr,
tduffy> +				       struct dapl_ep *ep_ptr,
tduffy> +				       DAT_RMR_COOKIE user_cookie,
tduffy> +				       enum dat_completion_flags cflags)
tduffy> +{
tduffy> +	struct dapl_cookie *cookie;
tduffy> +	u32 status = DAT_SUCCESS;
tduffy> +	boolean_t is_signaled;
tduffy> +
tduffy> +	/*
tduffy> +	 * if the ep in unconnected return an error. IB requires that the
tduffy> +	 * QP be connected to change a memory window binding since:
tduffy> +	 *
tduffy> +	 * - memory window bind operations are WQEs placed on a QP's
tduffy> +	 *   send queue
tduffy> +	 *
tduffy> +	 * - QP's only process WQEs on the send queue when the QP is in
tduffy> +	 *   the RTS state
tduffy> +	 */
tduffy> +	if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_STATE,
tduffy> +				   dapl_ep_state_subtype(ep_ptr));
tduffy> +		goto bail1;
tduffy> +	}
tduffy> +
tduffy> +	/* If the RMR and EP are not in the same PZ, there is an error */
tduffy> +	if (ep_ptr->param.pz_handle != rmr->param.pz_handle) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> +		goto bail1;
tduffy> +	}
tduffy> +
tduffy> +	if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
tduffy> +					       ep_ptr->param.ep_attr.
tduffy> +					       request_completion_flags,
tduffy> +					       cflags) ||
tduffy> +	    !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
tduffy> +					       ep_ptr->param.ep_attr.
tduffy> +					       request_completion_flags,
tduffy> +					       cflags) ||
tduffy> +	    !dapl_rmr_validate_completion_flag(
tduffy> +                    DAT_COMPLETION_BARRIER_FENCE_FLAG,
tduffy> +                    ep_ptr->param.ep_attr.request_completion_flags, cflags)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
tduffy> +		goto bail1;
tduffy> +	}
tduffy> +
tduffy> +	status = dapl_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr, user_cookie,
tduffy> +                                       &cookie);
tduffy> +	if (DAT_SUCCESS != status)
tduffy> +		goto bail1;
tduffy> +
tduffy> +	is_signaled = (cflags & DAT_COMPLETION_UNSIGNALLED_FLAG) ? FALSE : TRUE;
tduffy> +
tduffy> +	/*
tduffy> +	 * Take reference before posting to avoid race conditions with 
tduffy> +	 * completions 
tduffy> +	 */
tduffy> +	atomic_inc(&ep_ptr->req_count);
tduffy> +
tduffy> +	status = dapl_ib_mw_unbind(rmr, ep_ptr, cookie, is_signaled);
tduffy> +	if (DAT_SUCCESS != status) {
tduffy> +		atomic_dec(&ep_ptr->req_count);
tduffy> +		dapl_cookie_dealloc(&ep_ptr->req_buffer, cookie);
tduffy> +		goto bail1;
tduffy> +	}
tduffy> +
tduffy> +	/* if the RMR was previously bound */
tduffy> +	if (NULL != rmr->lmr)
tduffy> +		atomic_dec(&rmr->lmr->lmr_ref_count);
tduffy> +
tduffy> +	rmr->param.mem_priv = DAT_MEM_PRIV_NONE_FLAG;
tduffy> +	rmr->param.lmr_triplet.lmr_context = 0;
tduffy> +	rmr->param.lmr_triplet.virtual_address = 0;
tduffy> +	rmr->param.lmr_triplet.segment_length = 0;
tduffy> +	rmr->ep = ep_ptr;
tduffy> +	rmr->lmr = NULL;
tduffy> +
tduffy> +bail1:
tduffy> +	return status;
tduffy> +}
tduffy> +
tduffy> +/*
tduffy> + * dapl_rmr_bind
tduffy> + *
tduffy> + * DAPL Requirements Version xxx, 6.6.4.4
tduffy> + *
tduffy> + * Bind the RMR to the specified memory region within the LMR and
tduffy> + * provide a new rmr_context value.
tduffy> + *
tduffy> + * Input:
tduffy> + * Output:
tduffy> + */
tduffy> +u32 dapl_rmr_bind(DAT_RMR_HANDLE rmr_handle,
tduffy> +		  const struct dat_lmr_triplet *lmr_triplet,
tduffy> +		  enum dat_mem_priv_flags mem_priv, DAT_EP_HANDLE ep_handle,
tduffy> +		  DAT_RMR_COOKIE user_cookie,
tduffy> +		  enum dat_completion_flags completion_flags,
tduffy> +		  DAT_RMR_CONTEXT *rmr_context)
tduffy> +{
tduffy> +	struct dapl_rmr *rmr;
tduffy> +	struct dapl_ep *ep_ptr;
tduffy> +
tduffy> +	if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR))
tduffy> +		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
tduffy> +
tduffy> +	if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP))
tduffy> +		return DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP);
tduffy> +
tduffy> +	rmr = (struct dapl_rmr *)rmr_handle;
tduffy> +	ep_ptr = (struct dapl_ep *)ep_handle;
tduffy> +
tduffy> +	/* if the rmr should be bound */
tduffy> +	if (0 != lmr_triplet->segment_length)
tduffy> +		return dapl_rmr_bind_fuse(rmr, lmr_triplet, mem_priv, ep_ptr,
tduffy> +					  user_cookie, completion_flags, 
tduffy> +                                          rmr_context);
tduffy> +	else /* the rmr should be unbound */
tduffy> +		return dapl_rmr_bind_unfuse(rmr, ep_ptr, user_cookie, 
tduffy> +                                            completion_flags);
tduffy> +}
tduffy> +
tduffy> +/*
tduffy> + * dapl_rmr_create
tduffy> + *
tduffy> + * Create a remote memory region for the specified protection zone
tduffy> + *
tduffy> + * Input:
tduffy> + * 	pz_handle
tduffy> + *
tduffy> + * Output:
tduffy> + * 	rmr_handle
tduffy> + *
tduffy> + * Returns:
tduffy> + * 	DAT_SUCCESS
tduffy> + * 	DAT_INSUFFICIENT_RESOURCES
tduffy> + * 	DAT_INVALID_PARAMETER
tduffy> + */
tduffy> +u32 dapl_rmr_create(DAT_PZ_HANDLE pz_handle, DAT_RMR_HANDLE *rmr_handle)
tduffy> +{
tduffy> +	struct dapl_pz *pz;
tduffy> +	struct dapl_rmr *rmr;
tduffy> +	u32 status = DAT_SUCCESS;
tduffy> +
tduffy> +	if (DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_PZ);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	pz = (struct dapl_pz *)pz_handle;
tduffy> +
tduffy> +	rmr = dapl_rmr_alloc(pz);
tduffy> +
tduffy> +	if (rmr == NULL) {
tduffy> +		status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
tduffy> +				   DAT_RESOURCE_MEMORY);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	status = dapl_ib_mw_alloc(rmr);
tduffy> +
tduffy> +	if (status != DAT_SUCCESS) {
tduffy> +		dapl_rmr_dealloc(rmr);
tduffy> +		status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
tduffy> +				   DAT_RESOURCE_MEMORY_REGION);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	atomic_inc(&pz->pz_ref_count);
tduffy> +
tduffy> +	*rmr_handle = rmr;
tduffy> +
tduffy> +bail:
tduffy> +	return status;
tduffy> +}
tduffy> +
tduffy> +/*
tduffy> + * dapl_rmr_free
tduffy> + *
tduffy> + * Destroy an instance of the Remote Memory Region
tduffy> + *
tduffy> + * Input:
tduffy> + * 	rmr_handle
tduffy> + *
tduffy> + * Output:
tduffy> + * 	none
tduffy> + *
tduffy> + * Returns:
tduffy> + * 	DAT_SUCCESS
tduffy> + * 	DAT_INVALID_PARAMETER
tduffy> + */
tduffy> +u32 dapl_rmr_free(DAT_RMR_HANDLE rmr_handle)
tduffy> +{
tduffy> +	struct dapl_rmr *rmr;
tduffy> +	u32 status = DAT_SUCCESS;
tduffy> +
tduffy> +	if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	rmr = (struct dapl_rmr *)rmr_handle;
tduffy> +
tduffy> +	/*
tduffy> +	 * If the user did not perform an unbind op, release
tduffy> +	 * counts here.
tduffy> +	 */
tduffy> +	if (rmr->param.lmr_triplet.virtual_address != 0) {
tduffy> +		atomic_dec(&rmr->lmr->lmr_ref_count);
tduffy> +		rmr->param.lmr_triplet.virtual_address = 0;
tduffy> +	}
tduffy> +
tduffy> +	status = dapl_ib_mw_free(rmr);
tduffy> +
tduffy> +	if (status != DAT_SUCCESS)
tduffy> +		goto bail;
tduffy> +
tduffy> +	atomic_dec(&rmr->pz->pz_ref_count);
tduffy> +
tduffy> +	dapl_rmr_dealloc(rmr);
tduffy> +
tduffy> +bail:
tduffy> +	return status;
tduffy> +}
tduffy> +
tduffy> +u32 dapl_rmr_query(DAT_RMR_HANDLE rmr_handle, struct dat_rmr_param *rmr_param)
tduffy> +{
tduffy> +	struct dapl_rmr *rmr;
tduffy> +	u32 status = DAT_SUCCESS;
tduffy> +
tduffy> +	if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +	if (NULL == rmr_param) {
tduffy> +		status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
tduffy> +		goto bail;
tduffy> +	}
tduffy> +
tduffy> +	rmr = (struct dapl_rmr *)rmr_handle;
tduffy> +
tduffy> +	memcpy(rmr_param, &rmr->param, sizeof *rmr_param);
tduffy> +
tduffy> +bail:
tduffy> +	return status;
tduffy> +}
tduffy> Index: linux-kernel-rmr/dat-provider/dapl_rmr_util.h
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/dat-provider/dapl_rmr_util.h	(revision 2483)
tduffy> +++ linux-kernel-rmr/dat-provider/dapl_rmr_util.h	(working copy)
tduffy> @@ -1,52 +0,0 @@
tduffy> -/*
tduffy> - * Copyright (c) 2002-2005, Network Appliance, Inc. All rights reserved.
tduffy> - *
tduffy> - * This Software is licensed under one of the following licenses:
tduffy> - *
tduffy> - * 1) under the terms of the "Common Public License 1.0" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/cpl.php.
tduffy> - *
tduffy> - * 2) under the terms of the "The BSD License" a copy of which is
tduffy> - *    available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/bsd-license.php.
tduffy> - *
tduffy> - * 3) under the terms of the "GNU General Public License (GPL) Version 2" a
tduffy> - *    copy of which is available from the Open Source Initiative, see
tduffy> - *    http://www.opensource.org/licenses/gpl-license.php.
tduffy> - *
tduffy> - * Licensee has the right to choose one of the above licenses.
tduffy> - *
tduffy> - * Redistributions of source code must retain the above copyright
tduffy> - * notice and one of the license notices.
tduffy> - *
tduffy> - * Redistributions in binary form must reproduce both the above copyright
tduffy> - * notice, one of the license notices in the documentation
tduffy> - * and/or other materials provided with the distribution.
tduffy> - */
tduffy> -
tduffy> -/*
tduffy> - * $Id$
tduffy> - */
tduffy> -
tduffy> -#ifndef DAPL_RMR_UTIL_H
tduffy> -#define DAPL_RMR_UTIL_H
tduffy> -
tduffy> -#include "dapl_mr_util.h"
tduffy> -
tduffy> -extern struct dapl_rmr *dapl_rmr_alloc(struct dapl_pz *pz);
tduffy> -
tduffy> -extern void dapl_rmr_dealloc(struct dapl_rmr *rmr);
tduffy> -
tduffy> -static inline boolean_t
tduffy> -dapl_rmr_validate_completion_flag(enum dat_completion_flags mask,
tduffy> -				  enum dat_completion_flags allow,
tduffy> -				  enum dat_completion_flags request)
tduffy> -{
tduffy> -	if ((mask & request) && !(mask & allow))
tduffy> -		return FALSE;
tduffy> -	else
tduffy> -		return TRUE;
tduffy> -}
tduffy> -
tduffy> -#endif				/* DAPL_RMR_UTIL_H */
tduffy> Index: linux-kernel-rmr/patches/alt_dat_provider_makefile
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/patches/alt_dat_provider_makefile	(revision 2483)
tduffy> +++ linux-kernel-rmr/patches/alt_dat_provider_makefile	(working copy)
tduffy> @@ -16,7 +16,6 @@ PROVIDER_MODULES := \
tduffy>          dapl_evd_kquery               	\
tduffy>          dapl_evd_kcreate              	\
tduffy>          dapl_evd_modify_upcall        	\
tduffy> -        dapl_lmr_kcreate		\
tduffy>  	dapl_cookie   		      	\
tduffy>  	dapl_cno_util			\
tduffy>          dapl_cr_accept                	\
tduffy> @@ -61,11 +60,7 @@ PROVIDER_MODULES := \
tduffy>          dapl_ia_query                 	\
tduffy>          dapl_ia_util                  	\
tduffy>          dapl_llist                    	\
tduffy> -        dapl_lmr_free                 	\
tduffy> -        dapl_lmr_query                	\
tduffy> -        dapl_lmr_sync_rdma_read       	\
tduffy> -        dapl_lmr_sync_rdma_write      	\
tduffy> -        dapl_lmr_util                 	\
tduffy> +        dapl_lmr                 	\
tduffy>          dapl_mr_util                  	\
tduffy>          dapl_provider                 	\
tduffy>          dapl_sp_util                  	\
tduffy> @@ -73,16 +68,9 @@ PROVIDER_MODULES := \
tduffy>          dapl_psp_create_any           	\
tduffy>          dapl_psp_free                 	\
tduffy>          dapl_psp_query                	\
tduffy> -        dapl_pz_create                	\
tduffy> -        dapl_pz_free                  	\
tduffy> -        dapl_pz_query                 	\
tduffy> -        dapl_pz_util                  	\
tduffy> +        dapl_pz                  	\
tduffy>          dapl_ring_buffer_util         	\
tduffy> -        dapl_rmr_bind                 	\
tduffy> -        dapl_rmr_create               	\
tduffy> -        dapl_rmr_free                 	\
tduffy> -        dapl_rmr_query                	\
tduffy> -        dapl_rmr_util                 	\
tduffy> +        dapl_rmr                 	\
tduffy>          dapl_rsp_create               	\
tduffy>          dapl_rsp_free                 	\
tduffy>          dapl_rsp_query                	\
tduffy> @@ -103,7 +91,7 @@ PROVIDER_OBJS := $(foreach s, $(PROVIDER
tduffy>  KDAPL_DEBUG = 1
tduffy>  ifeq (1,$(KDAPL_DEBUG))
tduffy>    EXTRA_CFLAGS += -O0 -g
tduffy> -  EXTRA_CFLAGS += -DDAPL_DBG # -DDAPL_DBG_IO_TRC
tduffy> +  EXTRA_CFLAGS += -DDAPL_DBG
tduffy>  endif
tduffy>  
tduffy>  EXTRA_CFLAGS += -DDAPL_ATS -Idrivers/infiniband/include -I$(obj)/../dat -I$(obj)/../patches/
tduffy> @@ -121,4 +109,4 @@ default:
tduffy>  endif
tduffy>  
tduffy>  clean:
tduffy> -	rm -f *.o *.ko
tduffy> +	rm -f *.o *.ko .*.d .*.o.tmp *.mod.* .tmp_versions .*.cmd
tduffy> Index: linux-kernel-rmr/patches/Makefile
tduffy> ===================================================================
tduffy> --- linux-kernel-rmr/patches/Makefile	(revision 2483)
tduffy> +++ linux-kernel-rmr/patches/Makefile	(working copy)
tduffy> @@ -20,4 +20,4 @@ default:
tduffy>  endif
tduffy>  
tduffy>  clean:
tduffy> -	rm -f *.o *.ko
tduffy> +	rm -rf *.o *.ko .*.d .*.o.tmp *.mod.* .tmp_versions .*.cmd
tduffy> 



More information about the general mailing list