[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