linux/include/linux/sunrpc/svc_rdma.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
   2/*
   3 * Copyright (c) 2005-2006 Network Appliance, Inc. All rights reserved.
   4 *
   5 * This software is available to you under a choice of one of two
   6 * licenses.  You may choose to be licensed under the terms of the GNU
   7 * General Public License (GPL) Version 2, available from the file
   8 * COPYING in the main directory of this source tree, or the BSD-type
   9 * license below:
  10 *
  11 * Redistribution and use in source and binary forms, with or without
  12 * modification, are permitted provided that the following conditions
  13 * are met:
  14 *
  15 *      Redistributions of source code must retain the above copyright
  16 *      notice, this list of conditions and the following disclaimer.
  17 *
  18 *      Redistributions in binary form must reproduce the above
  19 *      copyright notice, this list of conditions and the following
  20 *      disclaimer in the documentation and/or other materials provided
  21 *      with the distribution.
  22 *
  23 *      Neither the name of the Network Appliance, Inc. nor the names of
  24 *      its contributors may be used to endorse or promote products
  25 *      derived from this software without specific prior written
  26 *      permission.
  27 *
  28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  39 *
  40 * Author: Tom Tucker <tom@opengridcomputing.com>
  41 */
  42
  43#ifndef SVC_RDMA_H
  44#define SVC_RDMA_H
  45#include <linux/llist.h>
  46#include <linux/sunrpc/xdr.h>
  47#include <linux/sunrpc/svcsock.h>
  48#include <linux/sunrpc/rpc_rdma.h>
  49#include <linux/sunrpc/rpc_rdma_cid.h>
  50#include <linux/sunrpc/svc_rdma_pcl.h>
  51
  52#include <linux/percpu_counter.h>
  53#include <rdma/ib_verbs.h>
  54#include <rdma/rdma_cm.h>
  55
  56/* Default and maximum inline threshold sizes */
  57enum {
  58        RPCRDMA_PULLUP_THRESH = RPCRDMA_V1_DEF_INLINE_SIZE >> 1,
  59        RPCRDMA_DEF_INLINE_THRESH = 4096,
  60        RPCRDMA_MAX_INLINE_THRESH = 65536
  61};
  62
  63/* RPC/RDMA parameters and stats */
  64extern unsigned int svcrdma_ord;
  65extern unsigned int svcrdma_max_requests;
  66extern unsigned int svcrdma_max_bc_requests;
  67extern unsigned int svcrdma_max_req_size;
  68
  69extern struct percpu_counter svcrdma_stat_read;
  70extern struct percpu_counter svcrdma_stat_recv;
  71extern struct percpu_counter svcrdma_stat_sq_starve;
  72extern struct percpu_counter svcrdma_stat_write;
  73
  74struct svcxprt_rdma {
  75        struct svc_xprt      sc_xprt;           /* SVC transport structure */
  76        struct rdma_cm_id    *sc_cm_id;         /* RDMA connection id */
  77        struct list_head     sc_accept_q;       /* Conn. waiting accept */
  78        int                  sc_ord;            /* RDMA read limit */
  79        int                  sc_max_send_sges;
  80        bool                 sc_snd_w_inv;      /* OK to use Send With Invalidate */
  81
  82        atomic_t             sc_sq_avail;       /* SQEs ready to be consumed */
  83        unsigned int         sc_sq_depth;       /* Depth of SQ */
  84        __be32               sc_fc_credits;     /* Forward credits */
  85        u32                  sc_max_requests;   /* Max requests */
  86        u32                  sc_max_bc_requests;/* Backward credits */
  87        int                  sc_max_req_size;   /* Size of each RQ WR buf */
  88        u8                   sc_port_num;
  89
  90        struct ib_pd         *sc_pd;
  91
  92        spinlock_t           sc_send_lock;
  93        struct llist_head    sc_send_ctxts;
  94        spinlock_t           sc_rw_ctxt_lock;
  95        struct llist_head    sc_rw_ctxts;
  96
  97        u32                  sc_pending_recvs;
  98        u32                  sc_recv_batch;
  99        struct list_head     sc_rq_dto_q;
 100        spinlock_t           sc_rq_dto_lock;
 101        struct ib_qp         *sc_qp;
 102        struct ib_cq         *sc_rq_cq;
 103        struct ib_cq         *sc_sq_cq;
 104
 105        spinlock_t           sc_lock;           /* transport lock */
 106
 107        wait_queue_head_t    sc_send_wait;      /* SQ exhaustion waitlist */
 108        unsigned long        sc_flags;
 109        struct work_struct   sc_work;
 110
 111        struct llist_head    sc_recv_ctxts;
 112
 113        atomic_t             sc_completion_ids;
 114};
 115/* sc_flags */
 116#define RDMAXPRT_CONN_PENDING   3
 117
 118/*
 119 * Default connection parameters
 120 */
 121enum {
 122        RPCRDMA_LISTEN_BACKLOG  = 10,
 123        RPCRDMA_MAX_REQUESTS    = 64,
 124        RPCRDMA_MAX_BC_REQUESTS = 2,
 125};
 126
 127#define RPCSVC_MAXPAYLOAD_RDMA  RPCSVC_MAXPAYLOAD
 128
 129struct svc_rdma_recv_ctxt {
 130        struct llist_node       rc_node;
 131        struct list_head        rc_list;
 132        struct ib_recv_wr       rc_recv_wr;
 133        struct ib_cqe           rc_cqe;
 134        struct rpc_rdma_cid     rc_cid;
 135        struct ib_sge           rc_recv_sge;
 136        void                    *rc_recv_buf;
 137        struct xdr_stream       rc_stream;
 138        bool                    rc_temp;
 139        u32                     rc_byte_len;
 140        unsigned int            rc_page_count;
 141        u32                     rc_inv_rkey;
 142        __be32                  rc_msgtype;
 143
 144        struct svc_rdma_pcl     rc_call_pcl;
 145
 146        struct svc_rdma_pcl     rc_read_pcl;
 147        struct svc_rdma_chunk   *rc_cur_result_payload;
 148        struct svc_rdma_pcl     rc_write_pcl;
 149        struct svc_rdma_pcl     rc_reply_pcl;
 150};
 151
 152struct svc_rdma_send_ctxt {
 153        struct llist_node       sc_node;
 154        struct rpc_rdma_cid     sc_cid;
 155
 156        struct ib_send_wr       sc_send_wr;
 157        struct ib_cqe           sc_cqe;
 158        struct completion       sc_done;
 159        struct xdr_buf          sc_hdrbuf;
 160        struct xdr_stream       sc_stream;
 161        void                    *sc_xprt_buf;
 162        int                     sc_cur_sge_no;
 163
 164        struct ib_sge           sc_sges[];
 165};
 166
 167/* svc_rdma_backchannel.c */
 168extern void svc_rdma_handle_bc_reply(struct svc_rqst *rqstp,
 169                                     struct svc_rdma_recv_ctxt *rctxt);
 170
 171/* svc_rdma_recvfrom.c */
 172extern void svc_rdma_recv_ctxts_destroy(struct svcxprt_rdma *rdma);
 173extern bool svc_rdma_post_recvs(struct svcxprt_rdma *rdma);
 174extern struct svc_rdma_recv_ctxt *
 175                svc_rdma_recv_ctxt_get(struct svcxprt_rdma *rdma);
 176extern void svc_rdma_recv_ctxt_put(struct svcxprt_rdma *rdma,
 177                                   struct svc_rdma_recv_ctxt *ctxt);
 178extern void svc_rdma_flush_recv_queues(struct svcxprt_rdma *rdma);
 179extern void svc_rdma_release_rqst(struct svc_rqst *rqstp);
 180extern int svc_rdma_recvfrom(struct svc_rqst *);
 181
 182/* svc_rdma_rw.c */
 183extern void svc_rdma_destroy_rw_ctxts(struct svcxprt_rdma *rdma);
 184extern int svc_rdma_send_write_chunk(struct svcxprt_rdma *rdma,
 185                                     const struct svc_rdma_chunk *chunk,
 186                                     const struct xdr_buf *xdr);
 187extern int svc_rdma_send_reply_chunk(struct svcxprt_rdma *rdma,
 188                                     const struct svc_rdma_recv_ctxt *rctxt,
 189                                     const struct xdr_buf *xdr);
 190extern int svc_rdma_process_read_list(struct svcxprt_rdma *rdma,
 191                                      struct svc_rqst *rqstp,
 192                                      struct svc_rdma_recv_ctxt *head);
 193
 194/* svc_rdma_sendto.c */
 195extern void svc_rdma_send_ctxts_destroy(struct svcxprt_rdma *rdma);
 196extern struct svc_rdma_send_ctxt *
 197                svc_rdma_send_ctxt_get(struct svcxprt_rdma *rdma);
 198extern void svc_rdma_send_ctxt_put(struct svcxprt_rdma *rdma,
 199                                   struct svc_rdma_send_ctxt *ctxt);
 200extern int svc_rdma_send(struct svcxprt_rdma *rdma,
 201                         struct svc_rdma_send_ctxt *ctxt);
 202extern int svc_rdma_map_reply_msg(struct svcxprt_rdma *rdma,
 203                                  struct svc_rdma_send_ctxt *sctxt,
 204                                  const struct svc_rdma_recv_ctxt *rctxt,
 205                                  const struct xdr_buf *xdr);
 206extern void svc_rdma_send_error_msg(struct svcxprt_rdma *rdma,
 207                                    struct svc_rdma_send_ctxt *sctxt,
 208                                    struct svc_rdma_recv_ctxt *rctxt,
 209                                    int status);
 210extern void svc_rdma_wake_send_waiters(struct svcxprt_rdma *rdma, int avail);
 211extern int svc_rdma_sendto(struct svc_rqst *);
 212extern int svc_rdma_result_payload(struct svc_rqst *rqstp, unsigned int offset,
 213                                   unsigned int length);
 214
 215/* svc_rdma_transport.c */
 216extern struct svc_xprt_class svc_rdma_class;
 217#ifdef CONFIG_SUNRPC_BACKCHANNEL
 218extern struct svc_xprt_class svc_rdma_bc_class;
 219#endif
 220
 221/* svc_rdma.c */
 222extern int svc_rdma_init(void);
 223extern void svc_rdma_cleanup(void);
 224
 225#endif
 226