GNU Linux-libre 4.9.283-gnu1
[releases.git] / net / sunrpc / xprtrdma / xprt_rdma.h
1 /*
2  * Copyright (c) 2003-2007 Network Appliance, Inc. All rights reserved.
3  *
4  * This software is available to you under a choice of one of two
5  * licenses.  You may choose to be licensed under the terms of the GNU
6  * General Public License (GPL) Version 2, available from the file
7  * COPYING in the main directory of this source tree, or the BSD-type
8  * license below:
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  *
14  *      Redistributions of source code must retain the above copyright
15  *      notice, this list of conditions and the following disclaimer.
16  *
17  *      Redistributions in binary form must reproduce the above
18  *      copyright notice, this list of conditions and the following
19  *      disclaimer in the documentation and/or other materials provided
20  *      with the distribution.
21  *
22  *      Neither the name of the Network Appliance, Inc. nor the names of
23  *      its contributors may be used to endorse or promote products
24  *      derived from this software without specific prior written
25  *      permission.
26  *
27  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
29  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
30  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
31  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
32  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
33  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
34  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
35  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
36  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
37  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38  */
39
40 #ifndef _LINUX_SUNRPC_XPRT_RDMA_H
41 #define _LINUX_SUNRPC_XPRT_RDMA_H
42
43 #include <linux/wait.h>                 /* wait_queue_head_t, etc */
44 #include <linux/spinlock.h>             /* spinlock_t, etc */
45 #include <linux/atomic.h>                       /* atomic_t, etc */
46 #include <linux/workqueue.h>            /* struct work_struct */
47
48 #include <rdma/rdma_cm.h>               /* RDMA connection api */
49 #include <rdma/ib_verbs.h>              /* RDMA verbs api */
50
51 #include <linux/sunrpc/clnt.h>          /* rpc_xprt */
52 #include <linux/sunrpc/rpc_rdma.h>      /* RPC/RDMA protocol */
53 #include <linux/sunrpc/xprtrdma.h>      /* xprt parameters */
54
55 #define RDMA_RESOLVE_TIMEOUT    (5000)  /* 5 seconds */
56 #define RDMA_CONNECT_RETRY_MAX  (2)     /* retries if no listener backlog */
57
58 #define RPCRDMA_BIND_TO         (60U * HZ)
59 #define RPCRDMA_INIT_REEST_TO   (5U * HZ)
60 #define RPCRDMA_MAX_REEST_TO    (30U * HZ)
61 #define RPCRDMA_IDLE_DISC_TO    (5U * 60 * HZ)
62
63 /*
64  * Interface Adapter -- one per transport instance
65  */
66 struct rpcrdma_ia {
67         const struct rpcrdma_memreg_ops *ri_ops;
68         struct ib_device        *ri_device;
69         struct rdma_cm_id       *ri_id;
70         struct ib_pd            *ri_pd;
71         struct completion       ri_done;
72         int                     ri_async_rc;
73         unsigned int            ri_max_segs;
74         unsigned int            ri_max_frmr_depth;
75         unsigned int            ri_max_inline_write;
76         unsigned int            ri_max_inline_read;
77         unsigned int            ri_max_send_sges;
78         bool                    ri_reminv_expected;
79         bool                    ri_implicit_roundup;
80         struct ib_qp_attr       ri_qp_attr;
81         struct ib_qp_init_attr  ri_qp_init_attr;
82 };
83
84 /*
85  * RDMA Endpoint -- one per transport instance
86  */
87
88 struct rpcrdma_ep {
89         atomic_t                rep_cqcount;
90         int                     rep_cqinit;
91         int                     rep_connected;
92         struct ib_qp_init_attr  rep_attr;
93         wait_queue_head_t       rep_connect_wait;
94         struct rpcrdma_connect_private  rep_cm_private;
95         struct rdma_conn_param  rep_remote_cma;
96         struct sockaddr_storage rep_remote_addr;
97         struct delayed_work     rep_connect_worker;
98 };
99
100 static inline void
101 rpcrdma_init_cqcount(struct rpcrdma_ep *ep, int count)
102 {
103         atomic_set(&ep->rep_cqcount, ep->rep_cqinit - count);
104 }
105
106 /* To update send queue accounting, provider must take a
107  * send completion every now and then.
108  */
109 static inline void
110 rpcrdma_set_signaled(struct rpcrdma_ep *ep, struct ib_send_wr *send_wr)
111 {
112         send_wr->send_flags = 0;
113         if (unlikely(atomic_sub_return(1, &ep->rep_cqcount) <= 0)) {
114                 rpcrdma_init_cqcount(ep, 0);
115                 send_wr->send_flags = IB_SEND_SIGNALED;
116         }
117 }
118
119 /* Pre-allocate extra Work Requests for handling backward receives
120  * and sends. This is a fixed value because the Work Queues are
121  * allocated when the forward channel is set up.
122  */
123 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
124 #define RPCRDMA_BACKWARD_WRS            (8)
125 #else
126 #define RPCRDMA_BACKWARD_WRS            (0)
127 #endif
128
129 /* Registered buffer -- registered kmalloc'd memory for RDMA SEND/RECV
130  *
131  * The below structure appears at the front of a large region of kmalloc'd
132  * memory, which always starts on a good alignment boundary.
133  */
134
135 struct rpcrdma_regbuf {
136         struct ib_sge           rg_iov;
137         struct ib_device        *rg_device;
138         enum dma_data_direction rg_direction;
139         __be32                  rg_base[0] __attribute__ ((aligned(256)));
140 };
141
142 static inline u64
143 rdmab_addr(struct rpcrdma_regbuf *rb)
144 {
145         return rb->rg_iov.addr;
146 }
147
148 static inline u32
149 rdmab_length(struct rpcrdma_regbuf *rb)
150 {
151         return rb->rg_iov.length;
152 }
153
154 static inline u32
155 rdmab_lkey(struct rpcrdma_regbuf *rb)
156 {
157         return rb->rg_iov.lkey;
158 }
159
160 static inline struct rpcrdma_msg *
161 rdmab_to_msg(struct rpcrdma_regbuf *rb)
162 {
163         return (struct rpcrdma_msg *)rb->rg_base;
164 }
165
166 #define RPCRDMA_DEF_GFP         (GFP_NOIO | __GFP_NOWARN)
167
168 /* To ensure a transport can always make forward progress,
169  * the number of RDMA segments allowed in header chunk lists
170  * is capped at 8. This prevents less-capable devices and
171  * memory registrations from overrunning the Send buffer
172  * while building chunk lists.
173  *
174  * Elements of the Read list take up more room than the
175  * Write list or Reply chunk. 8 read segments means the Read
176  * list (or Write list or Reply chunk) cannot consume more
177  * than
178  *
179  * ((8 + 2) * read segment size) + 1 XDR words, or 244 bytes.
180  *
181  * And the fixed part of the header is another 24 bytes.
182  *
183  * The smallest inline threshold is 1024 bytes, ensuring that
184  * at least 750 bytes are available for RPC messages.
185  */
186 enum {
187         RPCRDMA_MAX_HDR_SEGS = 8,
188         RPCRDMA_HDRBUF_SIZE = 256,
189 };
190
191 /*
192  * struct rpcrdma_rep -- this structure encapsulates state required to recv
193  * and complete a reply, asychronously. It needs several pieces of
194  * state:
195  *   o recv buffer (posted to provider)
196  *   o ib_sge (also donated to provider)
197  *   o status of reply (length, success or not)
198  *   o bookkeeping state to get run by reply handler (list, etc)
199  *
200  * These are allocated during initialization, per-transport instance.
201  *
202  * N of these are associated with a transport instance, and stored in
203  * struct rpcrdma_buffer. N is the max number of outstanding requests.
204  */
205
206 struct rpcrdma_rep {
207         struct ib_cqe           rr_cqe;
208         unsigned int            rr_len;
209         int                     rr_wc_flags;
210         u32                     rr_inv_rkey;
211         struct ib_device        *rr_device;
212         struct rpcrdma_xprt     *rr_rxprt;
213         struct work_struct      rr_work;
214         struct list_head        rr_list;
215         struct ib_recv_wr       rr_recv_wr;
216         struct rpcrdma_regbuf   *rr_rdmabuf;
217 };
218
219 #define RPCRDMA_BAD_LEN         (~0U)
220
221 /*
222  * struct rpcrdma_mw - external memory region metadata
223  *
224  * An external memory region is any buffer or page that is registered
225  * on the fly (ie, not pre-registered).
226  *
227  * Each rpcrdma_buffer has a list of free MWs anchored in rb_mws. During
228  * call_allocate, rpcrdma_buffer_get() assigns one to each segment in
229  * an rpcrdma_req. Then rpcrdma_register_external() grabs these to keep
230  * track of registration metadata while each RPC is pending.
231  * rpcrdma_deregister_external() uses this metadata to unmap and
232  * release these resources when an RPC is complete.
233  */
234 enum rpcrdma_frmr_state {
235         FRMR_IS_INVALID,        /* ready to be used */
236         FRMR_IS_VALID,          /* in use */
237         FRMR_FLUSHED_FR,        /* flushed FASTREG WR */
238         FRMR_FLUSHED_LI,        /* flushed LOCALINV WR */
239 };
240
241 struct rpcrdma_frmr {
242         struct ib_mr                    *fr_mr;
243         struct ib_cqe                   fr_cqe;
244         enum rpcrdma_frmr_state         fr_state;
245         struct completion               fr_linv_done;
246         union {
247                 struct ib_reg_wr        fr_regwr;
248                 struct ib_send_wr       fr_invwr;
249         };
250 };
251
252 struct rpcrdma_fmr {
253         struct ib_fmr           *fm_mr;
254         u64                     *fm_physaddrs;
255 };
256
257 struct rpcrdma_mw {
258         struct list_head        mw_list;
259         struct scatterlist      *mw_sg;
260         int                     mw_nents;
261         enum dma_data_direction mw_dir;
262         union {
263                 struct rpcrdma_fmr      fmr;
264                 struct rpcrdma_frmr     frmr;
265         };
266         struct rpcrdma_xprt     *mw_xprt;
267         u32                     mw_handle;
268         u32                     mw_length;
269         u64                     mw_offset;
270         struct list_head        mw_all;
271 };
272
273 /*
274  * struct rpcrdma_req -- structure central to the request/reply sequence.
275  *
276  * N of these are associated with a transport instance, and stored in
277  * struct rpcrdma_buffer. N is the max number of outstanding requests.
278  *
279  * It includes pre-registered buffer memory for send AND recv.
280  * The recv buffer, however, is not owned by this structure, and
281  * is "donated" to the hardware when a recv is posted. When a
282  * reply is handled, the recv buffer used is given back to the
283  * struct rpcrdma_req associated with the request.
284  *
285  * In addition to the basic memory, this structure includes an array
286  * of iovs for send operations. The reason is that the iovs passed to
287  * ib_post_{send,recv} must not be modified until the work request
288  * completes.
289  */
290
291 /* Maximum number of page-sized "segments" per chunk list to be
292  * registered or invalidated. Must handle a Reply chunk:
293  */
294 enum {
295         RPCRDMA_MAX_IOV_SEGS    = 3,
296         RPCRDMA_MAX_DATA_SEGS   = ((1 * 1024 * 1024) / PAGE_SIZE) + 1,
297         RPCRDMA_MAX_SEGS        = RPCRDMA_MAX_DATA_SEGS +
298                                   RPCRDMA_MAX_IOV_SEGS,
299 };
300
301 struct rpcrdma_mr_seg {         /* chunk descriptors */
302         u32             mr_len;         /* length of chunk or segment */
303         struct page     *mr_page;       /* owning page, if any */
304         char            *mr_offset;     /* kva if no page, else offset */
305 };
306
307 /* Reserve enough Send SGEs to send a maximum size inline request:
308  * - RPC-over-RDMA header
309  * - xdr_buf head iovec
310  * - RPCRDMA_MAX_INLINE bytes, possibly unaligned, in pages
311  * - xdr_buf tail iovec
312  */
313 enum {
314         RPCRDMA_MIN_SEND_SGES = 3,
315         RPCRDMA_MAX_SEND_PAGES = PAGE_SIZE + RPCRDMA_MAX_INLINE - 1,
316         RPCRDMA_MAX_PAGE_SGES = (RPCRDMA_MAX_SEND_PAGES >> PAGE_SHIFT) + 1,
317         RPCRDMA_MAX_SEND_SGES = 1 + 1 + RPCRDMA_MAX_PAGE_SGES + 1,
318 };
319
320 struct rpcrdma_buffer;
321 struct rpcrdma_req {
322         struct list_head        rl_free;
323         unsigned int            rl_mapped_sges;
324         unsigned int            rl_connect_cookie;
325         struct rpcrdma_buffer   *rl_buffer;
326         struct rpcrdma_rep      *rl_reply;
327         struct ib_send_wr       rl_send_wr;
328         struct ib_sge           rl_send_sge[RPCRDMA_MAX_SEND_SGES];
329         struct rpcrdma_regbuf   *rl_rdmabuf;    /* xprt header */
330         struct rpcrdma_regbuf   *rl_sendbuf;    /* rq_snd_buf */
331         struct rpcrdma_regbuf   *rl_recvbuf;    /* rq_rcv_buf */
332
333         struct ib_cqe           rl_cqe;
334         struct list_head        rl_all;
335         bool                    rl_backchannel;
336
337         struct list_head        rl_registered;  /* registered segments */
338         struct rpcrdma_mr_seg   rl_segments[RPCRDMA_MAX_SEGS];
339 };
340
341 static inline void
342 rpcrdma_set_xprtdata(struct rpc_rqst *rqst, struct rpcrdma_req *req)
343 {
344         rqst->rq_xprtdata = req;
345 }
346
347 static inline struct rpcrdma_req *
348 rpcr_to_rdmar(struct rpc_rqst *rqst)
349 {
350         return rqst->rq_xprtdata;
351 }
352
353 /*
354  * struct rpcrdma_buffer -- holds list/queue of pre-registered memory for
355  * inline requests/replies, and client/server credits.
356  *
357  * One of these is associated with a transport instance
358  */
359 struct rpcrdma_buffer {
360         spinlock_t              rb_mwlock;      /* protect rb_mws list */
361         struct list_head        rb_mws;
362         struct list_head        rb_all;
363         char                    *rb_pool;
364
365         spinlock_t              rb_lock;        /* protect buf lists */
366         int                     rb_send_count, rb_recv_count;
367         struct list_head        rb_send_bufs;
368         struct list_head        rb_recv_bufs;
369         u32                     rb_max_requests;
370         atomic_t                rb_credits;     /* most recent credit grant */
371
372         u32                     rb_bc_srv_max_requests;
373         spinlock_t              rb_reqslock;    /* protect rb_allreqs */
374         struct list_head        rb_allreqs;
375
376         u32                     rb_bc_max_requests;
377
378         spinlock_t              rb_recovery_lock; /* protect rb_stale_mrs */
379         struct list_head        rb_stale_mrs;
380         struct delayed_work     rb_recovery_worker;
381         struct delayed_work     rb_refresh_worker;
382 };
383 #define rdmab_to_ia(b) (&container_of((b), struct rpcrdma_xprt, rx_buf)->rx_ia)
384
385 /*
386  * Internal structure for transport instance creation. This
387  * exists primarily for modularity.
388  *
389  * This data should be set with mount options
390  */
391 struct rpcrdma_create_data_internal {
392         struct sockaddr_storage addr;   /* RDMA server address */
393         unsigned int    max_requests;   /* max requests (slots) in flight */
394         unsigned int    rsize;          /* mount rsize - max read hdr+data */
395         unsigned int    wsize;          /* mount wsize - max write hdr+data */
396         unsigned int    inline_rsize;   /* max non-rdma read data payload */
397         unsigned int    inline_wsize;   /* max non-rdma write data payload */
398         unsigned int    padding;        /* non-rdma write header padding */
399 };
400
401 /*
402  * Statistics for RPCRDMA
403  */
404 struct rpcrdma_stats {
405         unsigned long           read_chunk_count;
406         unsigned long           write_chunk_count;
407         unsigned long           reply_chunk_count;
408
409         unsigned long long      total_rdma_request;
410         unsigned long long      total_rdma_reply;
411
412         unsigned long long      pullup_copy_count;
413         unsigned long long      fixup_copy_count;
414         unsigned long           hardway_register_count;
415         unsigned long           failed_marshal_count;
416         unsigned long           bad_reply_count;
417         unsigned long           nomsg_call_count;
418         unsigned long           bcall_count;
419         unsigned long           mrs_recovered;
420         unsigned long           mrs_orphaned;
421         unsigned long           mrs_allocated;
422         unsigned long           local_inv_needed;
423 };
424
425 /*
426  * Per-registration mode operations
427  */
428 struct rpcrdma_xprt;
429 struct rpcrdma_memreg_ops {
430         int             (*ro_map)(struct rpcrdma_xprt *,
431                                   struct rpcrdma_mr_seg *, int, bool,
432                                   struct rpcrdma_mw **);
433         void            (*ro_unmap_sync)(struct rpcrdma_xprt *,
434                                          struct rpcrdma_req *);
435         void            (*ro_unmap_safe)(struct rpcrdma_xprt *,
436                                          struct rpcrdma_req *, bool);
437         void            (*ro_recover_mr)(struct rpcrdma_mw *);
438         int             (*ro_open)(struct rpcrdma_ia *,
439                                    struct rpcrdma_ep *,
440                                    struct rpcrdma_create_data_internal *);
441         size_t          (*ro_maxpages)(struct rpcrdma_xprt *);
442         int             (*ro_init_mr)(struct rpcrdma_ia *,
443                                       struct rpcrdma_mw *);
444         void            (*ro_release_mr)(struct rpcrdma_mw *);
445         const char      *ro_displayname;
446         const int       ro_send_w_inv_ok;
447 };
448
449 extern const struct rpcrdma_memreg_ops rpcrdma_fmr_memreg_ops;
450 extern const struct rpcrdma_memreg_ops rpcrdma_frwr_memreg_ops;
451
452 /*
453  * RPCRDMA transport -- encapsulates the structures above for
454  * integration with RPC.
455  *
456  * The contained structures are embedded, not pointers,
457  * for convenience. This structure need not be visible externally.
458  *
459  * It is allocated and initialized during mount, and released
460  * during unmount.
461  */
462 struct rpcrdma_xprt {
463         struct rpc_xprt         rx_xprt;
464         struct rpcrdma_ia       rx_ia;
465         struct rpcrdma_ep       rx_ep;
466         struct rpcrdma_buffer   rx_buf;
467         struct rpcrdma_create_data_internal rx_data;
468         struct delayed_work     rx_connect_worker;
469         struct rpcrdma_stats    rx_stats;
470 };
471
472 #define rpcx_to_rdmax(x) container_of(x, struct rpcrdma_xprt, rx_xprt)
473 #define rpcx_to_rdmad(x) (rpcx_to_rdmax(x)->rx_data)
474
475 /* Setting this to 0 ensures interoperability with early servers.
476  * Setting this to 1 enhances certain unaligned read/write performance.
477  * Default is 0, see sysctl entry and rpc_rdma.c rpcrdma_convert_iovs() */
478 extern int xprt_rdma_pad_optimize;
479
480 /*
481  * Interface Adapter calls - xprtrdma/verbs.c
482  */
483 int rpcrdma_ia_open(struct rpcrdma_xprt *, struct sockaddr *, int);
484 void rpcrdma_ia_close(struct rpcrdma_ia *);
485 bool frwr_is_supported(struct rpcrdma_ia *);
486 bool fmr_is_supported(struct rpcrdma_ia *);
487
488 /*
489  * Endpoint calls - xprtrdma/verbs.c
490  */
491 int rpcrdma_ep_create(struct rpcrdma_ep *, struct rpcrdma_ia *,
492                                 struct rpcrdma_create_data_internal *);
493 void rpcrdma_ep_destroy(struct rpcrdma_ep *, struct rpcrdma_ia *);
494 int rpcrdma_ep_connect(struct rpcrdma_ep *, struct rpcrdma_ia *);
495 void rpcrdma_ep_disconnect(struct rpcrdma_ep *, struct rpcrdma_ia *);
496
497 int rpcrdma_ep_post(struct rpcrdma_ia *, struct rpcrdma_ep *,
498                                 struct rpcrdma_req *);
499 int rpcrdma_ep_post_recv(struct rpcrdma_ia *, struct rpcrdma_rep *);
500
501 /*
502  * Buffer calls - xprtrdma/verbs.c
503  */
504 struct rpcrdma_req *rpcrdma_create_req(struct rpcrdma_xprt *);
505 void rpcrdma_destroy_req(struct rpcrdma_req *);
506 int rpcrdma_create_rep(struct rpcrdma_xprt *r_xprt);
507 int rpcrdma_buffer_create(struct rpcrdma_xprt *);
508 void rpcrdma_buffer_destroy(struct rpcrdma_buffer *);
509
510 struct rpcrdma_mw *rpcrdma_get_mw(struct rpcrdma_xprt *);
511 void rpcrdma_put_mw(struct rpcrdma_xprt *, struct rpcrdma_mw *);
512 struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *);
513 void rpcrdma_buffer_put(struct rpcrdma_req *);
514 void rpcrdma_recv_buffer_get(struct rpcrdma_req *);
515 void rpcrdma_recv_buffer_put(struct rpcrdma_rep *);
516
517 void rpcrdma_defer_mr_recovery(struct rpcrdma_mw *);
518
519 struct rpcrdma_regbuf *rpcrdma_alloc_regbuf(size_t, enum dma_data_direction,
520                                             gfp_t);
521 bool __rpcrdma_dma_map_regbuf(struct rpcrdma_ia *, struct rpcrdma_regbuf *);
522 void rpcrdma_free_regbuf(struct rpcrdma_regbuf *);
523
524 static inline bool
525 rpcrdma_regbuf_is_mapped(struct rpcrdma_regbuf *rb)
526 {
527         return rb->rg_device != NULL;
528 }
529
530 static inline bool
531 rpcrdma_dma_map_regbuf(struct rpcrdma_ia *ia, struct rpcrdma_regbuf *rb)
532 {
533         if (likely(rpcrdma_regbuf_is_mapped(rb)))
534                 return true;
535         return __rpcrdma_dma_map_regbuf(ia, rb);
536 }
537
538 int rpcrdma_ep_post_extra_recv(struct rpcrdma_xprt *, unsigned int);
539
540 int rpcrdma_alloc_wq(void);
541 void rpcrdma_destroy_wq(void);
542
543 /*
544  * Wrappers for chunk registration, shared by read/write chunk code.
545  */
546
547 static inline enum dma_data_direction
548 rpcrdma_data_dir(bool writing)
549 {
550         return writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
551 }
552
553 /*
554  * RPC/RDMA connection management calls - xprtrdma/rpc_rdma.c
555  */
556 void rpcrdma_connect_worker(struct work_struct *);
557 void rpcrdma_conn_func(struct rpcrdma_ep *);
558 void rpcrdma_reply_handler(struct work_struct *);
559
560 /*
561  * RPC/RDMA protocol calls - xprtrdma/rpc_rdma.c
562  */
563
564 enum rpcrdma_chunktype {
565         rpcrdma_noch = 0,
566         rpcrdma_readch,
567         rpcrdma_areadch,
568         rpcrdma_writech,
569         rpcrdma_replych
570 };
571
572 bool rpcrdma_prepare_send_sges(struct rpcrdma_ia *, struct rpcrdma_req *,
573                                u32, struct xdr_buf *, enum rpcrdma_chunktype);
574 void rpcrdma_unmap_sges(struct rpcrdma_ia *, struct rpcrdma_req *);
575 int rpcrdma_marshal_req(struct rpc_rqst *);
576 void rpcrdma_set_max_header_sizes(struct rpcrdma_xprt *);
577
578 /* RPC/RDMA module init - xprtrdma/transport.c
579  */
580 extern unsigned int xprt_rdma_max_inline_read;
581 void xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap);
582 void xprt_rdma_free_addresses(struct rpc_xprt *xprt);
583 void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq);
584 int xprt_rdma_init(void);
585 void xprt_rdma_cleanup(void);
586
587 /* Backchannel calls - xprtrdma/backchannel.c
588  */
589 #if defined(CONFIG_SUNRPC_BACKCHANNEL)
590 int xprt_rdma_bc_setup(struct rpc_xprt *, unsigned int);
591 int xprt_rdma_bc_up(struct svc_serv *, struct net *);
592 size_t xprt_rdma_bc_maxpayload(struct rpc_xprt *);
593 int rpcrdma_bc_post_recv(struct rpcrdma_xprt *, unsigned int);
594 void rpcrdma_bc_receive_call(struct rpcrdma_xprt *, struct rpcrdma_rep *);
595 int rpcrdma_bc_marshal_reply(struct rpc_rqst *);
596 void xprt_rdma_bc_free_rqst(struct rpc_rqst *);
597 void xprt_rdma_bc_destroy(struct rpc_xprt *, unsigned int);
598 #endif  /* CONFIG_SUNRPC_BACKCHANNEL */
599
600 extern struct xprt_class xprt_rdma_bc;
601
602 #endif                          /* _LINUX_SUNRPC_XPRT_RDMA_H */