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 2009 Sun Microsystems, Inc.  All rights reserved.
289e39c5baSBill Taylor  * Use is subject to license terms.
299e39c5baSBill Taylor  */
309e39c5baSBill Taylor 
319e39c5baSBill Taylor 
329e39c5baSBill Taylor /*
339e39c5baSBill Taylor  *
349e39c5baSBill Taylor  * MODULE: dapl_lmr_create.c
359e39c5baSBill Taylor  *
369e39c5baSBill Taylor  * PURPOSE: Memory management
379e39c5baSBill Taylor  * Description: Interfaces in this file are completely described in
389e39c5baSBill Taylor  *		the DAPL 1.1 API, Chapter 6, section 6
399e39c5baSBill Taylor  *
409e39c5baSBill Taylor  */
419e39c5baSBill Taylor 
429e39c5baSBill Taylor #include <dat/udat.h>
439e39c5baSBill Taylor #include <dapl_lmr_util.h>
449e39c5baSBill Taylor #include <dapl_adapter_util.h>
459e39c5baSBill Taylor #include <libdevinfo.h>
469e39c5baSBill Taylor 
479e39c5baSBill Taylor /*
489e39c5baSBill Taylor  * Function Prototypes
499e39c5baSBill Taylor  */
509e39c5baSBill Taylor 
519e39c5baSBill Taylor static DAT_RETURN
529e39c5baSBill Taylor dapl_lmr_create_virtual(IN DAPL_IA *ia,
53*fb4cdc19SToomas Soome     IN DAT_PVOID virt_addr,
54*fb4cdc19SToomas Soome     IN DAT_VLEN length,
55*fb4cdc19SToomas Soome     IN DAT_LMR_COOKIE shm_cookie,
56*fb4cdc19SToomas Soome     IN DAPL_PZ *pz,
57*fb4cdc19SToomas Soome     IN DAT_MEM_PRIV_FLAGS privileges,
58*fb4cdc19SToomas Soome     OUT DAT_LMR_HANDLE *lmr_handle,
59*fb4cdc19SToomas Soome     OUT DAT_LMR_CONTEXT *lmr_context,
60*fb4cdc19SToomas Soome     OUT DAT_RMR_CONTEXT *rmr_context,
61*fb4cdc19SToomas Soome     OUT DAT_VLEN *registered_length,
62*fb4cdc19SToomas Soome     OUT DAT_VADDR *registered_address);
639e39c5baSBill Taylor 
649e39c5baSBill Taylor static DAT_RETURN
659e39c5baSBill Taylor dapl_lmr_create_lmr(IN DAPL_IA *ia,
66*fb4cdc19SToomas Soome     IN DAPL_LMR *original_lmr,
67*fb4cdc19SToomas Soome     IN DAPL_PZ *pz,
68*fb4cdc19SToomas Soome     IN DAT_MEM_PRIV_FLAGS privileges,
69*fb4cdc19SToomas Soome     OUT DAT_LMR_HANDLE *lmr_handle,
70*fb4cdc19SToomas Soome     OUT DAT_LMR_CONTEXT *lmr_context,
71*fb4cdc19SToomas Soome     OUT DAT_RMR_CONTEXT *rmr_context,
72*fb4cdc19SToomas Soome     OUT DAT_VLEN *registered_length,
73*fb4cdc19SToomas Soome     OUT DAT_VADDR *registered_address);
749e39c5baSBill Taylor 
759e39c5baSBill Taylor /*
769e39c5baSBill Taylor  * Function Definitions
779e39c5baSBill Taylor  */
789e39c5baSBill Taylor 
799e39c5baSBill Taylor static DAT_RETURN
dapl_lmr_create_virtual(IN DAPL_IA * ia,IN DAT_PVOID virt_addr,IN DAT_VLEN length,IN DAT_LMR_COOKIE shm_cookie,IN DAPL_PZ * pz,IN DAT_MEM_PRIV_FLAGS privileges,OUT DAT_LMR_HANDLE * lmr_handle,OUT DAT_LMR_CONTEXT * lmr_context,OUT DAT_RMR_CONTEXT * rmr_context,OUT DAT_VLEN * registered_length,OUT DAT_VADDR * registered_address)809e39c5baSBill Taylor dapl_lmr_create_virtual(IN DAPL_IA *ia,
81*fb4cdc19SToomas Soome     IN DAT_PVOID virt_addr,
82*fb4cdc19SToomas Soome     IN DAT_VLEN length,
83*fb4cdc19SToomas Soome     IN DAT_LMR_COOKIE shm_cookie,
84*fb4cdc19SToomas Soome     IN DAPL_PZ *pz,
85*fb4cdc19SToomas Soome     IN DAT_MEM_PRIV_FLAGS privileges,
86*fb4cdc19SToomas Soome     OUT DAT_LMR_HANDLE *lmr_handle,
87*fb4cdc19SToomas Soome     OUT DAT_LMR_CONTEXT *lmr_context,
88*fb4cdc19SToomas Soome     OUT DAT_RMR_CONTEXT *rmr_context,
89*fb4cdc19SToomas Soome     OUT DAT_VLEN *registered_length,
90*fb4cdc19SToomas Soome     OUT DAT_VADDR *registered_address)
919e39c5baSBill Taylor {
929e39c5baSBill Taylor 	DAPL_LMR *lmr;
939e39c5baSBill Taylor 	DAT_REGION_DESCRIPTION reg_desc;
949e39c5baSBill Taylor 	DAT_RETURN dat_status;
959e39c5baSBill Taylor 
969e39c5baSBill Taylor 	reg_desc.for_va = virt_addr;
979e39c5baSBill Taylor 	dat_status = DAT_SUCCESS;
989e39c5baSBill Taylor 
999e39c5baSBill Taylor 	lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_VIRTUAL,
1009e39c5baSBill Taylor 	    reg_desc, length, (DAT_PZ_HANDLE) pz, privileges);
1019e39c5baSBill Taylor 
1029e39c5baSBill Taylor 	if (NULL == lmr) {
1039e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
1049e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
1059e39c5baSBill Taylor 		goto bail;
1069e39c5baSBill Taylor 	}
1079e39c5baSBill Taylor 
1089e39c5baSBill Taylor 	if (shm_cookie == NULL) {
1099e39c5baSBill Taylor 		dat_status = dapls_ib_mr_register(ia, lmr, virt_addr,
1109e39c5baSBill Taylor 		    length, privileges);
1119e39c5baSBill Taylor 	} else {
1129e39c5baSBill Taylor 		dat_status = dapls_ib_mr_register_shared(ia, lmr, virt_addr,
1139e39c5baSBill Taylor 		    length, shm_cookie, privileges);
1149e39c5baSBill Taylor 	}
1159e39c5baSBill Taylor 
1169e39c5baSBill Taylor 	if (DAT_SUCCESS != dat_status) {
1179e39c5baSBill Taylor 		dapl_lmr_dealloc(lmr);
1189e39c5baSBill Taylor 		goto bail;
1199e39c5baSBill Taylor 	}
1209e39c5baSBill Taylor 
1219e39c5baSBill Taylor 	/* if the LMR context is already in the hash table */
1229e39c5baSBill Taylor 	dat_status = dapls_hash_search(ia->hca_ptr->lmr_hash_table,
1239e39c5baSBill Taylor 	    lmr->param.lmr_context, NULL);
1249e39c5baSBill Taylor 	if (dat_status == DAT_SUCCESS) {
1259e39c5baSBill Taylor 		(void) dapls_ib_mr_deregister(lmr);
1269e39c5baSBill Taylor 		dapl_lmr_dealloc(lmr);
1279e39c5baSBill Taylor 
1289e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INVALID_STATE,
1299e39c5baSBill Taylor 		    DAT_INVALID_STATE_LMR_IN_USE);
1309e39c5baSBill Taylor 		goto bail;
1319e39c5baSBill Taylor 	}
1329e39c5baSBill Taylor 
1339e39c5baSBill Taylor 	dat_status = dapls_hash_insert(ia->hca_ptr->lmr_hash_table,
1349e39c5baSBill Taylor 	    lmr->param.lmr_context, lmr);
1359e39c5baSBill Taylor 	if (dat_status != DAT_SUCCESS) {
1369e39c5baSBill Taylor 		(void) dapls_ib_mr_deregister(lmr);
1379e39c5baSBill Taylor 		dapl_lmr_dealloc(lmr);
1389e39c5baSBill Taylor 		/*
1399e39c5baSBill Taylor 		 * The value returned by dapls_hash_insert(.) is not
1409e39c5baSBill Taylor 		 * returned to the consumer because the spec. requires
1419e39c5baSBill Taylor 		 * that dat_lmr_create(.) return only certain values.
1429e39c5baSBill Taylor 		 */
1439e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
1449e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
1459e39c5baSBill Taylor 		goto bail;
1469e39c5baSBill Taylor 	}
1479e39c5baSBill Taylor 
148*fb4cdc19SToomas Soome 	dapl_os_atomic_inc(&pz->pz_ref_count);
1499e39c5baSBill Taylor 
1509e39c5baSBill Taylor 	if (NULL != lmr_handle) {
1519e39c5baSBill Taylor 		*lmr_handle = (DAT_LMR_HANDLE) lmr;
1529e39c5baSBill Taylor 	}
1539e39c5baSBill Taylor 	if (NULL != lmr_context) {
1549e39c5baSBill Taylor 		*lmr_context = lmr->param.lmr_context;
1559e39c5baSBill Taylor 	}
1569e39c5baSBill Taylor 	if (NULL != rmr_context) {
1579e39c5baSBill Taylor 		*rmr_context = lmr->param.rmr_context;
1589e39c5baSBill Taylor 	}
1599e39c5baSBill Taylor 	if (NULL != registered_length) {
1609e39c5baSBill Taylor 		*registered_length = lmr->param.registered_size;
1619e39c5baSBill Taylor 	}
1629e39c5baSBill Taylor 	if (NULL != registered_address) {
1639e39c5baSBill Taylor 		*registered_address = lmr->param.registered_address;
1649e39c5baSBill Taylor 	}
1659e39c5baSBill Taylor 
1669e39c5baSBill Taylor bail:
1679e39c5baSBill Taylor 	return (dat_status);
1689e39c5baSBill Taylor }
1699e39c5baSBill Taylor 
1709e39c5baSBill Taylor 
1719e39c5baSBill Taylor static DAT_RETURN
dapl_lmr_create_lmr(IN DAPL_IA * ia,IN DAPL_LMR * original_lmr,IN DAPL_PZ * pz,IN DAT_MEM_PRIV_FLAGS privileges,OUT DAT_LMR_HANDLE * lmr_handle,OUT DAT_LMR_CONTEXT * lmr_context,OUT DAT_RMR_CONTEXT * rmr_context,OUT DAT_VLEN * registered_length,OUT DAT_VADDR * registered_address)1729e39c5baSBill Taylor dapl_lmr_create_lmr(IN DAPL_IA *ia,
173*fb4cdc19SToomas Soome     IN DAPL_LMR *original_lmr,
174*fb4cdc19SToomas Soome     IN DAPL_PZ *pz,
175*fb4cdc19SToomas Soome     IN DAT_MEM_PRIV_FLAGS privileges,
176*fb4cdc19SToomas Soome     OUT DAT_LMR_HANDLE *lmr_handle,
177*fb4cdc19SToomas Soome     OUT DAT_LMR_CONTEXT *lmr_context,
178*fb4cdc19SToomas Soome     OUT DAT_RMR_CONTEXT *rmr_context,
179*fb4cdc19SToomas Soome     OUT DAT_VLEN *registered_length,
180*fb4cdc19SToomas Soome     OUT DAT_VADDR *registered_address)
1819e39c5baSBill Taylor {
1829e39c5baSBill Taylor 	DAPL_LMR *lmr;
1839e39c5baSBill Taylor 	DAT_REGION_DESCRIPTION reg_desc;
1849e39c5baSBill Taylor 	DAT_RETURN dat_status;
1859e39c5baSBill Taylor 
1869e39c5baSBill Taylor 	dapl_dbg_log(DAPL_DBG_TYPE_API,
1879e39c5baSBill Taylor 	    "dapl_lmr_create_lmr (%p, %p, %p, %x, %p, %p, %p, %p)\n",
1889e39c5baSBill Taylor 	    ia,
1899e39c5baSBill Taylor 	    original_lmr,
1909e39c5baSBill Taylor 	    pz, privileges,
1919e39c5baSBill Taylor 	    lmr_handle,
1929e39c5baSBill Taylor 	    lmr_context, registered_length, registered_address);
1939e39c5baSBill Taylor 
1949e39c5baSBill Taylor 	dat_status = dapls_hash_search(ia->hca_ptr->lmr_hash_table,
1959e39c5baSBill Taylor 	    original_lmr->param.lmr_context,
1969e39c5baSBill Taylor 	    (DAPL_HASH_DATA *) & lmr);
1979e39c5baSBill Taylor 	if (dat_status != DAT_SUCCESS) {
1989e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INVALID_PARAMETER,
1999e39c5baSBill Taylor 		    DAT_INVALID_ARG2);
2009e39c5baSBill Taylor 		goto bail;
2019e39c5baSBill Taylor 	}
2029e39c5baSBill Taylor 
2039e39c5baSBill Taylor 	reg_desc.for_lmr_handle = (DAT_LMR_HANDLE) original_lmr;
2049e39c5baSBill Taylor 
2059e39c5baSBill Taylor 	lmr = dapl_lmr_alloc(ia, DAT_MEM_TYPE_LMR, reg_desc, 0,
2069e39c5baSBill Taylor 	    (DAT_PZ_HANDLE) pz, privileges);
2079e39c5baSBill Taylor 
2089e39c5baSBill Taylor 	if (NULL == lmr) {
2099e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
2109e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
2119e39c5baSBill Taylor 		goto bail;
2129e39c5baSBill Taylor 	}
2139e39c5baSBill Taylor 
2149e39c5baSBill Taylor 	dat_status = dapls_ib_mr_register_lmr(ia, lmr, privileges);
2159e39c5baSBill Taylor 
2169e39c5baSBill Taylor 	if (DAT_SUCCESS != dat_status) {
2179e39c5baSBill Taylor 		dapl_lmr_dealloc(lmr);
2189e39c5baSBill Taylor 		goto bail;
2199e39c5baSBill Taylor 	}
2209e39c5baSBill Taylor 
2219e39c5baSBill Taylor 	/* if the LMR context is already in the hash table */
2229e39c5baSBill Taylor 	dat_status = dapls_hash_search(ia->hca_ptr->lmr_hash_table,
2239e39c5baSBill Taylor 	    lmr->param.lmr_context, NULL);
2249e39c5baSBill Taylor 	if (dat_status == DAT_SUCCESS) {
2259e39c5baSBill Taylor 		(void) dapls_ib_mr_deregister(lmr);
2269e39c5baSBill Taylor 		dapl_lmr_dealloc(lmr);
2279e39c5baSBill Taylor 
2289e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INVALID_STATE,
2299e39c5baSBill Taylor 		    DAT_INVALID_STATE_LMR_IN_USE);
2309e39c5baSBill Taylor 		goto bail;
2319e39c5baSBill Taylor 	}
2329e39c5baSBill Taylor 
2339e39c5baSBill Taylor 	dat_status = dapls_hash_insert(ia->hca_ptr->lmr_hash_table,
2349e39c5baSBill Taylor 	    lmr->param.lmr_context, lmr);
2359e39c5baSBill Taylor 	if (dat_status != DAT_SUCCESS) {
2369e39c5baSBill Taylor 		(void) dapls_ib_mr_deregister(lmr);
2379e39c5baSBill Taylor 		dapl_lmr_dealloc(lmr);
2389e39c5baSBill Taylor 
2399e39c5baSBill Taylor 		/*
2409e39c5baSBill Taylor 		 * The value returned by dapls_hash_insert(.) is not
2419e39c5baSBill Taylor 		 * returned to the consumer because the spec. requires
2429e39c5baSBill Taylor 		 * that dat_lmr_create(.) return only certain values.
2439e39c5baSBill Taylor 		 */
2449e39c5baSBill Taylor 		dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
2459e39c5baSBill Taylor 		    DAT_RESOURCE_MEMORY);
2469e39c5baSBill Taylor 		goto bail;
2479e39c5baSBill Taylor 	}
2489e39c5baSBill Taylor 
249*fb4cdc19SToomas Soome 	dapl_os_atomic_inc(&pz->pz_ref_count);
2509e39c5baSBill Taylor 
2519e39c5baSBill Taylor 	if (NULL != lmr_handle) {
2529e39c5baSBill Taylor 		*lmr_handle = (DAT_LMR_HANDLE)lmr;
2539e39c5baSBill Taylor 	}
2549e39c5baSBill Taylor 	if (NULL != lmr_context) {
2559e39c5baSBill Taylor 		*lmr_context = lmr->param.lmr_context;
2569e39c5baSBill Taylor 	}
2579e39c5baSBill Taylor 	if (NULL != rmr_context) {
2589e39c5baSBill Taylor 		*rmr_context = lmr->param.rmr_context;
2599e39c5baSBill Taylor 	}
2609e39c5baSBill Taylor 	if (NULL != registered_length) {
2619e39c5baSBill Taylor 		*registered_length = original_lmr->param.registered_size;
2629e39c5baSBill Taylor 	}
2639e39c5baSBill Taylor 	if (NULL != registered_address) {
2649e39c5baSBill Taylor 		*registered_address = original_lmr->param.registered_address;
2659e39c5baSBill Taylor 	}
2669e39c5baSBill Taylor 
2679e39c5baSBill Taylor bail:
2689e39c5baSBill Taylor 	return (dat_status);
2699e39c5baSBill Taylor }
2709e39c5baSBill Taylor 
2719e39c5baSBill Taylor 
2729e39c5baSBill Taylor /*
2739e39c5baSBill Taylor  * dapl_lmr_create
2749e39c5baSBill Taylor  *
2759e39c5baSBill Taylor  * DAPL Requirements Version xxx, 6.6.3.1
2769e39c5baSBill Taylor  *
2779e39c5baSBill Taylor  * Register a memory region with an Interface Adaptor.
2789e39c5baSBill Taylor  *
2799e39c5baSBill Taylor  * Input:
2809e39c5baSBill Taylor  *	ia_handle
2819e39c5baSBill Taylor  *	mem_type
2829e39c5baSBill Taylor  *	region_description
2839e39c5baSBill Taylor  *	length
2849e39c5baSBill Taylor  *	pz_handle
2859e39c5baSBill Taylor  *	privileges
2869e39c5baSBill Taylor  *
2879e39c5baSBill Taylor  * Output:
2889e39c5baSBill Taylor  *	lmr_handle
2899e39c5baSBill Taylor  *	lmr_context
2909e39c5baSBill Taylor  *	registered_length
2919e39c5baSBill Taylor  *	registered_address
2929e39c5baSBill Taylor  *
2939e39c5baSBill Taylor  * Returns:
2949e39c5baSBill Taylor  * 	DAT_SUCCESS
2959e39c5baSBill Taylor  * 	DAT_INSUFFICIENT_RESOURCES
2969e39c5baSBill Taylor  * 	DAT_INVALID_PARAMETER
2979e39c5baSBill Taylor  * 	DAT_INVALID_STATE
2989e39c5baSBill Taylor  * 	DAT_MODEL_NOT_SUPPORTED
2999e39c5baSBill Taylor  *
3009e39c5baSBill Taylor  */
3019e39c5baSBill Taylor DAT_RETURN
dapl_lmr_create(IN DAT_IA_HANDLE ia_handle,IN DAT_MEM_TYPE mem_type,IN DAT_REGION_DESCRIPTION region_description,IN DAT_VLEN length,IN DAT_PZ_HANDLE pz_handle,IN DAT_MEM_PRIV_FLAGS privileges,OUT DAT_LMR_HANDLE * lmr_handle,OUT DAT_LMR_CONTEXT * lmr_context,OUT DAT_RMR_CONTEXT * rmr_context,OUT DAT_VLEN * registered_length,OUT DAT_VADDR * registered_address)3029e39c5baSBill Taylor dapl_lmr_create(IN DAT_IA_HANDLE ia_handle,
303*fb4cdc19SToomas Soome     IN DAT_MEM_TYPE mem_type,
304*fb4cdc19SToomas Soome     IN DAT_REGION_DESCRIPTION region_description,
305*fb4cdc19SToomas Soome     IN DAT_VLEN length,
306*fb4cdc19SToomas Soome     IN DAT_PZ_HANDLE pz_handle,
307*fb4cdc19SToomas Soome     IN DAT_MEM_PRIV_FLAGS privileges,
308*fb4cdc19SToomas Soome     OUT DAT_LMR_HANDLE *lmr_handle,
309*fb4cdc19SToomas Soome     OUT DAT_LMR_CONTEXT *lmr_context,
310*fb4cdc19SToomas Soome     OUT DAT_RMR_CONTEXT *rmr_context,
311*fb4cdc19SToomas Soome     OUT DAT_VLEN *registered_length,
312*fb4cdc19SToomas Soome     OUT DAT_VADDR *registered_address)
3139e39c5baSBill Taylor {
3149e39c5baSBill Taylor 	DAPL_IA *ia;
3159e39c5baSBill Taylor 	DAPL_PZ *pz;
3169e39c5baSBill Taylor 
3179e39c5baSBill Taylor 	if (DAPL_BAD_HANDLE(ia_handle, DAPL_MAGIC_IA) ||
3189e39c5baSBill Taylor 	    DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
3199e39c5baSBill Taylor 		return (DAT_INVALID_HANDLE);
3209e39c5baSBill Taylor 	}
3219e39c5baSBill Taylor 
3229e39c5baSBill Taylor 	if (length == 0) {
3239e39c5baSBill Taylor 		return (DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4));
3249e39c5baSBill Taylor 	}
3259e39c5baSBill Taylor 
3269e39c5baSBill Taylor 	ia = (DAPL_IA *) ia_handle;
3279e39c5baSBill Taylor 	pz = (DAPL_PZ *) pz_handle;
3289e39c5baSBill Taylor 
3299e39c5baSBill Taylor 	/* Always ignore this bit as it is passed in */
3309e39c5baSBill Taylor 	privileges &= ~DAT_MEM_PRIV_RO_DISABLE_FLAG;
3319e39c5baSBill Taylor 
3329e39c5baSBill Taylor 	/*
3339e39c5baSBill Taylor 	 * If at open time we determined that RO should not be used,
3349e39c5baSBill Taylor 	 * note it here.
3359e39c5baSBill Taylor 	 */
3369e39c5baSBill Taylor 	if (ia->dapl_flags & DAPL_DISABLE_RO)
3379e39c5baSBill Taylor 		privileges |= DAT_MEM_PRIV_RO_DISABLE_FLAG;
3389e39c5baSBill Taylor 
3399e39c5baSBill Taylor 	switch (mem_type) {
3409e39c5baSBill Taylor 	case DAT_MEM_TYPE_SO_VIRTUAL:
3419e39c5baSBill Taylor 		privileges |= DAT_MEM_PRIV_RO_DISABLE_FLAG;
3429e39c5baSBill Taylor 		/* FALLTHROUGH */
3439e39c5baSBill Taylor 	case DAT_MEM_TYPE_VIRTUAL:
3449e39c5baSBill Taylor 		return (dapl_lmr_create_virtual(ia, region_description.for_va,
3459e39c5baSBill Taylor 		    length, NULL, pz, privileges,
3469e39c5baSBill Taylor 		    lmr_handle, lmr_context,
3479e39c5baSBill Taylor 		    rmr_context, registered_length,
3489e39c5baSBill Taylor 		    registered_address));
3499e39c5baSBill Taylor 		/* NOTREACHED */
3509e39c5baSBill Taylor 	case DAT_MEM_TYPE_LMR: {
3519e39c5baSBill Taylor 		DAPL_LMR *lmr;
3529e39c5baSBill Taylor 
3539e39c5baSBill Taylor 		if (DAPL_BAD_HANDLE
3549e39c5baSBill Taylor 		    (region_description.for_lmr_handle, DAPL_MAGIC_LMR)) {
3559e39c5baSBill Taylor 			return (DAT_INVALID_HANDLE);
3569e39c5baSBill Taylor 		}
3579e39c5baSBill Taylor 
3589e39c5baSBill Taylor 		lmr = (DAPL_LMR *)region_description.for_lmr_handle;
3599e39c5baSBill Taylor 
3609e39c5baSBill Taylor 		return (dapl_lmr_create_lmr(ia, lmr, pz, privileges, lmr_handle,
3619e39c5baSBill Taylor 		    lmr_context, rmr_context,
3629e39c5baSBill Taylor 		    registered_length, registered_address));
3639e39c5baSBill Taylor 		/* NOTREACHED */
3649e39c5baSBill Taylor 	}
3659e39c5baSBill Taylor 	case DAT_MEM_TYPE_SHARED_VIRTUAL:
3669e39c5baSBill Taylor 		return (dapl_lmr_create_virtual(ia,
3679e39c5baSBill Taylor 		    region_description.
3689e39c5baSBill Taylor 		    for_shared_memory.virtual_address,
3699e39c5baSBill Taylor 		    length,
3709e39c5baSBill Taylor 		    region_description.
3719e39c5baSBill Taylor 		    for_shared_memory.shared_memory_id,
3729e39c5baSBill Taylor 		    pz, privileges, lmr_handle,
3739e39c5baSBill Taylor 		    lmr_context, rmr_context,
3749e39c5baSBill Taylor 		    registered_length,
3759e39c5baSBill Taylor 		    registered_address));
3769e39c5baSBill Taylor 		/* NOTREACHED */
3779e39c5baSBill Taylor 	default:
3789e39c5baSBill Taylor 		return (DAT_INVALID_PARAMETER);
3799e39c5baSBill Taylor 	}
3809e39c5baSBill Taylor }
381