linux/net/sunrpc/xprtrdma/xprt_rdma.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause */
   2/*
   3 * Copyright (c) 2014-2017 Oracle.  All rights reserved.
   4 * Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved.
   5 *
   6 * This software is available to you under a choice of one of two
   7 * licenses.  You may choose to be licensed under the terms of the GNU
   8 * General Public License (GPL) Version 2, available from the file
   9 * COPYING in the main directory of this source tree, or the BSD-type
  10 * license below:
  11 *
  12 * Redistribution and use in source and binary forms, with or without
  13 * modification, are permitted provided that the following conditions
  14 * are met:
  15 *
  16 *      Redistributions of source code must retain the above copyright
  17 *      notice, this list of conditions and the following disclaimer.
  18 *
  19 *      Redistributions in binary form must reproduce the above
  20 *      copyright notice, this list of conditions and the following
  21 *      disclaimer in the documentation and/or other materials provided
  22 *      with the distribution.
  23 *
  24 *      Neither the name of the Network Appliance, Inc. nor the names of
  25 *      its contributors may be used to endorse or promote products
  26 *      derived from this software without specific prior written
  27 *      permission.
  28 *
  29 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  30 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  31 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  32 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  33 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  34 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  35 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  36 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  37 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  38 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  39 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  40 */
  41
  42#ifndef _LINUX_SUNRPC_XPRT_RDMA_H
  43#define _LINUX_SUNRPC_XPRT_RDMA_H
  44
  45#include <linux/wait.h>                 /* wait_queue_head_t, etc */
  46#include <linux/spinlock.h>             /* spinlock_t, etc */
  47#include <linux/atomic.h>               /* atomic_t, etc */
  48#include <linux/kref.h>                 /* struct kref */
  49#include <linux/workqueue.h>            /* struct work_struct */
  50#include <linux/llist.h>
  51
  52#include <rdma/rdma_cm.h>               /* RDMA connection api */
  53#include <rdma/ib_verbs.h>              /* RDMA verbs api */
  54
  55#include <linux/sunrpc/clnt.h>          /* rpc_xprt */
  56#include <linux/sunrpc/rpc_rdma_cid.h>  /* completion IDs */
  57#include <linux/sunrpc/rpc_rdma.h>      /* RPC/RDMA protocol */
  58#include <linux/sunrpc/xprtrdma.h>      /* xprt parameters */
  59
  60#define RDMA_RESOLVE_TIMEOUT    (5000)  /* 5 seconds */
  61#define RDMA_CONNECT_RETRY_MAX  (2)     /* retries if no listener backlog */
  62
  63#define RPCRDMA_BIND_TO         (60U * HZ)
  64#define RPCRDMA_INIT_REEST_TO   (5U * HZ)
  65#define RPCRDMA_MAX_REEST_TO    (30U * HZ)
  66#define RPCRDMA_IDLE_DISC_TO    (5U * 60 * HZ)
  67
  68/*
  69 * RDMA Endpoint -- connection endpoint details
  70 */
  71struct rpcrdma_ep {
  72        struct kref             re_kref;
  73        struct rdma_cm_id       *re_id;
  74        struct ib_pd            *re_pd;
  75        unsigned int            re_max_rdma_segs;
  76        unsigned int            re_max_fr_depth;
  77        bool                    re_implicit_roundup;
  78        enum ib_mr_type         re_mrtype;
  79        struct completion       re_done;
  80        unsigned int            re_send_count;
  81        unsigned int            re_send_batch;
  82        unsigned int            re_max_inline_send;
  83        unsigned int            re_max_inline_recv;
  84        int                     re_async_rc;
  85        int                     re_connect_status;
  86        atomic_t                re_receiving;
  87        atomic_t                re_force_disconnect;
  88        struct ib_qp_init_attr  re_attr;
  89        wait_queue_head_t       re_connect_wait;
  90        struct rpc_xprt         *re_xprt;
  91        struct rpcrdma_connect_private
  92                                re_cm_private;
  93        struct rdma_conn_param  re_remote_cma;
  94        int                     re_receive_count;
  95        unsigned int            re_max_requests; /* depends on device */
  96        unsigned int            re_inline_send; /* negotiated */
  97        unsigned int            re_inline_recv; /* negotiated */
  98
  99        atomic_t                re_completion_ids;
 100};
 101
 102/* Pre-allocate extra Work Requests for handling reverse-direction
 103 * Receives and Sends. This is a fixed value because the Work Queues
 104 * are allocated when the forward channel is set up, long before the
 105 * backchannel is provisioned. This value is two times
 106 * NFS4_DEF_CB_SLOT_TABLE_SIZE.
 107 */
 108#if defined(CONFIG_SUNRPC_BACKCHANNEL)
 109#define RPCRDMA_BACKWARD_WRS (32)
 110#else
 111#define RPCRDMA_BACKWARD_WRS (0)
 112#endif
 113
 114/* Registered buffer -- registered kmalloc'd memory for RDMA SEND/RECV
 115 */
 116
 117struct rpcrdma_regbuf {
 118        struct ib_sge           rg_iov;
 119        struct ib_device        *rg_device;
 120        enum dma_data_direction rg_direction;
 121        void                    *rg_data;
 122};
 123
 124static inline u64 rdmab_addr(struct rpcrdma_regbuf *rb)
 125{
 126        return rb->rg_iov.addr;
 127}
 128
 129static inline u32 rdmab_length(struct rpcrdma_regbuf *rb)
 130{
 131        return rb->rg_iov.length;
 132}
 133
 134static inline u32 rdmab_lkey(struct rpcrdma_regbuf *rb)
 135{
 136        return rb->rg_iov.lkey;
 137}
 138
 139static inline struct ib_device *rdmab_device(struct rpcrdma_regbuf *rb)
 140{
 141        return rb->rg_device;
 142}
 143
 144static inline void *rdmab_data(const struct rpcrdma_regbuf *rb)
 145{
 146        return rb->rg_data;
 147}
 148
 149#define RPCRDMA_DEF_GFP         (GFP_NOIO | __GFP_NOWARN)
 150
 151/* To ensure a transport can always make forward progress,
 152 * the number of RDMA segments allowed in header chunk lists
 153 * is capped at 16. This prevents less-capable devices from
 154 * overrunning the Send buffer while building chunk lists.
 155 *
 156 * Elements of the Read list take up more room than the
 157 * Write list or Reply chunk. 16 read segments means the
 158 * chunk lists cannot consume more than
 159 *
 160 * ((16 + 2) * read segment size) + 1 XDR words,
 161 *
 162 * or about 400 bytes. The fixed part of the header is
 163 * another 24 bytes. Thus when the inline threshold is
 164 * 1024 bytes, at least 600 bytes are available for RPC
 165 * message bodies.
 166 */
 167enum {
 168        RPCRDMA_MAX_HDR_SEGS = 16,
 169};
 170
 171/*
 172 * struct rpcrdma_rep -- this structure encapsulates state required
 173 * to receive and complete an RPC Reply, asychronously. It needs
 174 * several pieces of state:
 175 *
 176 *   o receive buffer and ib_sge (donated to provider)
 177 *   o status of receive (success or not, length, inv rkey)
 178 *   o bookkeeping state to get run by reply handler (XDR stream)
 179 *
 180 * These structures are allocated during transport initialization.
 181 * N of these are associated with a transport instance, managed by
 182 * struct rpcrdma_buffer. N is the max number of outstanding RPCs.
 183 */
 184
 185struct rpcrdma_rep {
 186        struct ib_cqe           rr_cqe;
 187        struct rpc_rdma_cid     rr_cid;
 188
 189        __be32                  rr_xid;
 190        __be32                  rr_vers;
 191        __be32                  rr_proc;
 192        int                     rr_wc_flags;
 193        u32                     rr_inv_rkey;
 194        bool                    rr_temp;
 195        struct rpcrdma_regbuf   *rr_rdmabuf;
 196        struct rpcrdma_xprt     *rr_rxprt;
 197        struct rpc_rqst         *rr_rqst;
 198        struct xdr_buf          rr_hdrbuf;
 199        struct xdr_stream       rr_stream;
 200        struct llist_node       rr_node;
 201        struct ib_recv_wr       rr_recv_wr;
 202        struct list_head        rr_all;
 203};
 204
 205/* To reduce the rate at which a transport invokes ib_post_recv
 206 * (and thus the hardware doorbell rate), xprtrdma posts Receive
 207 * WRs in batches.
 208 *
 209 * Setting this to zero disables Receive post batching.
 210 */
 211enum {
 212        RPCRDMA_MAX_RECV_BATCH = 7,
 213};
 214
 215/* struct rpcrdma_sendctx - DMA mapped SGEs to unmap after Send completes
 216 */
 217struct rpcrdma_req;
 218struct rpcrdma_sendctx {
 219        struct ib_cqe           sc_cqe;
 220        struct rpc_rdma_cid     sc_cid;
 221        struct rpcrdma_req      *sc_req;
 222        unsigned int            sc_unmap_count;
 223        struct ib_sge           sc_sges[];
 224};
 225
 226/*
 227 * struct rpcrdma_mr - external memory region metadata
 228 *
 229 * An external memory region is any buffer or page that is registered
 230 * on the fly (ie, not pre-registered).
 231 */
 232struct rpcrdma_req;
 233struct rpcrdma_mr {
 234        struct list_head        mr_list;
 235        struct rpcrdma_req      *mr_req;
 236
 237        struct ib_mr            *mr_ibmr;
 238        struct ib_device        *mr_device;
 239        struct scatterlist      *mr_sg;
 240        int                     mr_nents;
 241        enum dma_data_direction mr_dir;
 242        struct ib_cqe           mr_cqe;
 243        struct completion       mr_linv_done;
 244        union {
 245                struct ib_reg_wr        mr_regwr;
 246                struct ib_send_wr       mr_invwr;
 247        };
 248        struct rpcrdma_xprt     *mr_xprt;
 249        u32                     mr_handle;
 250        u32                     mr_length;
 251        u64                     mr_offset;
 252        struct list_head        mr_all;
 253        struct rpc_rdma_cid     mr_cid;
 254};
 255
 256/*
 257 * struct rpcrdma_req -- structure central to the request/reply sequence.
 258 *
 259 * N of these are associated with a transport instance, and stored in
 260 * struct rpcrdma_buffer. N is the max number of outstanding requests.
 261 *
 262 * It includes pre-registered buffer memory for send AND recv.
 263 * The recv buffer, however, is not owned by this structure, and
 264 * is "donated" to the hardware when a recv is posted. When a
 265 * reply is handled, the recv buffer used is given back to the
 266 * struct rpcrdma_req associated with the request.
 267 *
 268 * In addition to the basic memory, this structure includes an array
 269 * of iovs for send operations. The reason is that the iovs passed to
 270 * ib_post_{send,recv} must not be modified until the work request
 271 * completes.
 272 */
 273
 274/* Maximum number of page-sized "segments" per chunk list to be
 275 * registered or invalidated. Must handle a Reply chunk:
 276 */
 277enum {
 278        RPCRDMA_MAX_IOV_SEGS    = 3,
 279        RPCRDMA_MAX_DATA_SEGS   = ((1 * 1024 * 1024) / PAGE_SIZE) + 1,
 280        RPCRDMA_MAX_SEGS        = RPCRDMA_MAX_DATA_SEGS +
 281                                  RPCRDMA_MAX_IOV_SEGS,
 282};
 283
 284/* Arguments for DMA mapping and registration */
 285struct rpcrdma_mr_seg {
 286        u32             mr_len;         /* length of segment */
 287        struct page     *mr_page;       /* underlying struct page */
 288        u64             mr_offset;      /* IN: page offset, OUT: iova */
 289};
 290
 291/* The Send SGE array is provisioned to send a maximum size
 292 * inline request:
 293 * - RPC-over-RDMA header
 294 * - xdr_buf head iovec
 295 * - RPCRDMA_MAX_INLINE bytes, in pages
 296 * - xdr_buf tail iovec
 297 *
 298 * The actual number of array elements consumed by each RPC
 299 * depends on the device's max_sge limit.
 300 */
 301enum {
 302        RPCRDMA_MIN_SEND_SGES = 3,
 303        RPCRDMA_MAX_PAGE_SGES = RPCRDMA_MAX_INLINE >> PAGE_SHIFT,
 304        RPCRDMA_MAX_SEND_SGES = 1 + 1 + RPCRDMA_MAX_PAGE_SGES + 1,
 305};
 306
 307struct rpcrdma_buffer;
 308struct rpcrdma_req {
 309        struct list_head        rl_list;
 310        struct rpc_rqst         rl_slot;
 311        struct rpcrdma_rep      *rl_reply;
 312        struct xdr_stream       rl_stream;
 313        struct xdr_buf          rl_hdrbuf;
 314        struct ib_send_wr       rl_wr;
 315        struct rpcrdma_sendctx  *rl_sendctx;
 316        struct rpcrdma_regbuf   *rl_rdmabuf;    /* xprt header */
 317        struct rpcrdma_regbuf   *rl_sendbuf;    /* rq_snd_buf */
 318        struct rpcrdma_regbuf   *rl_recvbuf;    /* rq_rcv_buf */
 319
 320        struct list_head        rl_all;
 321        struct kref             rl_kref;
 322
 323        struct list_head        rl_free_mrs;
 324        struct list_head        rl_registered;
 325        struct rpcrdma_mr_seg   rl_segments[RPCRDMA_MAX_SEGS];
 326};
 327
 328static inline struct rpcrdma_req *
 329rpcr_to_rdmar(const struct rpc_rqst *rqst)
 330{
 331        return container_of(rqst, struct rpcrdma_req, rl_slot);
 332}
 333
 334static inline void
 335rpcrdma_mr_push(struct rpcrdma_mr *mr, struct list_head *list)
 336{
 337        list_add(&mr->mr_list, list);
 338}
 339
 340static inline struct rpcrdma_mr *
 341rpcrdma_mr_pop(struct list_head *list)
 342{
 343        struct rpcrdma_mr *mr;
 344
 345        mr = list_first_entry_or_null(list, struct rpcrdma_mr, mr_list);
 346        if (mr)
 347                list_del_init(&mr->mr_list);
 348        return mr;
 349}
 350
 351/*
 352 * struct rpcrdma_buffer -- holds list/queue of pre-registered memory for
 353 * inline requests/replies, and client/server credits.
 354 *
 355 * One of these is associated with a transport instance
 356 */
 357struct rpcrdma_buffer {
 358        spinlock_t              rb_lock;
 359        struct list_head        rb_send_bufs;
 360        struct list_head        rb_mrs;
 361
 362        unsigned long           rb_sc_head;
 363        unsigned long           rb_sc_tail;
 364        unsigned long           rb_sc_last;
 365        struct rpcrdma_sendctx  **rb_sc_ctxs;
 366
 367        struct list_head        rb_allreqs;
 368        struct list_head        rb_all_mrs;
 369        struct list_head        rb_all_reps;
 370
 371        struct llist_head       rb_free_reps;
 372
 373        __be32                  rb_max_requests;
 374        u32                     rb_credits;     /* most recent credit grant */
 375
 376        u32                     rb_bc_srv_max_requests;
 377        u32                     rb_bc_max_requests;
 378
 379        struct work_struct      rb_refresh_worker;
 380};
 381
 382/*
 383 * Statistics for RPCRDMA
 384 */
 385struct rpcrdma_stats {
 386        /* accessed when sending a call */
 387        unsigned long           read_chunk_count;
 388        unsigned long           write_chunk_count;
 389        unsigned long           reply_chunk_count;
 390        unsigned long long      total_rdma_request;
 391
 392        /* rarely accessed error counters */
 393        unsigned long long      pullup_copy_count;
 394        unsigned long           hardway_register_count;
 395        unsigned long           failed_marshal_count;
 396        unsigned long           bad_reply_count;
 397        unsigned long           mrs_recycled;
 398        unsigned long           mrs_orphaned;
 399        unsigned long           mrs_allocated;
 400        unsigned long           empty_sendctx_q;
 401
 402        /* accessed when receiving a reply */
 403        unsigned long long      total_rdma_reply;
 404        unsigned long long      fixup_copy_count;
 405        unsigned long           reply_waits_for_send;
 406        unsigned long           local_inv_needed;
 407        unsigned long           nomsg_call_count;
 408        unsigned long           bcall_count;
 409};
 410
 411/*
 412 * RPCRDMA transport -- encapsulates the structures above for
 413 * integration with RPC.
 414 *
 415 * The contained structures are embedded, not pointers,
 416 * for convenience. This structure need not be visible externally.
 417 *
 418 * It is allocated and initialized during mount, and released
 419 * during unmount.
 420 */
 421struct rpcrdma_xprt {
 422        struct rpc_xprt         rx_xprt;
 423        struct rpcrdma_ep       *rx_ep;
 424        struct rpcrdma_buffer   rx_buf;
 425        struct delayed_work     rx_connect_worker;
 426        struct rpc_timeout      rx_timeout;
 427        struct rpcrdma_stats    rx_stats;
 428};
 429
 430#define rpcx_to_rdmax(x) container_of(x, struct rpcrdma_xprt, rx_xprt)
 431
 432static inline const char *
 433rpcrdma_addrstr(const struct rpcrdma_xprt *r_xprt)
 434{
 435        return r_xprt->rx_xprt.address_strings[RPC_DISPLAY_ADDR];
 436}
 437
 438static inline const char *
 439rpcrdma_portstr(const struct rpcrdma_xprt *r_xprt)
 440{
 441        return r_xprt->rx_xprt.address_strings[RPC_DISPLAY_PORT];
 442}
 443
 444/* Setting this to 0 ensures interoperability with early servers.
 445 * Setting this to 1 enhances certain unaligned read/write performance.
 446 * Default is 0, see sysctl entry and rpc_rdma.c rpcrdma_convert_iovs() */
 447extern int xprt_rdma_pad_optimize;
 448
 449/* This setting controls the hunt for a supported memory
 450 * registration strategy.
 451 */
 452extern unsigned int xprt_rdma_memreg_strategy;
 453
 454/*
 455 * Endpoint calls - xprtrdma/verbs.c
 456 */
 457void rpcrdma_force_disconnect(struct rpcrdma_ep *ep);
 458void rpcrdma_flush_disconnect(struct rpcrdma_xprt *r_xprt, struct ib_wc *wc);
 459int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt);
 460void rpcrdma_xprt_disconnect(struct rpcrdma_xprt *r_xprt);
 461
 462void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed, bool temp);
 463
 464/*
 465 * Buffer calls - xprtrdma/verbs.c
 466 */
 467struct rpcrdma_req *rpcrdma_req_create(struct rpcrdma_xprt *r_xprt, size_t size,
 468                                       gfp_t flags);
 469int rpcrdma_req_setup(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
 470void rpcrdma_req_destroy(struct rpcrdma_req *req);
 471int rpcrdma_buffer_create(struct rpcrdma_xprt *);
 472void rpcrdma_buffer_destroy(struct rpcrdma_buffer *);
 473struct rpcrdma_sendctx *rpcrdma_sendctx_get_locked(struct rpcrdma_xprt *r_xprt);
 474
 475struct rpcrdma_mr *rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt);
 476void rpcrdma_mrs_refresh(struct rpcrdma_xprt *r_xprt);
 477
 478struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *);
 479void rpcrdma_buffer_put(struct rpcrdma_buffer *buffers,
 480                        struct rpcrdma_req *req);
 481void rpcrdma_rep_put(struct rpcrdma_buffer *buf, struct rpcrdma_rep *rep);
 482void rpcrdma_reply_put(struct rpcrdma_buffer *buffers, struct rpcrdma_req *req);
 483
 484bool rpcrdma_regbuf_realloc(struct rpcrdma_regbuf *rb, size_t size,
 485                            gfp_t flags);
 486bool __rpcrdma_regbuf_dma_map(struct rpcrdma_xprt *r_xprt,
 487                              struct rpcrdma_regbuf *rb);
 488
 489/**
 490 * rpcrdma_regbuf_is_mapped - check if buffer is DMA mapped
 491 *
 492 * Returns true if the buffer is now mapped to rb->rg_device.
 493 */
 494static inline bool rpcrdma_regbuf_is_mapped(struct rpcrdma_regbuf *rb)
 495{
 496        return rb->rg_device != NULL;
 497}
 498
 499/**
 500 * rpcrdma_regbuf_dma_map - DMA-map a regbuf
 501 * @r_xprt: controlling transport instance
 502 * @rb: regbuf to be mapped
 503 *
 504 * Returns true if the buffer is currently DMA mapped.
 505 */
 506static inline bool rpcrdma_regbuf_dma_map(struct rpcrdma_xprt *r_xprt,
 507                                          struct rpcrdma_regbuf *rb)
 508{
 509        if (likely(rpcrdma_regbuf_is_mapped(rb)))
 510                return true;
 511        return __rpcrdma_regbuf_dma_map(r_xprt, rb);
 512}
 513
 514/*
 515 * Wrappers for chunk registration, shared by read/write chunk code.
 516 */
 517
 518static inline enum dma_data_direction
 519rpcrdma_data_dir(bool writing)
 520{
 521        return writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
 522}
 523
 524/* Memory registration calls xprtrdma/frwr_ops.c
 525 */
 526void frwr_reset(struct rpcrdma_req *req);
 527int frwr_query_device(struct rpcrdma_ep *ep, const struct ib_device *device);
 528int frwr_mr_init(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr *mr);
 529void frwr_mr_release(struct rpcrdma_mr *mr);
 530struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt,
 531                                struct rpcrdma_mr_seg *seg,
 532                                int nsegs, bool writing, __be32 xid,
 533                                struct rpcrdma_mr *mr);
 534int frwr_send(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
 535void frwr_reminv(struct rpcrdma_rep *rep, struct list_head *mrs);
 536void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
 537void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
 538
 539/*
 540 * RPC/RDMA protocol calls - xprtrdma/rpc_rdma.c
 541 */
 542
 543enum rpcrdma_chunktype {
 544        rpcrdma_noch = 0,
 545        rpcrdma_noch_pullup,
 546        rpcrdma_noch_mapped,
 547        rpcrdma_readch,
 548        rpcrdma_areadch,
 549        rpcrdma_writech,
 550        rpcrdma_replych
 551};
 552
 553int rpcrdma_prepare_send_sges(struct rpcrdma_xprt *r_xprt,
 554                              struct rpcrdma_req *req, u32 hdrlen,
 555                              struct xdr_buf *xdr,
 556                              enum rpcrdma_chunktype rtype);
 557void rpcrdma_sendctx_unmap(struct rpcrdma_sendctx *sc);
 558int rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst);
 559void rpcrdma_set_max_header_sizes(struct rpcrdma_ep *ep);
 560void rpcrdma_reset_cwnd(struct rpcrdma_xprt *r_xprt);
 561void rpcrdma_complete_rqst(struct rpcrdma_rep *rep);
 562void rpcrdma_unpin_rqst(struct rpcrdma_rep *rep);
 563void rpcrdma_reply_handler(struct rpcrdma_rep *rep);
 564
 565static inline void rpcrdma_set_xdrlen(struct xdr_buf *xdr, size_t len)
 566{
 567        xdr->head[0].iov_len = len;
 568        xdr->len = len;
 569}
 570
 571/* RPC/RDMA module init - xprtrdma/transport.c
 572 */
 573extern unsigned int xprt_rdma_max_inline_read;
 574extern unsigned int xprt_rdma_max_inline_write;
 575void xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap);
 576void xprt_rdma_free_addresses(struct rpc_xprt *xprt);
 577void xprt_rdma_close(struct rpc_xprt *xprt);
 578void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq);
 579int xprt_rdma_init(void);
 580void xprt_rdma_cleanup(void);
 581
 582/* Backchannel calls - xprtrdma/backchannel.c
 583 */
 584#if defined(CONFIG_SUNRPC_BACKCHANNEL)
 585int xprt_rdma_bc_setup(struct rpc_xprt *, unsigned int);
 586size_t xprt_rdma_bc_maxpayload(struct rpc_xprt *);
 587unsigned int xprt_rdma_bc_max_slots(struct rpc_xprt *);
 588int rpcrdma_bc_post_recv(struct rpcrdma_xprt *, unsigned int);
 589void rpcrdma_bc_receive_call(struct rpcrdma_xprt *, struct rpcrdma_rep *);
 590int xprt_rdma_bc_send_reply(struct rpc_rqst *rqst);
 591void xprt_rdma_bc_free_rqst(struct rpc_rqst *);
 592void xprt_rdma_bc_destroy(struct rpc_xprt *, unsigned int);
 593#endif  /* CONFIG_SUNRPC_BACKCHANNEL */
 594
 595extern struct xprt_class xprt_rdma_bc;
 596
 597#endif                          /* _LINUX_SUNRPC_XPRT_RDMA_H */
 598