dapl_srq.c revision 9e39c5ba00a55fa05777cc94b148296af305e135
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * CDDL HEADER START
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 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * See the License for the specific language governing permissions
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * and limitations under the License.
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 * CDDL HEADER END
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Use is subject to license terms.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * PURPOSE: Shared Receive Queue
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Description: Interfaces in this file are completely described in
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the DAPL 1.2 API, Chapter 6, section 5
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_srq_create
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.1
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * creates an instance of a Shared Receive Queue (SRQ) that is provided
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to the Consumer as srq_handle.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INSUFFICIENT_RESOURCES
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_HANDLE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_PARAMETER
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_MODEL_NOT_SUPPORTED
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Verify parameters
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((pz_handle == NULL) || DAPL_BAD_HANDLE(pz_handle, DAPL_MAGIC_PZ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if ((srq_attr == NULL) || ((uintptr_t)srq_attr & 3)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG4);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq_attr->max_recv_dtos == 0 || srq_attr->max_recv_iov == 0 ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_attr->low_watermark != DAT_SRQ_LW_DEFAULT) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Verify the attributes against the transport */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memzero(&srq_attr_limit, sizeof (DAT_SRQ_ATTR));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_query_hca(ia_ptr->hca_ptr, NULL, NULL, NULL,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq_attr->max_recv_dtos > srq_attr_limit.max_recv_dtos ||
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_attr->max_recv_iov > srq_attr_limit.max_recv_iov) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Allocate SRQ */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INSUFFICIENT_RESOURCES,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Take a reference on the PZ handle */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_inc(&((DAPL_PZ *)pz_handle)->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Fill in the SRQ
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_ptr->param.srq_state = DAT_SRQ_STATE_OPERATIONAL;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_ptr->param.max_recv_dtos = srq_attr->max_recv_dtos;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_ptr->param.max_recv_iov = srq_attr->max_recv_iov;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_ptr->param.low_watermark = DAT_SRQ_LW_DEFAULT;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_ptr->param.available_dto_count = DAT_VALUE_UNKNOWN;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_srq_alloc(ia_ptr, srq_ptr);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_PZ *)pz_handle)->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Link it onto the IA */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_srq_free
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.5
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * destroys an instance of the SRQ. The SRQ cannot be destroyed if it is
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * in use by an EP.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_HANDLE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_STATE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "dapl_srq_free: Free SRQ: %p, refcnt %d\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Remove link from the IA */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapl_os_atomic_dec(&((DAPL_PZ *)param->pz_handle)->pz_ref_count);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_srq_post_recv
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.8
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * posts the receive buffer that can be used for the incoming message into
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * the local_iov by any connected EP that uses SRQ.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * num_segments
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * user_cookie
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_HANDLE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INSUFFICIENT_RESOURCES
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_PARAMETER
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_PROTECTION_VIOLATION
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_PRIVILEGES_VIOLATION
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "dapl_srq_post_recv (%p, %d, %p, %P)\n",
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Synchronization ok since this buffer is only used for receive
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * requests, which aren't allowed to race with each other.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_dto_cookie_alloc(&srq_ptr->recv_buffer,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * Invoke provider specific routine to post DTO
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_post_srq(srq_ptr, cookie, num_segments,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dapls_cookie_dealloc(&srq_ptr->recv_buffer, cookie);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor "dapl_srq_post_recv () returns 0x%x\n", dat_status);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_srq_query
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.6
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * provides to the Consumer SRQ parameters. The Consumer passes in a pointer
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * to the Consumer-allocated structures for SRQ parameters that the Provider
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_param_mask
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_HANDLE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_PARAMETER
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG3);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Do a struct copy */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* update the outstanding dto count */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_param->outstanding_dto_count = srq_ptr->recv_count;
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_srq_set_lw
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.4
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * sets the low watermark value for SRQ and arms SRQ for generating an
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * asynchronous event for low watermark. An asynchronous event will be
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * generated when the number of buffers on SRQ is below the low watermark
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * for the first time. This may happen during this call or when an
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * associated EP takes a buffer from the SRQ.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * low_watermark
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_HANDLE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_PARAMETER
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_MODEL_NOT_SUPPORTED
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * dapl_srq_resize
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * uDAPL: User Direct Access Program Library Version 1.2, 6.5.7
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * modifies the size of the queue of SRQ. Resizing of SRQ shall not cause
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * any incoming messages on any of the EPs that use the SRQ to be lost.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_handle
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * srq_max_recv_dto
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_SUCCESS
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_HANDLE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_PARAMETER
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INSUFFICIENT_RESOURCES
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * DAT_INVALID_STATE
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor/* ARGSUSED */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (DAPL_BAD_HANDLE(srq_handle, DAPL_MAGIC_SRQ)) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor return (DAT_ERROR(DAT_INVALID_HANDLE, DAT_HANDLE_TYPE_SRQ));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* can't shrink below the number of outstanding recvs */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * shrinking SRQs is not supported on tavor return success without
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor * any modification.
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq_max_recv_dtos <= srq_ptr->param.max_recv_dtos) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor /* Verify the attributes against the transport */
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor (void) dapl_os_memzero(&srq_attr_limit, sizeof (DAT_SRQ_ATTR));
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_query_hca(srq_ptr->header.owner_ia->hca_ptr,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor if (srq_max_recv_dtos > srq_attr_limit.max_recv_dtos) {
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = DAT_ERROR(DAT_INVALID_PARAMETER, DAT_INVALID_ARG2);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_cb_resize(&srq_ptr->recv_buffer, srq_max_recv_dtos,
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor dat_status = dapls_ib_srq_resize(srq_ptr, srq_max_recv_dtos);
9e39c5ba00a55fa05777cc94b148296af305e135Bill Taylor srq_ptr->recv_buffer = new_cb; /* struct copy */