1*9e39c5baSBill Taylor /*
2*9e39c5baSBill Taylor * CDDL HEADER START
3*9e39c5baSBill Taylor *
4*9e39c5baSBill Taylor * The contents of this file are subject to the terms of the
5*9e39c5baSBill Taylor * Common Development and Distribution License (the "License").
6*9e39c5baSBill Taylor * You may not use this file except in compliance with the License.
7*9e39c5baSBill Taylor *
8*9e39c5baSBill Taylor * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*9e39c5baSBill Taylor * or http://www.opensolaris.org/os/licensing.
10*9e39c5baSBill Taylor * See the License for the specific language governing permissions
11*9e39c5baSBill Taylor * and limitations under the License.
12*9e39c5baSBill Taylor *
13*9e39c5baSBill Taylor * When distributing Covered Code, include this CDDL HEADER in each
14*9e39c5baSBill Taylor * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*9e39c5baSBill Taylor * If applicable, add the following below this CDDL HEADER, with the
16*9e39c5baSBill Taylor * fields enclosed by brackets "[]" replaced with your own identifying
17*9e39c5baSBill Taylor * information: Portions Copyright [yyyy] [name of copyright owner]
18*9e39c5baSBill Taylor *
19*9e39c5baSBill Taylor * CDDL HEADER END
20*9e39c5baSBill Taylor */
21*9e39c5baSBill Taylor
22*9e39c5baSBill Taylor /*
23*9e39c5baSBill Taylor * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
24*9e39c5baSBill Taylor * Use is subject to license terms.
25*9e39c5baSBill Taylor */
26*9e39c5baSBill Taylor
27*9e39c5baSBill Taylor /*
28*9e39c5baSBill Taylor *
29*9e39c5baSBill Taylor * MODULE: dapl_srq.c
30*9e39c5baSBill Taylor *
31*9e39c5baSBill Taylor * PURPOSE: Shared Receive Queue
32*9e39c5baSBill Taylor * Description: Interfaces in this file are completely described in
33*9e39c5baSBill Taylor * the DAPL 1.2 API, Chapter 6, section 5
34*9e39c5baSBill Taylor *
35*9e39c5baSBill Taylor */
36*9e39c5baSBill Taylor
37*9e39c5baSBill Taylor #include "dapl.h"
38*9e39c5baSBill Taylor #include "dapl_adapter_util.h"
39*9e39c5baSBill Taylor #include "dapl_ia_util.h"
40*9e39c5baSBill Taylor #include "dapl_srq_util.h"
41*9e39c5baSBill Taylor #include "dapl_cookie.h"
42*9e39c5baSBill Taylor
43*9e39c5baSBill Taylor /*
44*9e39c5baSBill Taylor * dapl_srq_create
45*9e39c5baSBill Taylor *
46*9e39c5baSBill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.1
47*9e39c5baSBill Taylor *
48*9e39c5baSBill Taylor * creates an instance of a Shared Receive Queue (SRQ) that is provided
49*9e39c5baSBill Taylor * to the Consumer as srq_handle.
50*9e39c5baSBill Taylor *
51*9e39c5baSBill Taylor * Input:
52*9e39c5baSBill Taylor * ia_handle
53*9e39c5baSBill Taylor * pz_handle
54*9e39c5baSBill Taylor * srq_attr
55*9e39c5baSBill Taylor *
56*9e39c5baSBill Taylor * Output:
57*9e39c5baSBill Taylor * srq_handle
58*9e39c5baSBill Taylor *
59*9e39c5baSBill Taylor * Returns:
60*9e39c5baSBill Taylor * DAT_SUCCESS
61*9e39c5baSBill Taylor * DAT_INSUFFICIENT_RESOURCES
62*9e39c5baSBill Taylor * DAT_INVALID_HANDLE
63*9e39c5baSBill Taylor * DAT_INVALID_PARAMETER
64*9e39c5baSBill Taylor * DAT_MODEL_NOT_SUPPORTED
65*9e39c5baSBill Taylor */
66*9e39c5baSBill Taylor
67*9e39c5baSBill Taylor DAT_RETURN
dapl_srq_create(IN DAT_IA_HANDLE ia_handle,IN DAT_PZ_HANDLE pz_handle,IN DAT_SRQ_ATTR * srq_attr,OUT DAT_SRQ_HANDLE * srq_handle)68*9e39c5baSBill Taylor dapl_srq_create(
69*9e39c5baSBill Taylor IN DAT_IA_HANDLE ia_handle,
70*9e39c5baSBill Taylor IN DAT_PZ_HANDLE pz_handle,
71*9e39c5baSBill Taylor IN DAT_SRQ_ATTR *srq_attr,
72*9e39c5baSBill Taylor OUT DAT_SRQ_HANDLE *srq_handle)
73*9e39c5baSBill Taylor {
74*9e39c5baSBill Taylor DAPL_IA *ia_ptr;
75*9e39c5baSBill Taylor DAPL_SRQ *srq_ptr;
76*9e39c5baSBill Taylor DAT_SRQ_ATTR srq_attr_limit;
77*9e39c5baSBill Taylor DAT_RETURN dat_status;
78*9e39c5baSBill Taylor
79*9e39c5baSBill Taylor ia_ptr = (DAPL_IA *)ia_handle;
80*9e39c5baSBill Taylor dat_status = DAT_SUCCESS;
81*9e39c5baSBill Taylor /*
82*9e39c5baSBill Taylor * Verify parameters
83*9e39c5baSBill Taylor */
84*9e39c5baSBill Taylor if (DAPL_BAD_HANDLE(ia_ptr, DAPL_MAGIC_IA)) {
85*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
86*9e39c5baSBill Taylor DAT_INVALID_HANDLE_IA);
87*9e39c5baSBill Taylor goto bail;
88*9e39c5baSBill Taylor }
89*9e39c5baSBill Taylor
90*9e39c5baSBill Taylor if ((pz_handle == NULL) || DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
91*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
92*9e39c5baSBill Taylor DAT_INVALID_HANDLE_PZ);
93*9e39c5baSBill Taylor goto bail;
94*9e39c5baSBill Taylor }
95*9e39c5baSBill Taylor
96*9e39c5baSBill Taylor if ((srq_attr == NULL) || ((uintptr_t)srq_attr & 3)) {
97*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
98*9e39c5baSBill Taylor goto bail;
99*9e39c5baSBill Taylor }
100*9e39c5baSBill Taylor
101*9e39c5baSBill Taylor if (srq_handle == NULL) {
102*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
103*9e39c5baSBill Taylor goto bail;
104*9e39c5baSBill Taylor }
105*9e39c5baSBill Taylor
106*9e39c5baSBill Taylor if (srq_attr->max_recv_dtos == 0 || srq_attr->max_recv_iov == 0 ||
107*9e39c5baSBill Taylor srq_attr->low_watermark != DAT_SRQ_LW_DEFAULT) {
108*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
109*9e39c5baSBill Taylor goto bail;
110*9e39c5baSBill Taylor }
111*9e39c5baSBill Taylor
112*9e39c5baSBill Taylor /* Verify the attributes against the transport */
113*9e39c5baSBill Taylor (void) dapl_os_memzero(&srq_attr_limit, sizeof (DAT_SRQ_ATTR));
114*9e39c5baSBill Taylor dat_status = dapls_ib_query_hca(ia_ptr->hca_ptr, NULL, NULL, NULL,
115*9e39c5baSBill Taylor &srq_attr_limit);
116*9e39c5baSBill Taylor if (dat_status != DAT_SUCCESS) {
117*9e39c5baSBill Taylor goto bail;
118*9e39c5baSBill Taylor }
119*9e39c5baSBill Taylor if (srq_attr->max_recv_dtos > srq_attr_limit.max_recv_dtos ||
120*9e39c5baSBill Taylor srq_attr->max_recv_iov > srq_attr_limit.max_recv_iov) {
121*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
122*9e39c5baSBill Taylor goto bail;
123*9e39c5baSBill Taylor }
124*9e39c5baSBill Taylor
125*9e39c5baSBill Taylor /* Allocate SRQ */
126*9e39c5baSBill Taylor srq_ptr = dapl_srq_alloc(ia_ptr, srq_attr);
127*9e39c5baSBill Taylor if (srq_ptr == NULL) {
128*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
129*9e39c5baSBill Taylor DAT_RESOURCE_MEMORY);
130*9e39c5baSBill Taylor goto bail;
131*9e39c5baSBill Taylor }
132*9e39c5baSBill Taylor
133*9e39c5baSBill Taylor /* Take a reference on the PZ handle */
134*9e39c5baSBill Taylor dapl_os_atomic_inc(&((DAPL_PZ *)pz_handle)->pz_ref_count);
135*9e39c5baSBill Taylor
136*9e39c5baSBill Taylor /*
137*9e39c5baSBill Taylor * Fill in the SRQ
138*9e39c5baSBill Taylor */
139*9e39c5baSBill Taylor srq_ptr->param.ia_handle = ia_handle;
140*9e39c5baSBill Taylor srq_ptr->param.srq_state = DAT_SRQ_STATE_OPERATIONAL;
141*9e39c5baSBill Taylor srq_ptr->param.pz_handle = pz_handle;
142*9e39c5baSBill Taylor srq_ptr->param.max_recv_dtos = srq_attr->max_recv_dtos;
143*9e39c5baSBill Taylor srq_ptr->param.max_recv_iov = srq_attr->max_recv_iov;
144*9e39c5baSBill Taylor srq_ptr->param.low_watermark = DAT_SRQ_LW_DEFAULT;
145*9e39c5baSBill Taylor
146*9e39c5baSBill Taylor srq_ptr->param.available_dto_count = DAT_VALUE_UNKNOWN;
147*9e39c5baSBill Taylor srq_ptr->param.outstanding_dto_count = 0;
148*9e39c5baSBill Taylor
149*9e39c5baSBill Taylor dat_status = dapls_ib_srq_alloc(ia_ptr, srq_ptr);
150*9e39c5baSBill Taylor if (dat_status != DAT_SUCCESS) {
151*9e39c5baSBill Taylor dapl_os_atomic_dec(&((DAPL_PZ *)pz_handle)->pz_ref_count);
152*9e39c5baSBill Taylor dapl_srq_dealloc(srq_ptr);
153*9e39c5baSBill Taylor goto bail;
154*9e39c5baSBill Taylor }
155*9e39c5baSBill Taylor /* Link it onto the IA */
156*9e39c5baSBill Taylor dapl_ia_link_srq(ia_ptr, srq_ptr);
157*9e39c5baSBill Taylor
158*9e39c5baSBill Taylor *srq_handle = srq_ptr;
159*9e39c5baSBill Taylor bail:
160*9e39c5baSBill Taylor return (dat_status);
161*9e39c5baSBill Taylor }
162*9e39c5baSBill Taylor
163*9e39c5baSBill Taylor /*
164*9e39c5baSBill Taylor * dapl_srq_free
165*9e39c5baSBill Taylor *
166*9e39c5baSBill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.5
167*9e39c5baSBill Taylor *
168*9e39c5baSBill Taylor * destroys an instance of the SRQ. The SRQ cannot be destroyed if it is
169*9e39c5baSBill Taylor * in use by an EP.
170*9e39c5baSBill Taylor *
171*9e39c5baSBill Taylor * Input:
172*9e39c5baSBill Taylor * srq_handle
173*9e39c5baSBill Taylor *
174*9e39c5baSBill Taylor * Output:
175*9e39c5baSBill Taylor * none
176*9e39c5baSBill Taylor *
177*9e39c5baSBill Taylor * Returns:
178*9e39c5baSBill Taylor * DAT_SUCCESS
179*9e39c5baSBill Taylor * DAT_INVALID_HANDLE
180*9e39c5baSBill Taylor * DAT_INVALID_STATE
181*9e39c5baSBill Taylor */
182*9e39c5baSBill Taylor
183*9e39c5baSBill Taylor DAT_RETURN
dapl_srq_free(IN DAT_SRQ_HANDLE srq_handle)184*9e39c5baSBill Taylor dapl_srq_free(
185*9e39c5baSBill Taylor IN DAT_SRQ_HANDLE srq_handle)
186*9e39c5baSBill Taylor {
187*9e39c5baSBill Taylor DAPL_SRQ *srq_ptr;
188*9e39c5baSBill Taylor DAPL_IA *ia_ptr;
189*9e39c5baSBill Taylor DAT_SRQ_PARAM *param;
190*9e39c5baSBill Taylor DAT_RETURN dat_status = DAT_SUCCESS;
191*9e39c5baSBill Taylor
192*9e39c5baSBill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
193*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
194*9e39c5baSBill Taylor DAT_INVALID_HANDLE_SRQ);
195*9e39c5baSBill Taylor goto bail;
196*9e39c5baSBill Taylor }
197*9e39c5baSBill Taylor
198*9e39c5baSBill Taylor srq_ptr = (DAPL_SRQ *)srq_handle;
199*9e39c5baSBill Taylor param = &srq_ptr->param;
200*9e39c5baSBill Taylor if (0 != srq_ptr->srq_ref_count) {
201*9e39c5baSBill Taylor dapl_dbg_log(DAPL_DBG_TYPE_EP,
202*9e39c5baSBill Taylor "dapl_srq_free: Free SRQ: %p, refcnt %d\n",
203*9e39c5baSBill Taylor srq_ptr, srq_ptr->srq_ref_count);
204*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
205*9e39c5baSBill Taylor DAT_INVALID_STATE_SRQ_IN_USE);
206*9e39c5baSBill Taylor goto bail;
207*9e39c5baSBill Taylor }
208*9e39c5baSBill Taylor
209*9e39c5baSBill Taylor ia_ptr = srq_ptr->header.owner_ia;
210*9e39c5baSBill Taylor param->srq_state = DAT_SRQ_STATE_ERROR;
211*9e39c5baSBill Taylor
212*9e39c5baSBill Taylor dapls_ib_srq_free(ia_ptr, srq_ptr);
213*9e39c5baSBill Taylor
214*9e39c5baSBill Taylor /* Remove link from the IA */
215*9e39c5baSBill Taylor dapl_ia_unlink_srq(ia_ptr, srq_ptr);
216*9e39c5baSBill Taylor
217*9e39c5baSBill Taylor dapl_os_assert(param->pz_handle != NULL);
218*9e39c5baSBill Taylor dapl_os_atomic_dec(&((DAPL_PZ *)param->pz_handle)->pz_ref_count);
219*9e39c5baSBill Taylor param->pz_handle = NULL;
220*9e39c5baSBill Taylor
221*9e39c5baSBill Taylor dapl_srq_dealloc(srq_ptr);
222*9e39c5baSBill Taylor
223*9e39c5baSBill Taylor bail:
224*9e39c5baSBill Taylor return (dat_status);
225*9e39c5baSBill Taylor }
226*9e39c5baSBill Taylor
227*9e39c5baSBill Taylor /*
228*9e39c5baSBill Taylor * dapl_srq_post_recv
229*9e39c5baSBill Taylor *
230*9e39c5baSBill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.8
231*9e39c5baSBill Taylor *
232*9e39c5baSBill Taylor * posts the receive buffer that can be used for the incoming message into
233*9e39c5baSBill Taylor * the local_iov by any connected EP that uses SRQ.
234*9e39c5baSBill Taylor *
235*9e39c5baSBill Taylor * Input:
236*9e39c5baSBill Taylor * srq_handle
237*9e39c5baSBill Taylor * num_segments
238*9e39c5baSBill Taylor * local_iov
239*9e39c5baSBill Taylor * user_cookie
240*9e39c5baSBill Taylor *
241*9e39c5baSBill Taylor * Output:
242*9e39c5baSBill Taylor * none
243*9e39c5baSBill Taylor *
244*9e39c5baSBill Taylor * Returns:
245*9e39c5baSBill Taylor * DAT_SUCCESS
246*9e39c5baSBill Taylor * DAT_INVALID_HANDLE
247*9e39c5baSBill Taylor * DAT_INSUFFICIENT_RESOURCES
248*9e39c5baSBill Taylor * DAT_INVALID_PARAMETER
249*9e39c5baSBill Taylor * DAT_PROTECTION_VIOLATION
250*9e39c5baSBill Taylor * DAT_PRIVILEGES_VIOLATION
251*9e39c5baSBill Taylor */
252*9e39c5baSBill Taylor
253*9e39c5baSBill Taylor DAT_RETURN
dapl_srq_post_recv(IN DAT_SRQ_HANDLE srq_handle,IN DAT_COUNT num_segments,IN DAT_LMR_TRIPLET * local_iov,IN DAT_DTO_COOKIE user_cookie)254*9e39c5baSBill Taylor dapl_srq_post_recv(
255*9e39c5baSBill Taylor IN DAT_SRQ_HANDLE srq_handle,
256*9e39c5baSBill Taylor IN DAT_COUNT num_segments,
257*9e39c5baSBill Taylor IN DAT_LMR_TRIPLET *local_iov,
258*9e39c5baSBill Taylor IN DAT_DTO_COOKIE user_cookie)
259*9e39c5baSBill Taylor {
260*9e39c5baSBill Taylor DAPL_SRQ *srq_ptr;
261*9e39c5baSBill Taylor DAPL_COOKIE *cookie;
262*9e39c5baSBill Taylor DAT_RETURN dat_status;
263*9e39c5baSBill Taylor
264*9e39c5baSBill Taylor dapl_dbg_log(DAPL_DBG_TYPE_API,
265*9e39c5baSBill Taylor "dapl_srq_post_recv (%p, %d, %p, %P)\n",
266*9e39c5baSBill Taylor srq_handle,
267*9e39c5baSBill Taylor num_segments,
268*9e39c5baSBill Taylor local_iov,
269*9e39c5baSBill Taylor user_cookie.as_64);
270*9e39c5baSBill Taylor
271*9e39c5baSBill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
272*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE,
273*9e39c5baSBill Taylor DAT_INVALID_HANDLE_SRQ);
274*9e39c5baSBill Taylor goto bail;
275*9e39c5baSBill Taylor }
276*9e39c5baSBill Taylor
277*9e39c5baSBill Taylor srq_ptr = (DAPL_SRQ *) srq_handle;
278*9e39c5baSBill Taylor
279*9e39c5baSBill Taylor /*
280*9e39c5baSBill Taylor * Synchronization ok since this buffer is only used for receive
281*9e39c5baSBill Taylor * requests, which aren't allowed to race with each other.
282*9e39c5baSBill Taylor */
283*9e39c5baSBill Taylor dat_status = dapls_dto_cookie_alloc(&srq_ptr->recv_buffer,
284*9e39c5baSBill Taylor DAPL_DTO_TYPE_RECV,
285*9e39c5baSBill Taylor user_cookie,
286*9e39c5baSBill Taylor &cookie);
287*9e39c5baSBill Taylor if (DAT_SUCCESS != dat_status) {
288*9e39c5baSBill Taylor goto bail;
289*9e39c5baSBill Taylor }
290*9e39c5baSBill Taylor
291*9e39c5baSBill Taylor /*
292*9e39c5baSBill Taylor * Invoke provider specific routine to post DTO
293*9e39c5baSBill Taylor */
294*9e39c5baSBill Taylor dat_status = dapls_ib_post_srq(srq_ptr, cookie, num_segments,
295*9e39c5baSBill Taylor local_iov);
296*9e39c5baSBill Taylor
297*9e39c5baSBill Taylor if (dat_status != DAT_SUCCESS) {
298*9e39c5baSBill Taylor dapls_cookie_dealloc(&srq_ptr->recv_buffer, cookie);
299*9e39c5baSBill Taylor } else {
300*9e39c5baSBill Taylor dapl_os_atomic_inc(&srq_ptr->recv_count);
301*9e39c5baSBill Taylor }
302*9e39c5baSBill Taylor
303*9e39c5baSBill Taylor bail:
304*9e39c5baSBill Taylor dapl_dbg_log(DAPL_DBG_TYPE_RTN,
305*9e39c5baSBill Taylor "dapl_srq_post_recv () returns 0x%x\n", dat_status);
306*9e39c5baSBill Taylor
307*9e39c5baSBill Taylor return (dat_status);
308*9e39c5baSBill Taylor }
309*9e39c5baSBill Taylor
310*9e39c5baSBill Taylor
311*9e39c5baSBill Taylor /*
312*9e39c5baSBill Taylor * dapl_srq_query
313*9e39c5baSBill Taylor *
314*9e39c5baSBill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.6
315*9e39c5baSBill Taylor *
316*9e39c5baSBill Taylor * provides to the Consumer SRQ parameters. The Consumer passes in a pointer
317*9e39c5baSBill Taylor * to the Consumer-allocated structures for SRQ parameters that the Provider
318*9e39c5baSBill Taylor * fills.
319*9e39c5baSBill Taylor *
320*9e39c5baSBill Taylor * Input:
321*9e39c5baSBill Taylor * srq_handle
322*9e39c5baSBill Taylor * srq_param_mask
323*9e39c5baSBill Taylor *
324*9e39c5baSBill Taylor * Output:
325*9e39c5baSBill Taylor * srq_param
326*9e39c5baSBill Taylor *
327*9e39c5baSBill Taylor * Returns:
328*9e39c5baSBill Taylor * DAT_SUCCESS
329*9e39c5baSBill Taylor * DAT_INVALID_HANDLE
330*9e39c5baSBill Taylor * DAT_INVALID_PARAMETER
331*9e39c5baSBill Taylor */
332*9e39c5baSBill Taylor
333*9e39c5baSBill Taylor DAT_RETURN
dapl_srq_query(IN DAT_SRQ_HANDLE srq_handle,IN DAT_SRQ_PARAM_MASK srq_param_mask,OUT DAT_SRQ_PARAM * srq_param)334*9e39c5baSBill Taylor dapl_srq_query(
335*9e39c5baSBill Taylor IN DAT_SRQ_HANDLE srq_handle,
336*9e39c5baSBill Taylor IN DAT_SRQ_PARAM_MASK srq_param_mask,
337*9e39c5baSBill Taylor OUT DAT_SRQ_PARAM *srq_param)
338*9e39c5baSBill Taylor {
339*9e39c5baSBill Taylor DAPL_SRQ *srq_ptr;
340*9e39c5baSBill Taylor DAT_RETURN dat_status;
341*9e39c5baSBill Taylor
342*9e39c5baSBill Taylor dat_status = DAT_SUCCESS;
343*9e39c5baSBill Taylor
344*9e39c5baSBill Taylor if (srq_param_mask & ~DAT_SRQ_FIELD_ALL) {
345*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
346*9e39c5baSBill Taylor goto bail;
347*9e39c5baSBill Taylor }
348*9e39c5baSBill Taylor
349*9e39c5baSBill Taylor if (NULL == srq_param) {
350*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
351*9e39c5baSBill Taylor goto bail;
352*9e39c5baSBill Taylor }
353*9e39c5baSBill Taylor
354*9e39c5baSBill Taylor
355*9e39c5baSBill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
356*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_HANDLE, 0);
357*9e39c5baSBill Taylor goto bail;
358*9e39c5baSBill Taylor }
359*9e39c5baSBill Taylor
360*9e39c5baSBill Taylor srq_ptr = (DAPL_SRQ *)srq_handle;
361*9e39c5baSBill Taylor /* Do a struct copy */
362*9e39c5baSBill Taylor *srq_param = srq_ptr->param;
363*9e39c5baSBill Taylor /* update the outstanding dto count */
364*9e39c5baSBill Taylor srq_param->outstanding_dto_count = srq_ptr->recv_count;
365*9e39c5baSBill Taylor
366*9e39c5baSBill Taylor bail:
367*9e39c5baSBill Taylor return (dat_status);
368*9e39c5baSBill Taylor }
369*9e39c5baSBill Taylor
370*9e39c5baSBill Taylor /*
371*9e39c5baSBill Taylor * dapl_srq_set_lw
372*9e39c5baSBill Taylor *
373*9e39c5baSBill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.4
374*9e39c5baSBill Taylor *
375*9e39c5baSBill Taylor * sets the low watermark value for SRQ and arms SRQ for generating an
376*9e39c5baSBill Taylor * asynchronous event for low watermark. An asynchronous event will be
377*9e39c5baSBill Taylor * generated when the number of buffers on SRQ is below the low watermark
378*9e39c5baSBill Taylor * for the first time. This may happen during this call or when an
379*9e39c5baSBill Taylor * associated EP takes a buffer from the SRQ.
380*9e39c5baSBill Taylor *
381*9e39c5baSBill Taylor * Input:
382*9e39c5baSBill Taylor * srq_handle
383*9e39c5baSBill Taylor * low_watermark
384*9e39c5baSBill Taylor *
385*9e39c5baSBill Taylor * Output:
386*9e39c5baSBill Taylor * none
387*9e39c5baSBill Taylor *
388*9e39c5baSBill Taylor * Returns:
389*9e39c5baSBill Taylor * DAT_SUCCESS
390*9e39c5baSBill Taylor * DAT_INVALID_HANDLE
391*9e39c5baSBill Taylor * DAT_INVALID_PARAMETER
392*9e39c5baSBill Taylor * DAT_MODEL_NOT_SUPPORTED
393*9e39c5baSBill Taylor */
394*9e39c5baSBill Taylor
395*9e39c5baSBill Taylor /* ARGSUSED */
396*9e39c5baSBill Taylor DAT_RETURN
dapl_srq_set_lw(IN DAT_SRQ_HANDLE srq_handle,IN DAT_COUNT low_watermark)397*9e39c5baSBill Taylor dapl_srq_set_lw(
398*9e39c5baSBill Taylor IN DAT_SRQ_HANDLE srq_handle,
399*9e39c5baSBill Taylor IN DAT_COUNT low_watermark)
400*9e39c5baSBill Taylor {
401*9e39c5baSBill Taylor return (DAT_MODEL_NOT_SUPPORTED);
402*9e39c5baSBill Taylor }
403*9e39c5baSBill Taylor
404*9e39c5baSBill Taylor /*
405*9e39c5baSBill Taylor * dapl_srq_resize
406*9e39c5baSBill Taylor *
407*9e39c5baSBill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.7
408*9e39c5baSBill Taylor *
409*9e39c5baSBill Taylor * modifies the size of the queue of SRQ. Resizing of SRQ shall not cause
410*9e39c5baSBill Taylor * any incoming messages on any of the EPs that use the SRQ to be lost.
411*9e39c5baSBill Taylor *
412*9e39c5baSBill Taylor * Input:
413*9e39c5baSBill Taylor * srq_handle
414*9e39c5baSBill Taylor * srq_max_recv_dto
415*9e39c5baSBill Taylor *
416*9e39c5baSBill Taylor * Output:
417*9e39c5baSBill Taylor * none
418*9e39c5baSBill Taylor *
419*9e39c5baSBill Taylor * Returns:
420*9e39c5baSBill Taylor * DAT_SUCCESS
421*9e39c5baSBill Taylor * DAT_INVALID_HANDLE
422*9e39c5baSBill Taylor * DAT_INVALID_PARAMETER
423*9e39c5baSBill Taylor * DAT_INSUFFICIENT_RESOURCES
424*9e39c5baSBill Taylor * DAT_INVALID_STATE
425*9e39c5baSBill Taylor */
426*9e39c5baSBill Taylor
427*9e39c5baSBill Taylor /* ARGSUSED */
428*9e39c5baSBill Taylor DAT_RETURN
dapl_srq_resize(IN DAT_SRQ_HANDLE srq_handle,IN DAT_COUNT srq_max_recv_dtos)429*9e39c5baSBill Taylor dapl_srq_resize(
430*9e39c5baSBill Taylor IN DAT_SRQ_HANDLE srq_handle,
431*9e39c5baSBill Taylor IN DAT_COUNT srq_max_recv_dtos)
432*9e39c5baSBill Taylor {
433*9e39c5baSBill Taylor DAPL_SRQ *srq_ptr;
434*9e39c5baSBill Taylor DAT_SRQ_ATTR srq_attr_limit;
435*9e39c5baSBill Taylor DAPL_COOKIE_BUFFER new_cb;
436*9e39c5baSBill Taylor DAT_RETURN dat_status;
437*9e39c5baSBill Taylor
438*9e39c5baSBill Taylor
439*9e39c5baSBill Taylor srq_ptr = (DAPL_SRQ *)srq_handle;
440*9e39c5baSBill Taylor dat_status = DAT_SUCCESS;
441*9e39c5baSBill Taylor
442*9e39c5baSBill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
443*9e39c5baSBill Taylor return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_HANDLE_TYPE_SRQ));
444*9e39c5baSBill Taylor }
445*9e39c5baSBill Taylor
446*9e39c5baSBill Taylor /* can't shrink below the number of outstanding recvs */
447*9e39c5baSBill Taylor if (srq_max_recv_dtos < srq_ptr->recv_count) {
448*9e39c5baSBill Taylor return (DAT_ERROR(DAT_INVALID_STATE, 0));
449*9e39c5baSBill Taylor }
450*9e39c5baSBill Taylor
451*9e39c5baSBill Taylor /*
452*9e39c5baSBill Taylor * shrinking SRQs is not supported on tavor return success without
453*9e39c5baSBill Taylor * any modification.
454*9e39c5baSBill Taylor */
455*9e39c5baSBill Taylor if (srq_max_recv_dtos <= srq_ptr->param.max_recv_dtos) {
456*9e39c5baSBill Taylor return (DAT_SUCCESS);
457*9e39c5baSBill Taylor }
458*9e39c5baSBill Taylor
459*9e39c5baSBill Taylor /* Verify the attributes against the transport */
460*9e39c5baSBill Taylor (void) dapl_os_memzero(&srq_attr_limit, sizeof (DAT_SRQ_ATTR));
461*9e39c5baSBill Taylor dat_status = dapls_ib_query_hca(srq_ptr->header.owner_ia->hca_ptr,
462*9e39c5baSBill Taylor NULL, NULL, NULL, &srq_attr_limit);
463*9e39c5baSBill Taylor if (dat_status != DAT_SUCCESS) {
464*9e39c5baSBill Taylor return (dat_status);
465*9e39c5baSBill Taylor }
466*9e39c5baSBill Taylor
467*9e39c5baSBill Taylor if (srq_max_recv_dtos > srq_attr_limit.max_recv_dtos) {
468*9e39c5baSBill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
469*9e39c5baSBill Taylor return (dat_status);
470*9e39c5baSBill Taylor }
471*9e39c5baSBill Taylor
472*9e39c5baSBill Taylor dat_status = dapls_cb_resize(&srq_ptr->recv_buffer, srq_max_recv_dtos,
473*9e39c5baSBill Taylor &new_cb);
474*9e39c5baSBill Taylor if (dat_status != DAT_SUCCESS) {
475*9e39c5baSBill Taylor return (dat_status);
476*9e39c5baSBill Taylor }
477*9e39c5baSBill Taylor
478*9e39c5baSBill Taylor dat_status = dapls_ib_srq_resize(srq_ptr, srq_max_recv_dtos);
479*9e39c5baSBill Taylor if (dat_status != DAT_SUCCESS) {
480*9e39c5baSBill Taylor goto bail;
481*9e39c5baSBill Taylor }
482*9e39c5baSBill Taylor
483*9e39c5baSBill Taylor dapls_cb_free(&srq_ptr->recv_buffer);
484*9e39c5baSBill Taylor srq_ptr->recv_buffer = new_cb; /* struct copy */
485*9e39c5baSBill Taylor srq_ptr->param.max_recv_dtos = srq_max_recv_dtos;
486*9e39c5baSBill Taylor
487*9e39c5baSBill Taylor return (DAT_SUCCESS);
488*9e39c5baSBill Taylor bail:
489*9e39c5baSBill Taylor dapls_cb_free(&new_cb);
490*9e39c5baSBill Taylor
491*9e39c5baSBill Taylor return (dat_status);
492*9e39c5baSBill Taylor }
493