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/*
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Use is subject to license terms.
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#ifndef _RDSIB_BUF_H
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#define _RDSIB_BUF_H
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#pragma ident "%Z%%M% %I% %E% SMI"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#ifdef __cplusplus
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriextern "C" {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiritypedef enum rds_sendbuf_state_s {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SNDBUF_FREE = 0,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SNDBUF_PENDING = 1,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_SNDBUF_ERROR = 2
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri} rds_sendbuf_state_t;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Receive buffer states */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiritypedef enum rds_recvbuf_state_s {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_RCVBUF_FREE = 0,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_RCVBUF_POSTED = 1,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri RDS_RCVBUF_ONSOCKQ = 2
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri} rds_recvbuf_state_t;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * RDS Buffer
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * nextp - Ptr to the next buffer
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ep - Endpoint that is using this buffer
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * ds - Data segment for SGL
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * state - rds_sendbuf_state for send buffers and rds_recvbuf_state for
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * receive buffers.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * frtn - Message freeing routine, for use by esballoc(9F), only used
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * by receive buffers
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiritypedef struct rds_buf_s {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_buf_s *buf_nextp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri struct rds_ep_s *buf_ep;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ibt_wr_ds_t buf_ds;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint8_t buf_state;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri frtn_t buf_frtn;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri} rds_buf_t;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * RDS Buffer pool
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * lock - Synchronize access
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * nbuffers - SQ depth for send buffer pool and RQ depth for receive buffer
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * pool
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * nbusy - Number of buffers in the SQ or RQ
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * nfree - Number of buffers in the pool(between headp and tailp).
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * headp - First available buffer
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * tailp - Last available buffer
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * memp - pointer to the memory allocated for the buffer pool,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * valid only for send pools.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * memsize - size of the memory allocated (valid for send pools only).
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * cv - condition variable to wait for buffers
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * cv_count - Number of buffers that are being waited on.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * sqpoll_pending - Flag to indicate that sendCQ handler is running.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * cv, cv_count and sqpoll_pending are only used when 'rds_no_interrupts'
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * is set.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiritypedef struct rds_bufpool_s {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kmutex_t pool_lock;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint32_t pool_nbuffers;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint32_t pool_nbusy;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint32_t pool_nfree;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *pool_headp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *pool_tailp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint8_t *pool_memp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t pool_memsize;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *pool_bufmemp;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri kcondvar_t pool_cv;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint_t pool_cv_count;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri boolean_t pool_sqpoll_pending;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri} rds_bufpool_t;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* Global pools of buffers */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_bufpool_t rds_dpool; /* data pool */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_bufpool_t rds_cpool; /* ctrl pool */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/* defined in rds_buf.c */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint rds_init_recv_caches(rds_state_t *statep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid rds_free_recv_caches(rds_state_t *statep);
8257fab973a69800a3a3309e8af21fc1876d2df9agiriint rds_init_send_pool(struct rds_ep_s *ep, ib_guid_t hca_guid);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiriint rds_reinit_send_pool(struct rds_ep_s *ep, ib_guid_t hca_guid);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid rds_free_send_pool(struct rds_ep_s *ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriint rds_init_recv_pool(struct rds_ep_s *ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid rds_free_recv_pool(struct rds_ep_s *ep);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid rds_free_buf(rds_bufpool_t *pool, rds_buf_t *bp, uint_t nbuf);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_buf_t *rds_get_buf(rds_bufpool_t *pool, uint_t nbuf, uint_t *nret);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirirds_buf_t *rds_get_send_buf(struct rds_ep_s *ep, uint_t nbufs);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid rds_free_send_buf(struct rds_ep_s *ep, rds_buf_t *headp,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri rds_buf_t *tailp, uint_t nbuf, boolean_t lock);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirivoid rds_free_recv_buf(rds_buf_t *bp, uint_t nbuf);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriboolean_t rds_is_sendq_empty(struct rds_ep_s *ep, uint_t);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriboolean_t rds_is_recvq_empty(struct rds_ep_s *ep, boolean_t);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#ifdef __cplusplus
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri}
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif /* _RDSIB_BUF_H */