b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER START
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The contents of this file are subject to the terms of the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Common Development and Distribution License (the "License").
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You may not use this file except in compliance with the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * or http://www.opensolaris.org/os/licensing.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * See the License for the specific language governing permissions
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * and limitations under the License.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * When distributing Covered Code, include this CDDL HEADER in each
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * If applicable, add the following below this CDDL HEADER, with the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * fields enclosed by brackets "[]" replaced with your own identifying
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * information: Portions Copyright [yyyy] [name of copyright owner]
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CDDL HEADER END
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
00d1d19828f3122eb24ae7a68175ba64744f8366Suhasini Peddada * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Copyright (c) 2005 SilverStorm Technologies, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * This software is available to you under a choice of one of two
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * licenses. You may choose to be licensed under the terms of the GNU
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * General Public License (GPL) Version 2, available from the file
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * COPYING in the main directory of this source tree, or the
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * OpenIB.org BSD license below:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Redistribution and use in source and binary forms, with or
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * without modification, are permitted provided that the following
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * conditions are met:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * - Redistributions of source code must retain the above
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * copyright notice, this list of conditions and the following
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * disclaimer.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * - Redistributions in binary form must reproduce the above
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * copyright notice, this list of conditions and the following
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * disclaimer in the documentation and/or other materials
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * provided with the distribution.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * SOFTWARE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Sun elects to include this software in Sun product
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * under the OpenIB BSD license.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * POSSIBILITY OF SUCH DAMAGE.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/types.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ddi.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/sunddi.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_cm.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_ib.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_buf.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rdsib_ep.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <sys/ib/clients/rds/rds_kstat.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic void rds_async_handler(void *clntp, ibt_hca_hdl_t hdl,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_async_code_t code, ibt_async_event_t *event);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic struct ibt_clnt_modinfo_s rds_ib_modinfo = {
03494a9880d80f834bec10a1e8f0a2f8f7c97bf4Bill Taylor IBTI_V_CURR,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBT_NETWORK,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_async_handler,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri NULL,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "RDS"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* performance tunables */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t rds_no_interrupts = 0;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t rds_poll_percent_full = 25;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t rds_wc_signal = IBT_NEXT_SOLICITED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriuint_t rds_waittime_ms = 100; /* ms */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern dev_info_t *rdsib_dev_info;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern void rds_close_sessions();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic void
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirdsib_validate_chan_sizes(ibt_hca_attr_t *hattrp)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* The SQ size should not be more than that supported by the HCA */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (((MaxDataSendBuffers + RDS_NUM_ACKS) > hattrp->hca_max_chan_sz) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ((MaxDataSendBuffers + RDS_NUM_ACKS) > hattrp->hca_max_cq_sz)) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("RDSIB", "MaxDataSendBuffers + %d is greater "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "than that supported by the HCA driver "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "(%d + %d > %d or %d), lowering it to a supported value.",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_NUM_ACKS, MaxDataSendBuffers, RDS_NUM_ACKS,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz, hattrp->hca_max_cq_sz);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxDataSendBuffers = (hattrp->hca_max_chan_sz >
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_cq_sz) ?
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_cq_sz - RDS_NUM_ACKS :
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz - RDS_NUM_ACKS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* The RQ size should not be more than that supported by the HCA */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((MaxDataRecvBuffers > hattrp->hca_max_chan_sz) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (MaxDataRecvBuffers > hattrp->hca_max_cq_sz)) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("RDSIB", "MaxDataRecvBuffers is greater than that "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "supported by the HCA driver (%d > %d or %d), lowering it "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "to a supported value.", MaxDataRecvBuffers,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz, hattrp->hca_max_cq_sz);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxDataRecvBuffers = (hattrp->hca_max_chan_sz >
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_cq_sz) ? hattrp->hca_max_cq_sz :
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* The SQ size should not be more than that supported by the HCA */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((MaxCtrlSendBuffers > hattrp->hca_max_chan_sz) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (MaxCtrlSendBuffers > hattrp->hca_max_cq_sz)) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("RDSIB", "MaxCtrlSendBuffers is greater than that "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "supported by the HCA driver (%d > %d or %d), lowering it "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "to a supported value.", MaxCtrlSendBuffers,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz, hattrp->hca_max_cq_sz);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxCtrlSendBuffers = (hattrp->hca_max_chan_sz >
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_cq_sz) ? hattrp->hca_max_cq_sz :
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* The RQ size should not be more than that supported by the HCA */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((MaxCtrlRecvBuffers > hattrp->hca_max_chan_sz) ||
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (MaxCtrlRecvBuffers > hattrp->hca_max_cq_sz)) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("RDSIB", "MaxCtrlRecvBuffers is greater than that "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "supported by the HCA driver (%d > %d or %d), lowering it "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "to a supported value.", MaxCtrlRecvBuffers,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz, hattrp->hca_max_cq_sz);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MaxCtrlRecvBuffers = (hattrp->hca_max_chan_sz >
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_cq_sz) ? hattrp->hca_max_cq_sz :
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_chan_sz;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* The MaxRecvMemory should be less than that supported by the HCA */
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri if ((NDataRX * RdsPktSize) > hattrp->hca_max_memr_len) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("RDSIB", "MaxRecvMemory is greater than that "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "supported by the HCA driver (%d > %d), lowering it to %d",
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri NDataRX * RdsPktSize, hattrp->hca_max_memr_len,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hattrp->hca_max_memr_len);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri NDataRX = hattrp->hca_max_memr_len/RdsPktSize;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala/* Return hcap, given the hca guid */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalards_hca_t *
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalards_lkup_hca(ib_guid_t hca_guid)
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala{
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_hca_t *hcap;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF4("rds_lkup_hca", "Enter: statep: 0x%p "
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "guid: %llx", rdsib_statep, hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&rdsib_statep->rds_hca_lock, RW_READER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = rdsib_statep->rds_hcalistp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala while ((hcap != NULL) && (hcap->hca_guid != hca_guid)) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = hcap->hca_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&rdsib_statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF4("rds_lkup_hca", "return");
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (hcap);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala}
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agirivoid rds_randomize_qps(rds_hca_t *hcap);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalastatic rds_hca_t *
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalardsib_init_hca(ib_guid_t hca_guid)
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala{
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_hca_t *hcap;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala boolean_t alloc = B_FALSE;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala int ret;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca", "enter: HCA 0x%llx", hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* Do a HCA lookup */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = rds_lkup_hca(hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap != NULL && hcap->hca_hdl != NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * This can happen if we get IBT_HCA_ATTACH_EVENT on an HCA
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * that we have already opened. Just return NULL so that
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * we'll not end up reinitializing the HCA again.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca", "HCA already initialized");
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap == NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca", "New HCA is added");
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = (rds_hca_t *)kmem_zalloc(sizeof (rds_hca_t), KM_SLEEP);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala alloc = B_TRUE;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_guid = hca_guid;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_open_hca(rdsib_statep->rds_ibhdl, hca_guid,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala &hcap->hca_hdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret == IBT_HCA_IN_USE) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "ibt_open_hca: 0x%llx returned IBT_HCA_IN_USE",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala } else {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "ibt_open_hca: 0x%llx failed: %d", hca_guid, ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (alloc == B_TRUE) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala kmem_free(hcap, sizeof (rds_hca_t));
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_query_hca(hcap->hca_hdl, &hcap->hca_attr);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "Query HCA: 0x%llx failed: %d", hca_guid, ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_close_hca(hcap->hca_hdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(ret == IBT_SUCCESS);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (alloc == B_TRUE) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala kmem_free(hcap, sizeof (rds_hca_t));
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala } else {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_hdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_query_hca_ports(hcap->hca_hdl, 0,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala &hcap->hca_pinfop, &hcap->hca_nports, &hcap->hca_pinfo_sz);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "Query HCA 0x%llx ports failed: %d", hca_guid,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_close_hca(hcap->hca_hdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_hdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(ret == IBT_SUCCESS);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (alloc == B_TRUE) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala kmem_free(hcap, sizeof (rds_hca_t));
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala } else {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_hdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* Only one PD per HCA is allocated, so do it here */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_alloc_pd(hcap->hca_hdl, IBT_PD_NO_FLAGS,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala &hcap->hca_pdhdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "ibt_alloc_pd 0x%llx failed: %d", hca_guid, ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) ibt_free_portinfo(hcap->hca_pinfop,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_pinfo_sz);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_close_hca(hcap->hca_hdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(ret == IBT_SUCCESS);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_hdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (alloc == B_TRUE) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala kmem_free(hcap, sizeof (rds_hca_t));
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala } else {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_hdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rdsib_validate_chan_sizes(&hcap->hca_attr);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri /* To minimize stale connections after ungraceful reboots */
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rds_randomize_qps(hcap);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&rdsib_statep->rds_hca_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_state = RDS_HCA_STATE_OPEN;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (alloc == B_TRUE) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* this is a new HCA, add it to the list */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rdsib_statep->rds_nhcas++;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_nextp = rdsib_statep->rds_hcalistp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rdsib_statep->rds_hcalistp = hcap;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&rdsib_statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_init_hca", "return: HCA 0x%llx", hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (hcap);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala}
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * Called from attach
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint
d99cb22f7f0de8584336bda08cb86c562ffbab55agirirdsib_initialize_ib()
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ib_guid_t *guidp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_hca_t *hcap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t ix, hcaix, nhcas;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_initialize_ib", "enter: statep %p", rdsib_statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(rdsib_statep != NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rdsib_statep == NULL) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF1("rdsib_initialize_ib",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri "RDS Statep not initialized");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* How many hcas are there? */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nhcas = ibt_get_hca_list(&guidp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (nhcas == 0) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_initialize_ib", "No IB HCAs Available");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF3("rdsib_initialize_ib", "Number of HCAs: %d", nhcas);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Register with IBTF */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_attach(&rds_ib_modinfo, rdsib_dev_info, rdsib_statep,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri &rdsib_statep->rds_ibhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_initialize_ib", "ibt_attach failed: %d",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_hca_list(guidp, nhcas);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Open each HCA and gather its information. Don't care about HCAs
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * that cannot be opened. It is OK as long as atleast one HCA can be
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * opened.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Initialize a HCA only if all the information is available.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri for (ix = 0, hcaix = 0; ix < nhcas; ix++) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3(LABEL, "Open HCA: 0x%llx", guidp[ix]);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = rdsib_init_hca(guidp[ix]);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap != NULL) hcaix++;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* free the HCA list, we are done with it */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_hca_list(guidp, nhcas);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (hcaix == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Failed to Initialize even one HCA */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_initialize_ib", "No HCAs are initialized");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_detach(rdsib_statep->rds_ibhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_statep->rds_ibhdl = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (-1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (hcaix < nhcas) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rdsib_open_ib", "HCAs %d/%d failed to initialize",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (nhcas - hcaix), nhcas);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_initialize_ib", "return: statep %p", rdsib_statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * Called from detach
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
d99cb22f7f0de8584336bda08cb86c562ffbab55agirirdsib_deinitialize_ib()
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rds_hca_t *hcap, *nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_deinitialize_ib", "enter: statep %p", rdsib_statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* close and destroy all the sessions */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_close_sessions(NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri /* Release all HCA resources */
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_enter(&rdsib_statep->rds_hca_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_deinitialize_ib", "HCA List: %p, NHCA: %d",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rdsib_statep->rds_hcalistp, rdsib_statep->rds_nhcas);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap = rdsib_statep->rds_hcalistp;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rdsib_statep->rds_hcalistp = NULL;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rdsib_statep->rds_nhcas = 0;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_exit(&rdsib_statep->rds_hca_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while (hcap != NULL) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri nextp = hcap->hca_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap->hca_hdl != NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_free_pd(hcap->hca_hdl, hcap->hca_pdhdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(ret == IBT_SUCCESS);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) ibt_free_portinfo(hcap->hca_pinfop,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_pinfo_sz);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_close_hca(hcap->hca_hdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(ret == IBT_SUCCESS);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kmem_free(hcap, sizeof (rds_hca_t));
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri hcap = nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Deregister with IBTF */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rdsib_statep->rds_ibhdl != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_detach(rdsib_statep->rds_ibhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rdsib_statep->rds_ibhdl = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_deinitialize_ib", "return: statep %p",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rdsib_statep);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri}
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri/*
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * Called on open of first RDS socket
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiriint
d99cb22f7f0de8584336bda08cb86c562ffbab55agirirdsib_open_ib()
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri{
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri int ret;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_open_ib", "enter: statep %p", rdsib_statep);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri /* Enable incoming connection requests */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (rdsib_statep->rds_srvhdl == NULL) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rdsib_statep->rds_srvhdl =
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rds_register_service(rdsib_statep->rds_ibhdl);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (rdsib_statep->rds_srvhdl == NULL) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_open_ib",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri "Service registration failed");
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri return (-1);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri } else {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri /* bind the service on all available ports */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ret = rds_bind_service(rdsib_statep);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (ret != 0) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_open_ib",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri "Bind service failed: %d", ret);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_open_ib", "return: statep %p", rdsib_statep);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri return (0);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri}
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri/*
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri * Called when all ports are closed.
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri */
d99cb22f7f0de8584336bda08cb86c562ffbab55agirivoid
d99cb22f7f0de8584336bda08cb86c562ffbab55agirirdsib_close_ib()
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri{
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri int ret;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_close_ib", "enter: statep %p", rdsib_statep);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri /* Disable incoming connection requests */
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (rdsib_statep->rds_srvhdl != NULL) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ret = ibt_unbind_all_services(rdsib_statep->rds_srvhdl);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (ret != 0) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_close_ib",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri "ibt_unbind_all_services failed: %d\n", ret);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ret = ibt_deregister_service(rdsib_statep->rds_ibhdl,
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rdsib_statep->rds_srvhdl);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri if (ret != 0) {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_close_ib",
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri "ibt_deregister_service failed: %d\n", ret);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri } else {
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri rdsib_statep->rds_srvhdl = NULL;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri RDS_DPRINTF2("rdsib_close_ib", "return: statep %p", rdsib_statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Return hcap, given the hca guid */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_hca_t *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_get_hcap(rds_state_t *statep, ib_guid_t hca_guid)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_hca_t *hcap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_get_hcap", "rds_get_hcap: Enter: statep: 0x%p "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "guid: %llx", statep, hca_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&statep->rds_hca_lock, RW_READER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap = statep->rds_hcalistp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while ((hcap != NULL) && (hcap->hca_guid != hca_guid)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap = hcap->hca_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * don't let anyone use this HCA until the RECV memory
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * is registered with this HCA
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if ((hcap != NULL) &&
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (hcap->hca_state == RDS_HCA_STATE_MEM_REGISTERED)) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(hcap->hca_mrhdl != NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (hcap);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rds_get_hcap",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "HCA (0x%p, 0x%llx) is not initialized", hcap, hca_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&statep->rds_hca_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_get_hcap", "rds_get_hcap: return");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Return hcap, given a gid */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_hca_t *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_gid_to_hcap(rds_state_t *statep, ib_gid_t gid)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rds_hca_t *hcap;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri uint_t ix;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_gid_to_hcap", "Enter: statep: 0x%p gid: %llx:%llx",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri statep, gid.gid_prefix, gid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_enter(&statep->rds_hca_lock, RW_READER);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri hcap = statep->rds_hcalistp;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri while (hcap != NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * don't let anyone use this HCA until the RECV memory
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * is registered with this HCA
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap->hca_state != RDS_HCA_STATE_MEM_REGISTERED) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF3("rds_gid_to_hcap",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "HCA (0x%p, 0x%llx) is not initialized",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap, gid.gid_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = hcap->hca_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala continue;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri for (ix = 0; ix < hcap->hca_nports; ix++) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if ((hcap->hca_pinfop[ix].p_sgid_tbl[0].gid_prefix ==
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri gid.gid_prefix) &&
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri (hcap->hca_pinfop[ix].p_sgid_tbl[0].gid_guid ==
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri gid.gid_guid)) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri RDS_DPRINTF4("rds_gid_to_hcap",
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri "gid found in hcap: 0x%p", hcap);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_exit(&statep->rds_hca_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (hcap);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri hcap = hcap->hca_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_exit(&statep->rds_hca_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* This is called from the send CQ handler */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_send_acknowledgement(rds_ep_t *ep)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t ix;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_send_acknowledgement", "Enter EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(ep->ep_rdmacnt != 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * The previous ACK completed successfully, send the next one
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * if more messages were received after sending the last ACK
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_rbufid != *(uintptr_t *)(uintptr_t)ep->ep_ackds.ds_va) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *(uintptr_t *)(uintptr_t)ep->ep_ackds.ds_va = ep->ep_rbufid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* send acknowledgement */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_INCR_TXACKS();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_post_send(ep->ep_chanhdl, &ep->ep_ackwr, 1, &ix);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("rds_send_acknowledgement",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p): ibt_post_send for acknowledgement "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed: %d, SQ depth: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, ret, ep->ep_sndpool.pool_nbusy);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_rdmacnt--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* ACKed all messages, no more to ACK */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_rdmacnt--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_send_acknowledgement", "Return EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_poll_ctrl_completions(ibt_cq_hdl_t cq, rds_ep_t *ep)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_wc_t wc;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t npolled;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ctrl_pkt_t *cpkt;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_qp_t *recvqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret = IBT_SUCCESS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_poll_ctrl_completions", "Enter: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bzero(&wc, sizeof (ibt_wc_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_poll_cq(cq, &wc, 1, &npolled);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_CQ_EMPTY) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p) CQ(%p): ibt_poll_cq "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "returned: %d", ep, cq, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5(LABEL, "EP(%p) CQ(%p): ibt_poll_cq "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "returned: IBT_CQ_EMPTY", ep, cq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = (rds_buf_t *)(uintptr_t)wc.wc_id;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc.wc_status != IBT_WC_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_recvqp.qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_recvqp.qp_level--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_recvqp.qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Free the buffer */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_state = RDS_RCVBUF_FREE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_free_recv_buf(bp, 1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Receive completion failure */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc.wc_status != IBT_WC_WR_FLUSHED_ERR) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_poll_ctrl_completions",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) CQ(%p) BP(%p): WC Error Status: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, cq, wc.wc_id, wc.wc_status);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* there is one less in the RQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp = &ep->ep_recvqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_level--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((recvqp->qp_taskqpending == B_FALSE) &&
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (recvqp->qp_level <= recvqp->qp_lwm)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Time to post more buffers into the RQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_TRUE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_taskq_dispatch(rds_taskq,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_post_recv_buf, (void *)ep->ep_chanhdl, DDI_NOSLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != DDI_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2(LABEL, "ddi_taskq_dispatch failed: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri cpkt = (rds_ctrl_pkt_t *)(uintptr_t)bp->buf_ds.ds_va;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_handle_control_message(ep->ep_sp, cpkt);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_state = RDS_RCVBUF_FREE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_free_recv_buf(bp, 1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_poll_ctrl_completions", "Return: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#define RDS_POST_FEW_ATATIME 100
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Post recv WRs into the RQ. Assumes the ep->refcnt is already incremented */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_post_recv_buf(void *arg)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_channel_hdl_t chanhdl;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_qp_t *recvqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_bufpool_t *gp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *bp, *bp1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_recv_wr_t *wrp, wr[RDS_POST_FEW_ATATIME];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_hca_t *hcap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t npost, nspace, rcv_len;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t ix, jx, kx;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanhdl = (ibt_channel_hdl_t)arg;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_post_recv_buf", "Enter: CHAN(%p)", chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_INCR_POST_RCV_BUF_CALLS();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)ibt_get_chan_private(chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(ep != NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp = ep->ep_sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp = &ep->ep_recvqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5("rds_post_recv_buf", "EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* get the hcap for the HCA hosting this channel */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = rds_lkup_hca(ep->ep_hca_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (hcap == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_post_recv_buf", "HCA (0x%llx) not found",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_hca_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Make sure the session is still connected */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_READER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((sp->session_state != RDS_SESSION_STATE_INIT) &&
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (sp->session_state != RDS_SESSION_STATE_CONNECTED) &&
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (sp->session_state != RDS_SESSION_STATE_HCA_CLOSING)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_post_recv_buf", "EP(%p): Session is not "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "in active state (%d)", ep, sp->session_state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* how many can be posted */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nspace = recvqp->qp_depth - recvqp->qp_level;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (nspace == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_post_recv_buf", "RQ is FULL");
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_type == RDS_EP_TYPE_DATA) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri gp = &rds_dpool;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcv_len = RdsPktSize;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri gp = &rds_cpool;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcv_len = RDS_CTRLPKT_SIZE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = rds_get_buf(gp, nspace, &jx);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (bp == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p): No Recv buffers available", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* try again later */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_taskq_dispatch(rds_taskq, rds_post_recv_buf,
5bc515a198c7f6b3c0036a1b6c10ac9f2119439dagiri (void *)chanhdl, DDI_NOSLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != DDI_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2(LABEL, "ddi_taskq_dispatch failed: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (jx != nspace) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p): Recv buffers "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "needed: %d available: %d", ep, nspace, jx);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nspace = jx;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp1 = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri for (ix = 0; ix < nspace; ix++) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp1->buf_ep = ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(bp1->buf_state == RDS_RCVBUF_FREE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp1->buf_state = RDS_RCVBUF_POSTED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp1->buf_ds.ds_key = hcap->hca_lkey;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp1->buf_ds.ds_len = rcv_len;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp1 = bp1->buf_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if 0
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wrp = kmem_zalloc(RDS_POST_FEW_ATATIME * sizeof (ibt_recv_wr_t),
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KM_SLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#else
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wrp = &wr[0];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri npost = nspace;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri while (npost) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri jx = (npost > RDS_POST_FEW_ATATIME) ?
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_POST_FEW_ATATIME : npost;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri for (ix = 0; ix < jx; ix++) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wrp[ix].wr_id = (uintptr_t)bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wrp[ix].wr_nds = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wrp[ix].wr_sgl = &bp->buf_ds;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = bp->buf_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_post_recv(chanhdl, wrp, jx, &kx);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((ret != IBT_SUCCESS) || (kx != jx)) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2(LABEL, "ibt_post_recv for %d WRs failed: "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "%d", npost, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri npost -= kx;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri npost -= jx;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (npost != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_post_recv_buf",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) Failed to post %d WRs", ep, npost);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_level += (nspace - npost);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_level += nspace;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * sometimes, the recv WRs can get consumed as soon as they are
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * posted. In that case, taskq thread to post more WRs to the RQ will
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * not be scheduled as the taskqpending flag is still set.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (recvqp->qp_level == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_taskq_dispatch(rds_taskq,
5bc515a198c7f6b3c0036a1b6c10ac9f2119439dagiri rds_post_recv_buf, (void *)chanhdl, DDI_NOSLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != DDI_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("rds_post_recv_buf",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "ddi_taskq_dispatch failed: %d", ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if 0
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kmem_free(wrp, RDS_POST_FEW_ATATIME * sizeof (ibt_recv_wr_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_post_recv_buf", "Return: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic int
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_poll_data_completions(ibt_cq_hdl_t cq, rds_ep_t *ep)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_wc_t wc;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_data_hdr_t *pktp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_qp_t *recvqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t npolled;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret = IBT_SUCCESS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_poll_data_completions", "Enter: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bzero(&wc, sizeof (ibt_wc_t));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_poll_cq(cq, &wc, 1, &npolled);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_CQ_EMPTY) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p) CQ(%p): ibt_poll_cq "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "returned: %d", ep, cq, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5(LABEL, "EP(%p) CQ(%p): ibt_poll_cq "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "returned: IBT_CQ_EMPTY", ep, cq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = (rds_buf_t *)(uintptr_t)wc.wc_id;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(bp->buf_state == RDS_RCVBUF_POSTED);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_state = RDS_RCVBUF_ONSOCKQ;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_nextp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc.wc_status != IBT_WC_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_recvqp.qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_recvqp.qp_level--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_recvqp.qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* free the buffer */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_state = RDS_RCVBUF_FREE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_free_recv_buf(bp, 1);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Receive completion failure */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc.wc_status != IBT_WC_WR_FLUSHED_ERR) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_poll_data_completions",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) CQ(%p) BP(%p): WC Error Status: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, cq, wc.wc_id, wc.wc_status);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_INCR_RXERRS();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* there is one less in the RQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp = &ep->ep_recvqp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_level--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if ((recvqp->qp_taskqpending == B_FALSE) &&
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (recvqp->qp_level <= recvqp->qp_lwm)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Time to post more buffers into the RQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_TRUE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ddi_taskq_dispatch(rds_taskq,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_post_recv_buf, (void *)ep->ep_chanhdl, DDI_NOSLEEP);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != DDI_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2(LABEL, "ddi_taskq_dispatch failed: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri recvqp->qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&recvqp->qp_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri pktp = (rds_data_hdr_t *)(uintptr_t)bp->buf_ds.ds_va;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(pktp->dh_datalen != 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5(LABEL, "Message Received: sendIP: 0x%x recvIP: 0x%x "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "sendport: %d recvport: %d npkts: %d pktno: %d", ep->ep_remip,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_myip, pktp->dh_sendport, pktp->dh_recvport,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri pktp->dh_npkts, pktp->dh_psn);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF3(LABEL, "BP(%p): npkts: %d psn: %d", bp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri pktp->dh_npkts, pktp->dh_psn);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (pktp->dh_npkts == 1) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* single pkt or last packet */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (pktp->dh_psn != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* last packet of a segmented message */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(ep->ep_seglbp != NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_seglbp->buf_nextp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_seglbp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_received_msg(ep, ep->ep_segfbp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_segfbp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_seglbp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* single packet */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_received_msg(ep, bp);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* multi-pkt msg */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (pktp->dh_psn == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* first packet */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(ep->ep_segfbp == NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_segfbp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_seglbp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* intermediate packet */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(ep->ep_segfbp != NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_seglbp->buf_nextp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_seglbp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_poll_data_completions", "Return: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_recvcq_handler(ibt_cq_hdl_t cq, void *arg)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret = IBT_SUCCESS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int (*func)(ibt_cq_hdl_t, rds_ep_t *);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)arg;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_recvcq_handler", "enter: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_type == RDS_EP_TYPE_DATA) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri func = rds_poll_data_completions;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri func = rds_poll_ctrl_completions;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri do {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = func(cq, ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } while (ret != IBT_CQ_EMPTY);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* enable the CQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_enable_cq_notify(cq, rds_wc_signal);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p) CQ(%p): ibt_enable_cq_notify "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed: %d", ep, cq, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri do {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = func(cq, ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } while (ret != IBT_CQ_EMPTY);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_recvcq_handler", "Return: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_poll_send_completions(ibt_cq_hdl_t cq, rds_ep_t *ep, boolean_t lock)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_wc_t wc[RDS_NUM_DATA_SEND_WCS];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t npolled, nret, send_error = 0;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *headp, *tailp, *bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret, ix;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_poll_send_completions", "Enter EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri headp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri tailp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri npolled = 0;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri do {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_poll_cq(cq, wc, RDS_NUM_DATA_SEND_WCS, &nret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_CQ_EMPTY) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p) CQ(%p): "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "ibt_poll_cq returned: %d", ep, cq, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5(LABEL, "EP(%p) CQ(%p): "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "ibt_poll_cq returned: IBT_CQ_EMPTY",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, cq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri for (ix = 0; ix < nret; ix++) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc[ix].wc_status == IBT_WC_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc[ix].wc_type == IBT_WRC_RDMAW) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_send_acknowledgement(ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri continue;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = (rds_buf_t *)(uintptr_t)wc[ix].wc_id;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(bp->buf_state == RDS_SNDBUF_PENDING);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_state = RDS_SNDBUF_FREE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else if (wc[ix].wc_status == IBT_WC_WR_FLUSHED_ERR) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_INCR_TXERRS();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5("rds_poll_send_completions",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p): WC ID: %p ERROR: %d", ep,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wc[ix].wc_id, wc[ix].wc_status);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00d1d19828f3122eb24ae7a68175ba64744f8366Suhasini Peddada send_error = 1;
00d1d19828f3122eb24ae7a68175ba64744f8366Suhasini Peddada
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc[ix].wc_id == RDS_RDMAW_WRID) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_rdmacnt--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri continue;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = (rds_buf_t *)(uintptr_t)wc[ix].wc_id;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ASSERT(bp->buf_state == RDS_SNDBUF_PENDING);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri bp->buf_state = RDS_SNDBUF_FREE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_INCR_TXERRS();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_poll_send_completions",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p): WC ID: %p ERROR: %d", ep,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri wc[ix].wc_id, wc[ix].wc_status);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (send_error == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_session_t *sp = ep->ep_sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* don't let anyone send anymore */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_enter(&sp->session_lock, RW_WRITER);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (sp->session_state !=
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SESSION_STATE_ERROR) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_state =
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SESSION_STATE_ERROR;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Make this the active end */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri sp->session_type =
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SESSION_ACTIVE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00d1d19828f3122eb24ae7a68175ba64744f8366Suhasini Peddada send_error = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (wc[ix].wc_id == RDS_RDMAW_WRID) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_rdmacnt--;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri continue;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp = (rds_buf_t *)(uintptr_t)wc[ix].wc_id;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri ASSERT(bp->buf_state == RDS_SNDBUF_PENDING);
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri bp->buf_state = RDS_SNDBUF_FREE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bp->buf_nextp = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (headp) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri tailp->buf_nextp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri tailp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri headp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri tailp = bp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri npolled++;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_no_interrupts && (npolled > 100)) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_no_interrupts == 1) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } while (ret != IBT_CQ_EMPTY);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF5("rds_poll_send_completions", "Npolled: %d send_error: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri npolled, send_error);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* put the buffers to the pool */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (npolled != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_free_send_buf(ep, headp, tailp, npolled, lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (send_error != 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_handle_send_error(ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_poll_send_completions", "Return EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_sendcq_handler(ibt_cq_hdl_t cq, void *arg)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_ep_t *ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep = (rds_ep_t *)arg;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_sendcq_handler", "Enter: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* enable the CQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_enable_cq_notify(cq, IBT_NEXT_COMPLETION);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "EP(%p) CQ(%p): ibt_enable_cq_notify "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed: %d", ep, cq, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_poll_send_completions(cq, ep, B_FALSE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_sendcq_handler", "Return: EP(%p)", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_ep_free_rc_channel(rds_ep_t *ep)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_ep_free_rc_channel", "EP(%p) - Enter", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ASSERT(mutex_owned(&ep->ep_lock));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* free the QP */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_chanhdl != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* wait until the RQ is empty */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_flush_channel(ep->ep_chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) rds_is_recvq_empty(ep, B_TRUE);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_free_channel(ep->ep_chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("rds_ep_free_rc_channel", "EP(%p) "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "ibt_free_channel returned: %d", ep, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_chanhdl = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_ep_free_rc_channel",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) Channel is ALREADY FREE", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* free the Send CQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_sendcq != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_free_cq(ep->ep_sendcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("rds_ep_free_rc_channel",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) - for sendcq, ibt_free_cq returned %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_sendcq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_ep_free_rc_channel",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) SendCQ is ALREADY FREE", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* free the Recv CQ */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_recvcq != NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_free_cq(ep->ep_recvcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
7424242225ff3dee57fcc8963bf073b4ba0297fdagiri RDS_DPRINTF2("rds_ep_free_rc_channel",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) - for recvcq, ibt_free_cq returned %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_recvcq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_ep_free_rc_channel",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "EP(%p) RecvCQ is ALREADY FREE", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_ep_free_rc_channel", "EP(%p) - Return", ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Allocate resources for RC channel */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriibt_channel_hdl_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_ep_alloc_rc_channel(rds_ep_t *ep, uint8_t hca_port)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret = IBT_SUCCESS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_cq_attr_t scqattr, rcqattr;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_rc_chan_alloc_args_t chanargs;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_channel_hdl_t chanhdl;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rds_session_t *sp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_hca_t *hcap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_ep_alloc_rc_channel", "Enter: 0x%p port: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep, hca_port);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri /* Update the EP with the right IP address and HCA guid */
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri sp = ep->ep_sp;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri ASSERT(sp != NULL);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_enter(&sp->session_lock, RW_READER);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri mutex_enter(&ep->ep_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri ep->ep_myip = sp->session_myip;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri ep->ep_remip = sp->session_remip;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri hcap = rds_gid_to_hcap(rdsib_statep, sp->session_lgid);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri ep->ep_hca_guid = hcap->hca_guid;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri mutex_exit(&ep->ep_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri rw_exit(&sp->session_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* reset taskqpending flag here */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_recvqp.qp_taskqpending = B_FALSE;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_type == RDS_EP_TYPE_CTRL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri scqattr.cq_size = MaxCtrlSendBuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri scqattr.cq_sched = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri scqattr.cq_flags = IBT_CQ_NO_FLAGS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcqattr.cq_size = MaxCtrlRecvBuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcqattr.cq_sched = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcqattr.cq_flags = IBT_CQ_NO_FLAGS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_sq = MaxCtrlSendBuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_rq = MaxCtrlRecvBuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_sq_sgl = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_rq_sgl = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri } else {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri scqattr.cq_size = MaxDataSendBuffers + RDS_NUM_ACKS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri scqattr.cq_sched = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri scqattr.cq_flags = IBT_CQ_NO_FLAGS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcqattr.cq_size = MaxDataRecvBuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcqattr.cq_sched = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rcqattr.cq_flags = IBT_CQ_NO_FLAGS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_sq = MaxDataSendBuffers + RDS_NUM_ACKS;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_rq = MaxDataRecvBuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_sq_sgl = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_sizes.cs_rq_sgl = 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_enter(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_sendcq == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* returned size is always greater than the requested size */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_alloc_cq(hcap->hca_hdl, &scqattr,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri &ep->ep_sendcq, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ibt_alloc_cq for sendCQ "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed, size = %d: %d", scqattr.cq_size, ret);
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_set_cq_handler(ep->ep_sendcq, rds_sendcq_handler,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (rds_no_interrupts == 0) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_enable_cq_notify(ep->ep_sendcq,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBT_NEXT_COMPLETION);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "ibt_enable_cq_notify failed: %d", ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_cq(ep->ep_sendcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_sendcq = NULL;
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ep->ep_recvcq == NULL) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* returned size is always greater than the requested size */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_alloc_cq(hcap->hca_hdl, &rcqattr,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri &ep->ep_recvcq, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ibt_alloc_cq for recvCQ "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed, size = %d: %d", rcqattr.cq_size, ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_cq(ep->ep_sendcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_sendcq = NULL;
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_set_cq_handler(ep->ep_recvcq, rds_recvcq_handler,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_enable_cq_notify(ep->ep_recvcq, rds_wc_signal);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "ibt_enable_cq_notify failed: %d", ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_cq(ep->ep_recvcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_recvcq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_cq(ep->ep_sendcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_sendcq = NULL;
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_flags = IBT_ALL_SIGNALED;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_control = IBT_CEP_RDMA_RD | IBT_CEP_RDMA_WR |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBT_CEP_ATOMIC;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_hca_port_num = hca_port;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_scq = ep->ep_sendcq;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_rcq = ep->ep_recvcq;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_pd = hcap->hca_pdhdl;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri chanargs.rc_srq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_alloc_rc_channel(hcap->hca_hdl,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri IBT_ACHAN_NO_FLAGS, &chanargs, &chanhdl, NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ibt_alloc_rc_channel fail: %d",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_cq(ep->ep_recvcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_recvcq = NULL;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_free_cq(ep->ep_sendcq);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ep->ep_sendcq = NULL;
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (NULL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
5763ba1e357fad1d57b5875c499307b7ea6e2cd4agiri mutex_exit(&ep->ep_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /* Chan private should contain the ep */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (void) ibt_set_chan_private(chanhdl, ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_ep_alloc_rc_channel", "Return: 0x%p", chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (chanhdl);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if 0
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Return node guid given a port gid */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriib_guid_t
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_gid_to_node_guid(ib_gid_t gid)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_node_info_t nodeinfo;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_gid_to_node_guid", "Enter: gid: %llx:%llx",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri gid.gid_prefix, gid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_gid_to_node_info(gid, &nodeinfo);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ibt_gid_node_info for gid: %llx:%llx "
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri "failed", gid.gid_prefix, gid.gid_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (0LL);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF4("rds_gid_to_node_guid", "Return: Node guid: %llx",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri nodeinfo.n_node_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return (nodeinfo.n_node_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic void
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_handle_portup_event(rds_state_t *statep, ibt_hca_hdl_t hdl,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_async_event_t *event)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_hca_t *hcap;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_hca_portinfo_t *newpinfop, *oldpinfop;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t newsize, oldsize, nport;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ib_gid_t gid;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int ret;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri RDS_DPRINTF2("rds_handle_portup_event",
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri "Enter: GUID: 0x%llx Statep: %p", event->ev_hca_guid, statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&statep->rds_hca_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = statep->rds_hcalistp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala while ((hcap != NULL) && (hcap->hca_guid != event->ev_hca_guid)) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = hcap->hca_nextp;
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri }
d99cb22f7f0de8584336bda08cb86c562ffbab55agiri
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri if (hcap == NULL) {
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri RDS_DPRINTF2("rds_handle_portup_event", "HCA: 0x%llx is "
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri "not in our list", event->ev_hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri return;
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ret = ibt_query_hca_ports(hdl, 0, &newpinfop, &nport, &newsize);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri if (ret != IBT_SUCCESS) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "ibt_query_hca_ports failed: %d", ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri oldpinfop = hcap->hca_pinfop;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri oldsize = hcap->hca_pinfo_sz;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap->hca_pinfop = newpinfop;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri hcap->hca_pinfo_sz = newsize;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) ibt_free_portinfo(oldpinfop, oldsize);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* If RDS service is not registered then no bind is needed */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (statep->rds_srvhdl == NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rds_handle_portup_event",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "RDS Service is not registered, so no action needed");
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * If the service was previously bound on this port and
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * if this port has changed state down and now up, we do not
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * need to bind the service again. The bind is expected to
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * persist across state changes. If the service was never bound
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * before then we bind it this time.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap->hca_bindhdl[event->ev_port - 1] == NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* structure copy */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala gid = newpinfop[event->ev_port - 1].p_sgid_tbl[0];
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* bind RDS service on the port, pass statep as cm_private */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_bind_service(statep->rds_srvhdl, gid, NULL, statep,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala &hcap->hca_bindhdl[event->ev_port - 1]);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rds_handle_portup_event",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "Bind service for HCA: 0x%llx Port: %d "
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "gid %llx:%llx returned: %d", event->ev_hca_guid,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala event->ev_port, gid.gid_prefix, gid.gid_guid, ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_handle_portup_event", "Return: GUID: 0x%llx",
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri event->ev_hca_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalastatic void
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalardsib_add_hca(ib_guid_t hca_guid)
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala{
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_hca_t *hcap;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ibt_mr_attr_t mem_attr;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ibt_mr_desc_t mem_desc;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala int ret;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_add_hca", "Enter: GUID: 0x%llx", hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = rdsib_init_hca(hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap == NULL)
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* register the recv memory with this hca */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mutex_enter(&rds_dpool.pool_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (rds_dpool.pool_memp == NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* no memory to register */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_add_hca", "No memory to register");
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mutex_exit(&rds_dpool.pool_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mem_attr.mr_vaddr = (ib_vaddr_t)(uintptr_t)rds_dpool.pool_memp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mem_attr.mr_len = rds_dpool.pool_memsize;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mem_attr.mr_as = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mem_attr.mr_flags = IBT_MR_ENABLE_LOCAL_WRITE;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_register_mr(hcap->hca_hdl, hcap->hca_pdhdl, &mem_attr,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala &hcap->hca_mrhdl, &mem_desc);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala mutex_exit(&rds_dpool.pool_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_add_hca", "ibt_register_mr failed: %d",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala } else {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&rdsib_statep->rds_hca_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_state = RDS_HCA_STATE_MEM_REGISTERED;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_lkey = mem_desc.md_lkey;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_rkey = mem_desc.md_rkey;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&rdsib_statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_add_hca", "Retrun: GUID: 0x%llx", hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala}
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalavoid rds_close_this_session(rds_session_t *sp, uint8_t wait);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalaint rds_post_control_message(rds_session_t *sp, uint8_t code, in_port_t port);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalastatic void
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummalardsib_del_hca(rds_state_t *statep, ib_guid_t hca_guid)
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala{
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_session_t *sp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_hca_t *hcap;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_hca_state_t saved_state;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala int ret, ix;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca", "Enter: GUID: 0x%llx", hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * This should be a write lock as we don't want anyone to get access
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * to the hcap while we are modifing its contents
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&statep->rds_hca_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = statep->rds_hcalistp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala while ((hcap != NULL) && (hcap->hca_guid != hca_guid)) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap = hcap->hca_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* Prevent initiating any new activity on this HCA */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(hcap != NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala saved_state = hcap->hca_state;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_state = RDS_HCA_STATE_STOPPING;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * stop the outgoing traffic and close any active sessions on this hca.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * Any pending messages in the SQ will be allowed to complete.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&statep->rds_sessionlock, RW_READER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp = statep->rds_sessionlistp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala while (sp) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (sp->session_hca_guid != hca_guid) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp = sp->session_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala continue;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&sp->session_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca", "SP(%p) State: %d", sp,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp->session_state);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * We are changing the session state in advance. This prevents
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * further messages to be posted to the SQ. We then
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * send a control message to the remote and tell it close
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * the session.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp->session_state = RDS_SESSION_STATE_HCA_CLOSING;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF3("rds_handle_cm_conn_closed", "SP(%p) State "
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "RDS_SESSION_STATE_PASSIVE_CLOSING", sp);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&sp->session_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * wait until the sendq is empty then tell the remote to
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * close this session. This enables for graceful shutdown of
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * the session
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) rds_is_sendq_empty(&sp->session_dataep, 2);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) rds_post_control_message(sp,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_CTRL_CODE_CLOSE_SESSION, 0);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp = sp->session_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* wait until all the sessions are off this HCA */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp = statep->rds_sessionlistp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala while (sp) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (sp->session_hca_guid != hca_guid) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp = sp->session_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala continue;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&sp->session_lock, RW_READER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca", "SP(%p) State: %d", sp,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp->session_state);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala while ((sp->session_state == RDS_SESSION_STATE_HCA_CLOSING) ||
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (sp->session_state == RDS_SESSION_STATE_ERROR) ||
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (sp->session_state == RDS_SESSION_STATE_PASSIVE_CLOSING) ||
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (sp->session_state == RDS_SESSION_STATE_CLOSED)) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&sp->session_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala delay(drv_usectohz(1000000));
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&sp->session_lock, RW_READER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca", "SP(%p) State: %d", sp,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp->session_state);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&sp->session_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala sp = sp->session_nextp;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_sessionlock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * if rdsib_close_ib was called before this, then that would have
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * unbound the service on all ports. In that case, the HCA structs
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * will contain stale bindhdls. Hence, we do not call unbind unless
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * the service is still registered.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (statep->rds_srvhdl != NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* unbind RDS service on all ports on this HCA */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala for (ix = 0; ix < hcap->hca_nports; ix++) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (hcap->hca_bindhdl[ix] == NULL) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala continue;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "Unbinding Service: port: %d, bindhdl: %p",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ix + 1, hcap->hca_bindhdl[ix]);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) ibt_unbind_service(rdsib_statep->rds_srvhdl,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_bindhdl[ix]);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_bindhdl[ix] = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca", "HCA(%p) State: %d", hcap,
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_state);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala switch (saved_state) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala case RDS_HCA_STATE_MEM_REGISTERED:
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(hcap->hca_mrhdl != NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_deregister_mr(hcap->hca_hdl, hcap->hca_mrhdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "ibt_deregister_mr failed: %d", ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala return;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_mrhdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /* FALLTHRU */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala case RDS_HCA_STATE_OPEN:
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(hcap->hca_hdl != NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ASSERT(hcap->hca_pdhdl != NULL);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_free_pd(hcap->hca_hdl, hcap->hca_pdhdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "ibt_free_pd failed: %d", ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) ibt_free_portinfo(hcap->hca_pinfop, hcap->hca_pinfo_sz);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala ret = ibt_close_hca(hcap->hca_hdl);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala if (ret != IBT_SUCCESS) {
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca",
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala "ibt_close_hca failed: %d", ret);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_hdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_pdhdl = NULL;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_lkey = 0;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_rkey = 0;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala }
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * This should be a write lock as we don't want anyone to get access
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * to the hcap while we are modifing its contents
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_enter(&statep->rds_hca_lock, RW_WRITER);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala hcap->hca_state = RDS_HCA_STATE_REMOVED;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rw_exit(&statep->rds_hca_lock);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala RDS_DPRINTF2("rdsib_del_hca", "Return: GUID: 0x%llx", hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala}
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiristatic void
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_async_handler(void *clntp, ibt_hca_hdl_t hdl, ibt_async_code_t code,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_async_event_t *event)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala rds_state_t *statep = (rds_state_t *)clntp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_async_handler", "Async code: %d", code);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri switch (code) {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri case IBT_EVENT_PORT_UP:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_handle_portup_event(statep, hdl, event);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri break;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala case IBT_HCA_ATTACH_EVENT:
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala /*
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * NOTE: In some error recovery paths, it is possible to
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala * receive IBT_HCA_ATTACH_EVENTs on already known HCAs.
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) rdsib_add_hca(event->ev_hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala break;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala case IBT_HCA_DETACH_EVENT:
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala (void) rdsib_del_hca(statep, event->ev_hca_guid);
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala break;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri default:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2(LABEL, "Async event: %d not handled", code);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_DPRINTF2("rds_async_handler", "Return: code: %d", code);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri/*
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * This routine exists to minimize stale connections across ungraceful
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri * reboots of nodes in a cluster.
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri */
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agirivoid
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agirirds_randomize_qps(rds_hca_t *hcap)
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri{
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ibt_cq_attr_t cqattr;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ibt_rc_chan_alloc_args_t chanargs;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ibt_channel_hdl_t qp1, qp2;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ibt_cq_hdl_t cq_hdl;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri hrtime_t nsec;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri uint8_t i, j, rand1, rand2;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri int ret;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri bzero(&cqattr, sizeof (ibt_cq_attr_t));
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri cqattr.cq_size = 1;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri cqattr.cq_sched = NULL;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri cqattr.cq_flags = IBT_CQ_NO_FLAGS;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri ret = ibt_alloc_cq(hcap->hca_hdl, &cqattr, &cq_hdl, NULL);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if (ret != IBT_SUCCESS) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_DPRINTF2("rds_randomize_qps",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri "ibt_alloc_cq failed: %d", ret);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri return;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri bzero(&chanargs, sizeof (ibt_rc_chan_alloc_args_t));
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_flags = IBT_ALL_SIGNALED;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_control = IBT_CEP_RDMA_RD | IBT_CEP_RDMA_WR |
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri IBT_CEP_ATOMIC;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_hca_port_num = 1;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_scq = cq_hdl;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_rcq = cq_hdl;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_pd = hcap->hca_pdhdl;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri chanargs.rc_srq = NULL;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri nsec = gethrtime();
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rand1 = (nsec & 0xF);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rand2 = (nsec >> 4) & 0xF;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_DPRINTF2("rds_randomize_qps", "rand1: %d rand2: %d",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri rand1, rand2);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri for (i = 0; i < rand1 + 3; i++) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if (ibt_alloc_rc_channel(hcap->hca_hdl,
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri IBT_ACHAN_NO_FLAGS, &chanargs, &qp1, NULL) !=
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri IBT_SUCCESS) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_DPRINTF2("rds_randomize_qps",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri "Bailing at i: %d", i);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) ibt_free_cq(cq_hdl);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri return;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri for (j = 0; j < rand2 + 3; j++) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri if (ibt_alloc_rc_channel(hcap->hca_hdl,
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri IBT_ACHAN_NO_FLAGS, &chanargs, &qp2,
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri NULL) != IBT_SUCCESS) {
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri RDS_DPRINTF2("rds_randomize_qps",
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri "Bailing at i: %d j: %d", i, j);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) ibt_free_channel(qp1);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) ibt_free_cq(cq_hdl);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri return;
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) ibt_free_channel(qp2);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) ibt_free_channel(qp1);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri }
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri (void) ibt_free_cq(cq_hdl);
0c19630b1592aa30d3e4d9db1a2a8cf9a91c0e72agiri}