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