19e39c5baSBill Taylor /*
29e39c5baSBill Taylor  * CDDL HEADER START
39e39c5baSBill Taylor  *
49e39c5baSBill Taylor  * The contents of this file are subject to the terms of the
59e39c5baSBill Taylor  * Common Development and Distribution License (the "License").
69e39c5baSBill Taylor  * You may not use this file except in compliance with the License.
79e39c5baSBill Taylor  *
89e39c5baSBill Taylor  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
99e39c5baSBill Taylor  * or http://www.opensolaris.org/os/licensing.
109e39c5baSBill Taylor  * See the License for the specific language governing permissions
119e39c5baSBill Taylor  * and limitations under the License.
129e39c5baSBill Taylor  *
139e39c5baSBill Taylor  * When distributing Covered Code, include this CDDL HEADER in each
149e39c5baSBill Taylor  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
159e39c5baSBill Taylor  * If applicable, add the following below this CDDL HEADER, with the
169e39c5baSBill Taylor  * fields enclosed by brackets "[]" replaced with your own identifying
179e39c5baSBill Taylor  * information: Portions Copyright [yyyy] [name of copyright owner]
189e39c5baSBill Taylor  *
199e39c5baSBill Taylor  * CDDL HEADER END
209e39c5baSBill Taylor  */
219e39c5baSBill Taylor 
229e39c5baSBill Taylor /*
239e39c5baSBill Taylor  * Copyright (c) 2002-2003, Network Appliance, Inc. All rights reserved.
249e39c5baSBill Taylor  */
259e39c5baSBill Taylor 
269e39c5baSBill Taylor /*
279e39c5baSBill Taylor  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
289e39c5baSBill Taylor  * Use is subject to license terms.
299e39c5baSBill Taylor  */
309e39c5baSBill Taylor 
319e39c5baSBill Taylor /*
329e39c5baSBill Taylor  *
339e39c5baSBill Taylor  * MODULE: dapl_lmr_free.c
349e39c5baSBill Taylor  *
359e39c5baSBill Taylor  * PURPOSE: Memory management
369e39c5baSBill Taylor  * Description: Interfaces in this file are completely described in
379e39c5baSBill Taylor  *		the DAPL 1.1 API, Chapter 6, section 6
389e39c5baSBill Taylor  *
399e39c5baSBill Taylor  */
409e39c5baSBill Taylor 
419e39c5baSBill Taylor #include "dapl_lmr_util.h"
429e39c5baSBill Taylor #include "dapl_adapter_util.h"
439e39c5baSBill Taylor #include "dapl_ia_util.h"
449e39c5baSBill Taylor 
459e39c5baSBill Taylor /*
469e39c5baSBill Taylor  * dapl_lmr_free
479e39c5baSBill Taylor  *
489e39c5baSBill Taylor  * DAPL Requirements Version xxx, 6.6.3.2
499e39c5baSBill Taylor  *
509e39c5baSBill Taylor  * Destroy an instance of the Local Memory Region
519e39c5baSBill Taylor  *
529e39c5baSBill Taylor  * Input:
539e39c5baSBill Taylor  * 	lmr_handle
549e39c5baSBill Taylor  *
559e39c5baSBill Taylor  * Output:
569e39c5baSBill Taylor  *
579e39c5baSBill Taylor  * Returns:
589e39c5baSBill Taylor  * 	DAT_SUCCESS
599e39c5baSBill Taylor  *      DAT_INVALID_HANDLE
609e39c5baSBill Taylor  * 	DAT_INVALID_PARAMETER
619e39c5baSBill Taylor  * 	DAT_INVALID_STATE
629e39c5baSBill Taylor  */
639e39c5baSBill Taylor 
649e39c5baSBill Taylor DAT_RETURN
dapl_lmr_free(IN DAT_LMR_HANDLE lmr_handle)659e39c5baSBill Taylor dapl_lmr_free(IN DAT_LMR_HANDLE lmr_handle)
669e39c5baSBill Taylor {
679e39c5baSBill Taylor 	DAPL_LMR *lmr;
689e39c5baSBill Taylor 	DAT_RETURN dat_status;
699e39c5baSBill Taylor 
709e39c5baSBill Taylor 	dapl_dbg_log(DAPL_DBG_TYPE_API, "dapl_lmr_free (%p)\n", lmr_handle);
719e39c5baSBill Taylor 
729e39c5baSBill Taylor 	if (DAPL_BAD_HANDLE(lmr_handle, DAPL_MAGIC_LMR)) {
739e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
749e39c5baSBill Taylor 		    DAT_INVALID_HANDLE_LMR);
759e39c5baSBill Taylor 		goto bail;
769e39c5baSBill Taylor 	}
779e39c5baSBill Taylor 
789e39c5baSBill Taylor 	lmr = (DAPL_LMR *)lmr_handle;
799e39c5baSBill Taylor 
809e39c5baSBill Taylor 	switch (lmr->param.mem_type) {
819e39c5baSBill Taylor 	case DAT_MEM_TYPE_VIRTUAL:
829e39c5baSBill Taylor 	/* fall through */
839e39c5baSBill Taylor 	case DAT_MEM_TYPE_LMR: {
849e39c5baSBill Taylor 		DAPL_PZ *pz;
859e39c5baSBill Taylor 
869e39c5baSBill Taylor 		if (0 != lmr->lmr_ref_count) {
879e39c5baSBill Taylor 			return (DAT_INVALID_STATE);
889e39c5baSBill Taylor 		}
899e39c5baSBill Taylor 
909e39c5baSBill Taylor 		dat_status = dapls_hash_remove(
919e39c5baSBill Taylor 		    lmr->header.owner_ia->hca_ptr->lmr_hash_table,
929e39c5baSBill Taylor 		    lmr->param.lmr_context, NULL);
939e39c5baSBill Taylor 		if (dat_status != DAT_SUCCESS) {
949e39c5baSBill Taylor 			goto bail;
959e39c5baSBill Taylor 		}
969e39c5baSBill Taylor 
979e39c5baSBill Taylor 		dat_status = dapls_ib_mr_deregister(lmr);
989e39c5baSBill Taylor 
999e39c5baSBill Taylor 		if (dat_status == DAT_SUCCESS) {
1009e39c5baSBill Taylor 			pz = (DAPL_PZ *) lmr->param.pz_handle;
101*fb4cdc19SToomas Soome 			dapl_os_atomic_dec(&pz->pz_ref_count);
1029e39c5baSBill Taylor 
1039e39c5baSBill Taylor 			dapl_lmr_dealloc(lmr);
1049e39c5baSBill Taylor 		} else {
1059e39c5baSBill Taylor 		/*
1069e39c5baSBill Taylor 		 * Deregister failed; put it back in the
1079e39c5baSBill Taylor 		 * hash table.
1089e39c5baSBill Taylor 		 */
1099e39c5baSBill Taylor 		(void) dapls_hash_insert(lmr->header.owner_ia->
1109e39c5baSBill Taylor 		    hca_ptr->lmr_hash_table,
1119e39c5baSBill Taylor 		    lmr->param.lmr_context, lmr);
1129e39c5baSBill Taylor 		}
1139e39c5baSBill Taylor 		break;
1149e39c5baSBill Taylor 	}
1159e39c5baSBill Taylor 	case DAT_MEM_TYPE_SHARED_VIRTUAL: {
1169e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_NOT_IMPLEMENTED, 0);
1179e39c5baSBill Taylor 		break;
1189e39c5baSBill Taylor 	}
1199e39c5baSBill Taylor 	default:
1209e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
1219e39c5baSBill Taylor 		    DAT_INVALID_ARG1);
1229e39c5baSBill Taylor 		break;
1239e39c5baSBill Taylor 	}
1249e39c5baSBill Taylor bail:
1259e39c5baSBill Taylor 	return (dat_status);
1269e39c5baSBill Taylor }
127