9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * The contents of this file are subject to the terms of the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Common Development and Distribution License (the "License").
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You may not use this file except in compliance with the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * or http://www.opensolaris.org/os/licensing.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * When distributing Covered Code, include this CDDL HEADER in each
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * If applicable, add the following below this CDDL HEADER, with the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * MODULE: dapl_rmr_bind.c
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Memory management
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Description: Interfaces in this file are completely described in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the DAPL 1.1 API, Chapter 6, section 6
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * $Id: dapl_rmr_bind.c,v 1.14 2003/07/11 18:23:31 jlentini Exp $
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_rmr_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_ep_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_cookie.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor#include "dapl_adapter_util.h"
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Function Prototypes
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_rmr_bind_fuse(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_RMR *rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_LMR_TRIPLET *lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_MEM_PRIV_FLAGS mem_priv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_EP *ep,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_RMR_COOKIE user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_COMPLETION_FLAGS completion_flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAT_RMR_CONTEXT *rmr_context);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_rmr_bind_unfuse(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_RMR *rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_LMR_TRIPLET *lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_EP *ep,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_RMR_COOKIE user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_COMPLETION_FLAGS completion_flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Function Definitions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_rmr_bind_fuse(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_RMR *rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_LMR_TRIPLET* lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_MEM_PRIV_FLAGS mem_priv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_EP *ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_RMR_COOKIE user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_COMPLETION_FLAGS completion_flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAT_RMR_CONTEXT *rmr_context)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_LMR *lmr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_COOKIE *cookie;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_hash_search(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->header.owner_ia->hca_ptr->lmr_hash_table,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet->lmr_context,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (DAPL_HASH_DATA *) &lmr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * if the ep in unconnected return an error. IB requires that the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * QP be connected to change a memory window binding since:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - memory window bind operations are WQEs placed on a QP's
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * send queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - QP's only process WQEs on the send queue when the QP is in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the RTS state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_STATE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ep_state_subtype(ep_ptr));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_FALSE == dapl_mr_bounds_check(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_mr_get_address(lmr->param.region_desc, lmr->param.mem_type),
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr->param.length,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet->virtual_address,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet->segment_length)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* If the LMR, RMR, and EP are not in the same PZ, there is an error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((ep_ptr->param.pz_handle != lmr->param.pz_handle) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (ep_ptr->param.pz_handle != rmr->param.pz_handle)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !dapl_rmr_validate_completion_flag(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_COMPLETION_BARRIER_FENCE_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_rmr_cookie_alloc(&ep_ptr->req_buffer,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr, user_cookie, &cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_mw_bind(rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet->lmr_context,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet->virtual_address,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet->segment_length,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mem_priv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor completion_flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_atomic_inc(&lmr->lmr_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if the RMR was previously bound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != rmr->lmr) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->param.mem_priv = mem_priv;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->param.lmr_triplet = *lmr_triplet;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->ep = ep_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->lmr = lmr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&ep_ptr->req_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != rmr_context) { *rmr_context = rmr->param.rmr_context; }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorstatic DAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapli_rmr_bind_unfuse(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_RMR *rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_LMR_TRIPLET *lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAPL_EP *ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_RMR_COOKIE user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_COMPLETION_FLAGS completion_flags)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_COOKIE *cookie;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_RETURN dat_status;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_SUCCESS;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * if the ep in unconnected return an error. IB requires that the
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * QP be connected to change a memory window binding since:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - memory window bind operations are WQEs placed on a QP's
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * send queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * - QP's only process WQEs on the send queue when the QP is in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the RTS state
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_EP_STATE_CONNECTED != ep_ptr->param.ep_state) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_STATE,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_ep_state_subtype(ep_ptr));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* If the RMR and EP are not in the same PZ, there is an error */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (ep_ptr->param.pz_handle != rmr->param.pz_handle) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (!dapl_rmr_validate_completion_flag(DAT_COMPLETION_SUPPRESS_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !dapl_rmr_validate_completion_flag(DAT_COMPLETION_UNSIGNALLED_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags) ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor !dapl_rmr_validate_completion_flag(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAT_COMPLETION_BARRIER_FENCE_FLAG,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr->param.ep_attr.request_completion_flags, completion_flags)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_rmr_cookie_alloc(&ep_ptr->req_buffer, rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor user_cookie, &cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_mw_unbind(rmr, lmr_triplet->lmr_context,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr, cookie, completion_flags);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAT_SUCCESS != dat_status) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cookie_dealloc(&ep_ptr->req_buffer, cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor goto bail1;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if the RMR was previously bound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (NULL != rmr->lmr) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_atomic_dec(&rmr->lmr->lmr_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->param.mem_priv = DAT_MEM_PRIV_NONE_FLAG;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->param.lmr_triplet.lmr_context = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->param.lmr_triplet.virtual_address = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->param.lmr_triplet.segment_length = 0;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->ep = ep_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr->lmr = NULL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&ep_ptr->req_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylorbail1:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/*
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_rmr_bind
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAPL Requirements Version xxx, 6.6.4.4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Bind the RMR to the specified memory region within the LMR and
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * provide a new rmr_context value.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor *
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Input:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Output:
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor */
9e39c5ba00a55fa05777cc94b148296af305e135Bill TaylorDAT_RETURN
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylordapl_rmr_bind(
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_RMR_HANDLE rmr_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN const DAT_LMR_TRIPLET *lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_MEM_PRIV_FLAGS mem_priv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_EP_HANDLE ep_handle,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_RMR_COOKIE user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor IN DAT_COMPLETION_FLAGS completion_flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor OUT DAT_RMR_CONTEXT *rmr_context)
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor{
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_RMR *rmr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor DAPL_EP *ep_ptr;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(rmr_handle, DAPL_MAGIC_RMR)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_RMR));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(ep_handle, DAPL_MAGIC_EP)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_INVALID_HANDLE_EP));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr = (DAPL_RMR *) rmr_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr = (DAPL_EP *) ep_handle;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* if the rmr should be bound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (0 != lmr_triplet->segment_length) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dapli_rmr_bind_fuse(rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor mem_priv,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor completion_flags,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor rmr_context));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor } else { /* the rmr should be unbound */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (dapli_rmr_bind_unfuse(rmr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor lmr_triplet,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor ep_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor user_cookie,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor completion_flags));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor }
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor}