Linux Audio

Check our new training course

Loading...
v4.6
 
  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 */
 66struct rpcrdma_ia {
 67	const struct rpcrdma_memreg_ops	*ri_ops;
 68	rwlock_t		ri_qplock;
 69	struct ib_device	*ri_device;
 70	struct rdma_cm_id 	*ri_id;
 71	struct ib_pd		*ri_pd;
 72	struct ib_mr		*ri_dma_mr;
 73	struct completion	ri_done;
 74	int			ri_async_rc;
 75	unsigned int		ri_max_frmr_depth;
 76	struct ib_qp_attr	ri_qp_attr;
 77	struct ib_qp_init_attr	ri_qp_init_attr;
 78};
 79
 80/*
 81 * RDMA Endpoint -- one per transport instance
 82 */
 83
 84struct rpcrdma_ep {
 85	atomic_t		rep_cqcount;
 86	int			rep_cqinit;
 87	int			rep_connected;
 88	struct ib_qp_init_attr	rep_attr;
 89	wait_queue_head_t 	rep_connect_wait;
 90	struct rdma_conn_param	rep_remote_cma;
 91	struct sockaddr_storage	rep_remote_addr;
 92	struct delayed_work	rep_connect_worker;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 93};
 94
 95#define INIT_CQCOUNT(ep) atomic_set(&(ep)->rep_cqcount, (ep)->rep_cqinit)
 96#define DECR_CQCOUNT(ep) atomic_sub_return(1, &(ep)->rep_cqcount)
 97
 98/* Pre-allocate extra Work Requests for handling backward receives
 99 * and sends. This is a fixed value because the Work Queues are
100 * allocated when the forward channel is set up.
 
 
101 */
102#if defined(CONFIG_SUNRPC_BACKCHANNEL)
103#define RPCRDMA_BACKWARD_WRS		(8)
104#else
105#define RPCRDMA_BACKWARD_WRS		(0)
106#endif
107
108/* Registered buffer -- registered kmalloc'd memory for RDMA SEND/RECV
109 *
110 * The below structure appears at the front of a large region of kmalloc'd
111 * memory, which always starts on a good alignment boundary.
112 */
113
114struct rpcrdma_regbuf {
115	size_t			rg_size;
116	struct rpcrdma_req	*rg_owner;
117	struct ib_sge		rg_iov;
118	__be32			rg_base[0] __attribute__ ((aligned(256)));
 
 
119};
120
121static inline u64
122rdmab_addr(struct rpcrdma_regbuf *rb)
123{
124	return rb->rg_iov.addr;
125}
126
127static inline u32
128rdmab_length(struct rpcrdma_regbuf *rb)
129{
130	return rb->rg_iov.length;
131}
132
133static inline u32
134rdmab_lkey(struct rpcrdma_regbuf *rb)
135{
136	return rb->rg_iov.lkey;
137}
138
139static inline struct rpcrdma_msg *
140rdmab_to_msg(struct rpcrdma_regbuf *rb)
141{
142	return (struct rpcrdma_msg *)rb->rg_base;
 
 
 
 
 
143}
144
145#define RPCRDMA_DEF_GFP		(GFP_NOIO | __GFP_NOWARN)
146
147/*
148 * struct rpcrdma_rep -- this structure encapsulates state required to recv
149 * and complete a reply, asychronously. It needs several pieces of
150 * state:
151 *   o recv buffer (posted to provider)
152 *   o ib_sge (also donated to provider)
153 *   o status of reply (length, success or not)
154 *   o bookkeeping state to get run by tasklet (list, etc)
155 *
156 * These are allocated during initialization, per-transport instance;
157 * however, the tasklet execution list itself is global, as it should
158 * always be pretty short.
159 *
160 * N of these are associated with a transport instance, and stored in
161 * struct rpcrdma_buffer. N is the max number of outstanding requests.
 
 
 
 
 
 
 
 
162 */
 
 
 
163
164#define RPCRDMA_MAX_DATA_SEGS	((1 * 1024 * 1024) / PAGE_SIZE)
165#define RPCRDMA_MAX_SEGS 	(RPCRDMA_MAX_DATA_SEGS + 2) /* head+tail = 2 */
166
167struct rpcrdma_buffer;
 
 
 
 
 
 
 
 
 
168
169struct rpcrdma_rep {
170	struct ib_cqe		rr_cqe;
171	unsigned int		rr_len;
172	struct ib_device	*rr_device;
173	struct rpcrdma_xprt	*rr_rxprt;
174	struct work_struct	rr_work;
175	struct list_head	rr_list;
 
176	struct rpcrdma_regbuf	*rr_rdmabuf;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
177};
178
179#define RPCRDMA_BAD_LEN		(~0U)
 
 
 
 
 
 
 
 
180
181/*
182 * struct rpcrdma_mw - external memory region metadata
183 *
184 * An external memory region is any buffer or page that is registered
185 * on the fly (ie, not pre-registered).
186 *
187 * Each rpcrdma_buffer has a list of free MWs anchored in rb_mws. During
188 * call_allocate, rpcrdma_buffer_get() assigns one to each segment in
189 * an rpcrdma_req. Then rpcrdma_register_external() grabs these to keep
190 * track of registration metadata while each RPC is pending.
191 * rpcrdma_deregister_external() uses this metadata to unmap and
192 * release these resources when an RPC is complete.
193 */
194enum rpcrdma_frmr_state {
195	FRMR_IS_INVALID,	/* ready to be used */
196	FRMR_IS_VALID,		/* in use */
197	FRMR_IS_STALE,		/* failed completion */
198};
199
200struct rpcrdma_frmr {
201	struct scatterlist		*sg;
202	int				sg_nents;
203	struct ib_mr			*fr_mr;
204	struct ib_cqe			fr_cqe;
205	enum rpcrdma_frmr_state		fr_state;
206	struct completion		fr_linv_done;
207	struct work_struct		fr_work;
208	struct rpcrdma_xprt		*fr_xprt;
209	union {
210		struct ib_reg_wr	fr_regwr;
211		struct ib_send_wr	fr_invwr;
212	};
213};
214
215struct rpcrdma_fmr {
216	struct ib_fmr		*fmr;
217	u64			*physaddrs;
218};
219
220struct rpcrdma_mw {
221	union {
222		struct rpcrdma_fmr	fmr;
223		struct rpcrdma_frmr	frmr;
224	};
225	struct list_head	mw_list;
226	struct list_head	mw_all;
 
227};
228
229/*
230 * struct rpcrdma_req -- structure central to the request/reply sequence.
231 *
232 * N of these are associated with a transport instance, and stored in
233 * struct rpcrdma_buffer. N is the max number of outstanding requests.
234 *
235 * It includes pre-registered buffer memory for send AND recv.
236 * The recv buffer, however, is not owned by this structure, and
237 * is "donated" to the hardware when a recv is posted. When a
238 * reply is handled, the recv buffer used is given back to the
239 * struct rpcrdma_req associated with the request.
240 *
241 * In addition to the basic memory, this structure includes an array
242 * of iovs for send operations. The reason is that the iovs passed to
243 * ib_post_{send,recv} must not be modified until the work request
244 * completes.
245 *
246 * NOTES:
247 *   o RPCRDMA_MAX_SEGS is the max number of addressible chunk elements we
248 *     marshal. The number needed varies depending on the iov lists that
249 *     are passed to us, the memory registration mode we are in, and if
250 *     physical addressing is used, the layout.
251 */
252
 
 
 
 
 
 
 
 
 
 
253struct rpcrdma_mr_seg {		/* chunk descriptors */
254	struct rpcrdma_mw *rl_mw;	/* registered MR */
255	u64		mr_base;	/* registration result */
256	u32		mr_rkey;	/* registration result */
257	u32		mr_len;		/* length of chunk or segment */
258	int		mr_nsegs;	/* number of segments in chunk or 0 */
259	enum dma_data_direction	mr_dir;	/* segment mapping direction */
260	dma_addr_t	mr_dma;		/* segment mapping address */
261	size_t		mr_dmalen;	/* segment mapping length */
262	struct page	*mr_page;	/* owning page, if any */
263	char		*mr_offset;	/* kva if no page, else offset */
264};
265
266#define RPCRDMA_MAX_IOVS	(2)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
267
 
268struct rpcrdma_req {
269	struct list_head	rl_free;
270	unsigned int		rl_niovs;
271	unsigned int		rl_nchunks;
272	unsigned int		rl_connect_cookie;
273	struct rpcrdma_buffer	*rl_buffer;
274	struct rpcrdma_rep	*rl_reply;/* holder for reply buffer */
275	struct ib_sge		rl_send_iov[RPCRDMA_MAX_IOVS];
276	struct rpcrdma_regbuf	*rl_rdmabuf;
277	struct rpcrdma_regbuf	*rl_sendbuf;
278	struct rpcrdma_mr_seg	rl_segments[RPCRDMA_MAX_SEGS];
279
280	struct ib_cqe		rl_cqe;
281	struct list_head	rl_all;
282	bool			rl_backchannel;
 
 
 
 
283};
284
285static inline struct rpcrdma_req *
286rpcr_to_rdmar(struct rpc_rqst *rqst)
287{
288	void *buffer = rqst->rq_buffer;
289	struct rpcrdma_regbuf *rb;
290
291	rb = container_of(buffer, struct rpcrdma_regbuf, rg_base);
292	return rb->rg_owner;
 
 
 
 
 
 
 
 
 
 
 
 
 
293}
294
295/*
296 * struct rpcrdma_buffer -- holds list/queue of pre-registered memory for
297 * inline requests/replies, and client/server credits.
298 *
299 * One of these is associated with a transport instance
300 */
301struct rpcrdma_buffer {
302	spinlock_t		rb_mwlock;	/* protect rb_mws list */
303	struct list_head	rb_mws;
304	struct list_head	rb_all;
305	char			*rb_pool;
306
307	spinlock_t		rb_lock;	/* protect buf lists */
308	struct list_head	rb_send_bufs;
309	struct list_head	rb_recv_bufs;
310	u32			rb_max_requests;
311	atomic_t		rb_credits;	/* most recent credit grant */
312
313	u32			rb_bc_srv_max_requests;
314	spinlock_t		rb_reqslock;	/* protect rb_allreqs */
315	struct list_head	rb_allreqs;
 
316
317	u32			rb_bc_max_requests;
318};
319#define rdmab_to_ia(b) (&container_of((b), struct rpcrdma_xprt, rx_buf)->rx_ia)
320
321/*
322 * Internal structure for transport instance creation. This
323 * exists primarily for modularity.
324 *
325 * This data should be set with mount options
326 */
327struct rpcrdma_create_data_internal {
328	struct sockaddr_storage	addr;	/* RDMA server address */
329	unsigned int	max_requests;	/* max requests (slots) in flight */
330	unsigned int	rsize;		/* mount rsize - max read hdr+data */
331	unsigned int	wsize;		/* mount wsize - max write hdr+data */
332	unsigned int	inline_rsize;	/* max non-rdma read data payload */
333	unsigned int	inline_wsize;	/* max non-rdma write data payload */
334	unsigned int	padding;	/* non-rdma write header padding */
335};
336
337#define RPCRDMA_INLINE_READ_THRESHOLD(rq) \
338	(rpcx_to_rdmad(rq->rq_xprt).inline_rsize)
339
340#define RPCRDMA_INLINE_WRITE_THRESHOLD(rq)\
341	(rpcx_to_rdmad(rq->rq_xprt).inline_wsize)
342
343#define RPCRDMA_INLINE_PAD_VALUE(rq)\
344	rpcx_to_rdmad(rq->rq_xprt).padding
345
346/*
347 * Statistics for RPCRDMA
348 */
349struct rpcrdma_stats {
 
350	unsigned long		read_chunk_count;
351	unsigned long		write_chunk_count;
352	unsigned long		reply_chunk_count;
353
354	unsigned long long	total_rdma_request;
355	unsigned long long	total_rdma_reply;
356
 
357	unsigned long long	pullup_copy_count;
358	unsigned long long	fixup_copy_count;
359	unsigned long		hardway_register_count;
360	unsigned long		failed_marshal_count;
361	unsigned long		bad_reply_count;
 
 
 
 
 
 
 
 
 
 
362	unsigned long		nomsg_call_count;
363	unsigned long		bcall_count;
364};
365
366/*
367 * Per-registration mode operations
368 */
369struct rpcrdma_xprt;
370struct rpcrdma_memreg_ops {
371	int		(*ro_map)(struct rpcrdma_xprt *,
372				  struct rpcrdma_mr_seg *, int, bool);
373	void		(*ro_unmap_sync)(struct rpcrdma_xprt *,
374					 struct rpcrdma_req *);
375	int		(*ro_unmap)(struct rpcrdma_xprt *,
376				    struct rpcrdma_mr_seg *);
377	int		(*ro_open)(struct rpcrdma_ia *,
378				   struct rpcrdma_ep *,
379				   struct rpcrdma_create_data_internal *);
380	size_t		(*ro_maxpages)(struct rpcrdma_xprt *);
381	int		(*ro_init)(struct rpcrdma_xprt *);
382	void		(*ro_destroy)(struct rpcrdma_buffer *);
383	const char	*ro_displayname;
384};
385
386extern const struct rpcrdma_memreg_ops rpcrdma_fmr_memreg_ops;
387extern const struct rpcrdma_memreg_ops rpcrdma_frwr_memreg_ops;
388extern const struct rpcrdma_memreg_ops rpcrdma_physical_memreg_ops;
389
390/*
391 * RPCRDMA transport -- encapsulates the structures above for
392 * integration with RPC.
393 *
394 * The contained structures are embedded, not pointers,
395 * for convenience. This structure need not be visible externally.
396 *
397 * It is allocated and initialized during mount, and released
398 * during unmount.
399 */
400struct rpcrdma_xprt {
401	struct rpc_xprt		rx_xprt;
402	struct rpcrdma_ia	rx_ia;
403	struct rpcrdma_ep	rx_ep;
404	struct rpcrdma_buffer	rx_buf;
405	struct rpcrdma_create_data_internal rx_data;
406	struct delayed_work	rx_connect_worker;
 
407	struct rpcrdma_stats	rx_stats;
408};
409
410#define rpcx_to_rdmax(x) container_of(x, struct rpcrdma_xprt, rx_xprt)
411#define rpcx_to_rdmad(x) (rpcx_to_rdmax(x)->rx_data)
 
 
 
 
 
 
 
 
 
 
 
412
413/* Setting this to 0 ensures interoperability with early servers.
414 * Setting this to 1 enhances certain unaligned read/write performance.
415 * Default is 0, see sysctl entry and rpc_rdma.c rpcrdma_convert_iovs() */
416extern int xprt_rdma_pad_optimize;
417
418/*
419 * Interface Adapter calls - xprtrdma/verbs.c
420 */
421int rpcrdma_ia_open(struct rpcrdma_xprt *, struct sockaddr *, int);
422void rpcrdma_ia_close(struct rpcrdma_ia *);
423
424/*
425 * Endpoint calls - xprtrdma/verbs.c
426 */
427int rpcrdma_ep_create(struct rpcrdma_ep *, struct rpcrdma_ia *,
428				struct rpcrdma_create_data_internal *);
429void rpcrdma_ep_destroy(struct rpcrdma_ep *, struct rpcrdma_ia *);
430int rpcrdma_ep_connect(struct rpcrdma_ep *, struct rpcrdma_ia *);
431void rpcrdma_ep_disconnect(struct rpcrdma_ep *, struct rpcrdma_ia *);
432
433int rpcrdma_ep_post(struct rpcrdma_ia *, struct rpcrdma_ep *,
434				struct rpcrdma_req *);
435int rpcrdma_ep_post_recv(struct rpcrdma_ia *, struct rpcrdma_ep *,
436				struct rpcrdma_rep *);
437
438/*
439 * Buffer calls - xprtrdma/verbs.c
440 */
441struct rpcrdma_req *rpcrdma_create_req(struct rpcrdma_xprt *);
442struct rpcrdma_rep *rpcrdma_create_rep(struct rpcrdma_xprt *);
443void rpcrdma_destroy_req(struct rpcrdma_ia *, struct rpcrdma_req *);
 
444int rpcrdma_buffer_create(struct rpcrdma_xprt *);
445void rpcrdma_buffer_destroy(struct rpcrdma_buffer *);
 
 
 
 
 
446
447struct rpcrdma_mw *rpcrdma_get_mw(struct rpcrdma_xprt *);
448void rpcrdma_put_mw(struct rpcrdma_xprt *, struct rpcrdma_mw *);
449struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *);
450void rpcrdma_buffer_put(struct rpcrdma_req *);
451void rpcrdma_recv_buffer_get(struct rpcrdma_req *);
452void rpcrdma_recv_buffer_put(struct rpcrdma_rep *);
453
454struct rpcrdma_regbuf *rpcrdma_alloc_regbuf(struct rpcrdma_ia *,
455					    size_t, gfp_t);
456void rpcrdma_free_regbuf(struct rpcrdma_ia *,
457			 struct rpcrdma_regbuf *);
458
459unsigned int rpcrdma_max_segments(struct rpcrdma_xprt *);
460int rpcrdma_ep_post_extra_recv(struct rpcrdma_xprt *, unsigned int);
461
462int frwr_alloc_recovery_wq(void);
463void frwr_destroy_recovery_wq(void);
 
 
 
 
464
465int rpcrdma_alloc_wq(void);
466void rpcrdma_destroy_wq(void);
 
 
 
 
 
 
 
 
 
 
 
 
467
468/*
469 * Wrappers for chunk registration, shared by read/write chunk code.
470 */
471
472void rpcrdma_mapping_error(struct rpcrdma_mr_seg *);
473
474static inline enum dma_data_direction
475rpcrdma_data_dir(bool writing)
476{
477	return writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
478}
479
480static inline void
481rpcrdma_map_one(struct ib_device *device, struct rpcrdma_mr_seg *seg,
482		enum dma_data_direction direction)
483{
484	seg->mr_dir = direction;
485	seg->mr_dmalen = seg->mr_len;
486
487	if (seg->mr_page)
488		seg->mr_dma = ib_dma_map_page(device,
489				seg->mr_page, offset_in_page(seg->mr_offset),
490				seg->mr_dmalen, seg->mr_dir);
491	else
492		seg->mr_dma = ib_dma_map_single(device,
493				seg->mr_offset,
494				seg->mr_dmalen, seg->mr_dir);
495
496	if (ib_dma_mapping_error(device, seg->mr_dma))
497		rpcrdma_mapping_error(seg);
498}
499
500static inline void
501rpcrdma_unmap_one(struct ib_device *device, struct rpcrdma_mr_seg *seg)
502{
503	if (seg->mr_page)
504		ib_dma_unmap_page(device,
505				  seg->mr_dma, seg->mr_dmalen, seg->mr_dir);
506	else
507		ib_dma_unmap_single(device,
508				    seg->mr_dma, seg->mr_dmalen, seg->mr_dir);
509}
510
511/*
512 * RPC/RDMA connection management calls - xprtrdma/rpc_rdma.c
513 */
514void rpcrdma_connect_worker(struct work_struct *);
515void rpcrdma_conn_func(struct rpcrdma_ep *);
516void rpcrdma_reply_handler(struct rpcrdma_rep *);
 
 
 
 
 
 
 
 
 
517
518/*
519 * RPC/RDMA protocol calls - xprtrdma/rpc_rdma.c
520 */
521int rpcrdma_marshal_req(struct rpc_rqst *);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
522
523/* RPC/RDMA module init - xprtrdma/transport.c
524 */
525extern unsigned int xprt_rdma_max_inline_read;
 
526void xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap);
527void xprt_rdma_free_addresses(struct rpc_xprt *xprt);
 
528void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq);
529int xprt_rdma_init(void);
530void xprt_rdma_cleanup(void);
531
532/* Backchannel calls - xprtrdma/backchannel.c
533 */
534#if defined(CONFIG_SUNRPC_BACKCHANNEL)
535int xprt_rdma_bc_setup(struct rpc_xprt *, unsigned int);
536int xprt_rdma_bc_up(struct svc_serv *, struct net *);
 
537int rpcrdma_bc_post_recv(struct rpcrdma_xprt *, unsigned int);
538void rpcrdma_bc_receive_call(struct rpcrdma_xprt *, struct rpcrdma_rep *);
539int rpcrdma_bc_marshal_reply(struct rpc_rqst *);
540void xprt_rdma_bc_free_rqst(struct rpc_rqst *);
541void xprt_rdma_bc_destroy(struct rpc_xprt *, unsigned int);
542#endif	/* CONFIG_SUNRPC_BACKCHANNEL */
543
544extern struct xprt_class xprt_rdma_bc;
545
546#endif				/* _LINUX_SUNRPC_XPRT_RDMA_H */
v5.9
  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.h> 	/* RPC/RDMA protocol */
 57#include <linux/sunrpc/xprtrdma.h> 	/* xprt parameters */
 58
 59#define RDMA_RESOLVE_TIMEOUT	(5000)	/* 5 seconds */
 60#define RDMA_CONNECT_RETRY_MAX	(2)	/* retries if no listener backlog */
 61
 62#define RPCRDMA_BIND_TO		(60U * HZ)
 63#define RPCRDMA_INIT_REEST_TO	(5U * HZ)
 64#define RPCRDMA_MAX_REEST_TO	(30U * HZ)
 65#define RPCRDMA_IDLE_DISC_TO	(5U * 60 * HZ)
 66
 67/*
 68 * RDMA Endpoint -- connection endpoint details
 69 */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 70struct rpcrdma_ep {
 71	struct kref		re_kref;
 72	struct rdma_cm_id 	*re_id;
 73	struct ib_pd		*re_pd;
 74	unsigned int		re_max_rdma_segs;
 75	unsigned int		re_max_fr_depth;
 76	bool			re_implicit_roundup;
 77	enum ib_mr_type		re_mrtype;
 78	struct completion	re_done;
 79	unsigned int		re_send_count;
 80	unsigned int		re_send_batch;
 81	unsigned int		re_max_inline_send;
 82	unsigned int		re_max_inline_recv;
 83	int			re_async_rc;
 84	int			re_connect_status;
 85	atomic_t		re_force_disconnect;
 86	struct ib_qp_init_attr	re_attr;
 87	wait_queue_head_t       re_connect_wait;
 88	struct rpc_xprt		*re_xprt;
 89	struct rpcrdma_connect_private
 90				re_cm_private;
 91	struct rdma_conn_param	re_remote_cma;
 92	int			re_receive_count;
 93	unsigned int		re_max_requests; /* depends on device */
 94	unsigned int		re_inline_send;	/* negotiated */
 95	unsigned int		re_inline_recv;	/* negotiated */
 96};
 97
 
 
 
 98/* Pre-allocate extra Work Requests for handling backward receives
 99 * and sends. This is a fixed value because the Work Queues are
100 * allocated when the forward channel is set up, long before the
101 * backchannel is provisioned. This value is two times
102 * NFS4_DEF_CB_SLOT_TABLE_SIZE.
103 */
104#if defined(CONFIG_SUNRPC_BACKCHANNEL)
105#define RPCRDMA_BACKWARD_WRS (32)
106#else
107#define RPCRDMA_BACKWARD_WRS (0)
108#endif
109
110/* Registered buffer -- registered kmalloc'd memory for RDMA SEND/RECV
 
 
 
111 */
112
113struct rpcrdma_regbuf {
 
 
114	struct ib_sge		rg_iov;
115	struct ib_device	*rg_device;
116	enum dma_data_direction	rg_direction;
117	void			*rg_data;
118};
119
120static inline u64 rdmab_addr(struct rpcrdma_regbuf *rb)
 
121{
122	return rb->rg_iov.addr;
123}
124
125static inline u32 rdmab_length(struct rpcrdma_regbuf *rb)
 
126{
127	return rb->rg_iov.length;
128}
129
130static inline u32 rdmab_lkey(struct rpcrdma_regbuf *rb)
 
131{
132	return rb->rg_iov.lkey;
133}
134
135static inline struct ib_device *rdmab_device(struct rpcrdma_regbuf *rb)
 
136{
137	return rb->rg_device;
138}
139
140static inline void *rdmab_data(const struct rpcrdma_regbuf *rb)
141{
142	return rb->rg_data;
143}
144
145#define RPCRDMA_DEF_GFP		(GFP_NOIO | __GFP_NOWARN)
146
147/* To ensure a transport can always make forward progress,
148 * the number of RDMA segments allowed in header chunk lists
149 * is capped at 16. This prevents less-capable devices from
150 * overrunning the Send buffer while building chunk lists.
 
 
 
 
 
 
 
 
151 *
152 * Elements of the Read list take up more room than the
153 * Write list or Reply chunk. 16 read segments means the
154 * chunk lists cannot consume more than
155 *
156 * ((16 + 2) * read segment size) + 1 XDR words,
157 *
158 * or about 400 bytes. The fixed part of the header is
159 * another 24 bytes. Thus when the inline threshold is
160 * 1024 bytes, at least 600 bytes are available for RPC
161 * message bodies.
162 */
163enum {
164	RPCRDMA_MAX_HDR_SEGS = 16,
165};
166
167/*
168 * struct rpcrdma_rep -- this structure encapsulates state required
169 * to receive and complete an RPC Reply, asychronously. It needs
170 * several pieces of state:
171 *
172 *   o receive buffer and ib_sge (donated to provider)
173 *   o status of receive (success or not, length, inv rkey)
174 *   o bookkeeping state to get run by reply handler (XDR stream)
175 *
176 * These structures are allocated during transport initialization.
177 * N of these are associated with a transport instance, managed by
178 * struct rpcrdma_buffer. N is the max number of outstanding RPCs.
179 */
180
181struct rpcrdma_rep {
182	struct ib_cqe		rr_cqe;
183	__be32			rr_xid;
184	__be32			rr_vers;
185	__be32			rr_proc;
186	int			rr_wc_flags;
187	u32			rr_inv_rkey;
188	bool			rr_temp;
189	struct rpcrdma_regbuf	*rr_rdmabuf;
190	struct rpcrdma_xprt	*rr_rxprt;
191	struct rpc_rqst		*rr_rqst;
192	struct xdr_buf		rr_hdrbuf;
193	struct xdr_stream	rr_stream;
194	struct llist_node	rr_node;
195	struct ib_recv_wr	rr_recv_wr;
196	struct list_head	rr_all;
197};
198
199/* To reduce the rate at which a transport invokes ib_post_recv
200 * (and thus the hardware doorbell rate), xprtrdma posts Receive
201 * WRs in batches.
202 *
203 * Setting this to zero disables Receive post batching.
204 */
205enum {
206	RPCRDMA_MAX_RECV_BATCH = 7,
207};
208
209/* struct rpcrdma_sendctx - DMA mapped SGEs to unmap after Send completes
210 */
211struct rpcrdma_req;
212struct rpcrdma_sendctx {
213	struct ib_cqe		sc_cqe;
214	struct rpcrdma_req	*sc_req;
215	unsigned int		sc_unmap_count;
216	struct ib_sge		sc_sges[];
217};
218
219/*
220 * struct rpcrdma_mr - external memory region metadata
221 *
222 * An external memory region is any buffer or page that is registered
223 * on the fly (ie, not pre-registered).
224 */
225struct rpcrdma_frwr {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
226	struct ib_mr			*fr_mr;
227	struct ib_cqe			fr_cqe;
 
228	struct completion		fr_linv_done;
 
 
229	union {
230		struct ib_reg_wr	fr_regwr;
231		struct ib_send_wr	fr_invwr;
232	};
233};
234
235struct rpcrdma_req;
236struct rpcrdma_mr {
237	struct list_head	mr_list;
238	struct rpcrdma_req	*mr_req;
239	struct scatterlist	*mr_sg;
240	int			mr_nents;
241	enum dma_data_direction	mr_dir;
242	struct rpcrdma_frwr	frwr;
243	struct rpcrdma_xprt	*mr_xprt;
244	u32			mr_handle;
245	u32			mr_length;
246	u64			mr_offset;
247	struct list_head	mr_all;
248};
249
250/*
251 * struct rpcrdma_req -- structure central to the request/reply sequence.
252 *
253 * N of these are associated with a transport instance, and stored in
254 * struct rpcrdma_buffer. N is the max number of outstanding requests.
255 *
256 * It includes pre-registered buffer memory for send AND recv.
257 * The recv buffer, however, is not owned by this structure, and
258 * is "donated" to the hardware when a recv is posted. When a
259 * reply is handled, the recv buffer used is given back to the
260 * struct rpcrdma_req associated with the request.
261 *
262 * In addition to the basic memory, this structure includes an array
263 * of iovs for send operations. The reason is that the iovs passed to
264 * ib_post_{send,recv} must not be modified until the work request
265 * completes.
 
 
 
 
 
 
266 */
267
268/* Maximum number of page-sized "segments" per chunk list to be
269 * registered or invalidated. Must handle a Reply chunk:
270 */
271enum {
272	RPCRDMA_MAX_IOV_SEGS	= 3,
273	RPCRDMA_MAX_DATA_SEGS	= ((1 * 1024 * 1024) / PAGE_SIZE) + 1,
274	RPCRDMA_MAX_SEGS	= RPCRDMA_MAX_DATA_SEGS +
275				  RPCRDMA_MAX_IOV_SEGS,
276};
277
278struct rpcrdma_mr_seg {		/* chunk descriptors */
 
 
 
279	u32		mr_len;		/* length of chunk or segment */
 
 
 
 
280	struct page	*mr_page;	/* owning page, if any */
281	char		*mr_offset;	/* kva if no page, else offset */
282};
283
284/* The Send SGE array is provisioned to send a maximum size
285 * inline request:
286 * - RPC-over-RDMA header
287 * - xdr_buf head iovec
288 * - RPCRDMA_MAX_INLINE bytes, in pages
289 * - xdr_buf tail iovec
290 *
291 * The actual number of array elements consumed by each RPC
292 * depends on the device's max_sge limit.
293 */
294enum {
295	RPCRDMA_MIN_SEND_SGES = 3,
296	RPCRDMA_MAX_PAGE_SGES = RPCRDMA_MAX_INLINE >> PAGE_SHIFT,
297	RPCRDMA_MAX_SEND_SGES = 1 + 1 + RPCRDMA_MAX_PAGE_SGES + 1,
298};
299
300struct rpcrdma_buffer;
301struct rpcrdma_req {
302	struct list_head	rl_list;
303	struct rpc_rqst		rl_slot;
304	struct rpcrdma_rep	*rl_reply;
305	struct xdr_stream	rl_stream;
306	struct xdr_buf		rl_hdrbuf;
307	struct ib_send_wr	rl_wr;
308	struct rpcrdma_sendctx	*rl_sendctx;
309	struct rpcrdma_regbuf	*rl_rdmabuf;	/* xprt header */
310	struct rpcrdma_regbuf	*rl_sendbuf;	/* rq_snd_buf */
311	struct rpcrdma_regbuf	*rl_recvbuf;	/* rq_rcv_buf */
312
 
313	struct list_head	rl_all;
314	struct kref		rl_kref;
315
316	struct list_head	rl_free_mrs;
317	struct list_head	rl_registered;
318	struct rpcrdma_mr_seg	rl_segments[RPCRDMA_MAX_SEGS];
319};
320
321static inline struct rpcrdma_req *
322rpcr_to_rdmar(const struct rpc_rqst *rqst)
323{
324	return container_of(rqst, struct rpcrdma_req, rl_slot);
325}
326
327static inline void
328rpcrdma_mr_push(struct rpcrdma_mr *mr, struct list_head *list)
329{
330	list_add(&mr->mr_list, list);
331}
332
333static inline struct rpcrdma_mr *
334rpcrdma_mr_pop(struct list_head *list)
335{
336	struct rpcrdma_mr *mr;
337
338	mr = list_first_entry_or_null(list, struct rpcrdma_mr, mr_list);
339	if (mr)
340		list_del_init(&mr->mr_list);
341	return mr;
342}
343
344/*
345 * struct rpcrdma_buffer -- holds list/queue of pre-registered memory for
346 * inline requests/replies, and client/server credits.
347 *
348 * One of these is associated with a transport instance
349 */
350struct rpcrdma_buffer {
351	spinlock_t		rb_lock;
 
 
 
 
 
352	struct list_head	rb_send_bufs;
353	struct list_head	rb_mrs;
 
 
354
355	unsigned long		rb_sc_head;
356	unsigned long		rb_sc_tail;
357	unsigned long		rb_sc_last;
358	struct rpcrdma_sendctx	**rb_sc_ctxs;
359
360	struct list_head	rb_allreqs;
361	struct list_head	rb_all_mrs;
362	struct list_head	rb_all_reps;
363
364	struct llist_head	rb_free_reps;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
365
366	__be32			rb_max_requests;
367	u32			rb_credits;	/* most recent credit grant */
368
369	u32			rb_bc_srv_max_requests;
370	u32			rb_bc_max_requests;
371
372	struct work_struct	rb_refresh_worker;
373};
374
375/*
376 * Statistics for RPCRDMA
377 */
378struct rpcrdma_stats {
379	/* accessed when sending a call */
380	unsigned long		read_chunk_count;
381	unsigned long		write_chunk_count;
382	unsigned long		reply_chunk_count;
 
383	unsigned long long	total_rdma_request;
 
384
385	/* rarely accessed error counters */
386	unsigned long long	pullup_copy_count;
 
387	unsigned long		hardway_register_count;
388	unsigned long		failed_marshal_count;
389	unsigned long		bad_reply_count;
390	unsigned long		mrs_recycled;
391	unsigned long		mrs_orphaned;
392	unsigned long		mrs_allocated;
393	unsigned long		empty_sendctx_q;
394
395	/* accessed when receiving a reply */
396	unsigned long long	total_rdma_reply;
397	unsigned long long	fixup_copy_count;
398	unsigned long		reply_waits_for_send;
399	unsigned long		local_inv_needed;
400	unsigned long		nomsg_call_count;
401	unsigned long		bcall_count;
402};
403
404/*
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405 * RPCRDMA transport -- encapsulates the structures above for
406 * integration with RPC.
407 *
408 * The contained structures are embedded, not pointers,
409 * for convenience. This structure need not be visible externally.
410 *
411 * It is allocated and initialized during mount, and released
412 * during unmount.
413 */
414struct rpcrdma_xprt {
415	struct rpc_xprt		rx_xprt;
416	struct rpcrdma_ep	*rx_ep;
 
417	struct rpcrdma_buffer	rx_buf;
 
418	struct delayed_work	rx_connect_worker;
419	struct rpc_timeout	rx_timeout;
420	struct rpcrdma_stats	rx_stats;
421};
422
423#define rpcx_to_rdmax(x) container_of(x, struct rpcrdma_xprt, rx_xprt)
424
425static inline const char *
426rpcrdma_addrstr(const struct rpcrdma_xprt *r_xprt)
427{
428	return r_xprt->rx_xprt.address_strings[RPC_DISPLAY_ADDR];
429}
430
431static inline const char *
432rpcrdma_portstr(const struct rpcrdma_xprt *r_xprt)
433{
434	return r_xprt->rx_xprt.address_strings[RPC_DISPLAY_PORT];
435}
436
437/* Setting this to 0 ensures interoperability with early servers.
438 * Setting this to 1 enhances certain unaligned read/write performance.
439 * Default is 0, see sysctl entry and rpc_rdma.c rpcrdma_convert_iovs() */
440extern int xprt_rdma_pad_optimize;
441
442/* This setting controls the hunt for a supported memory
443 * registration strategy.
444 */
445extern unsigned int xprt_rdma_memreg_strategy;
 
446
447/*
448 * Endpoint calls - xprtrdma/verbs.c
449 */
450void rpcrdma_flush_disconnect(struct rpcrdma_xprt *r_xprt, struct ib_wc *wc);
451int rpcrdma_xprt_connect(struct rpcrdma_xprt *r_xprt);
452void rpcrdma_xprt_disconnect(struct rpcrdma_xprt *r_xprt);
453
454int rpcrdma_post_sends(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
455void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, bool temp);
 
 
 
 
456
457/*
458 * Buffer calls - xprtrdma/verbs.c
459 */
460struct rpcrdma_req *rpcrdma_req_create(struct rpcrdma_xprt *r_xprt, size_t size,
461				       gfp_t flags);
462int rpcrdma_req_setup(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
463void rpcrdma_req_destroy(struct rpcrdma_req *req);
464int rpcrdma_buffer_create(struct rpcrdma_xprt *);
465void rpcrdma_buffer_destroy(struct rpcrdma_buffer *);
466struct rpcrdma_sendctx *rpcrdma_sendctx_get_locked(struct rpcrdma_xprt *r_xprt);
467
468struct rpcrdma_mr *rpcrdma_mr_get(struct rpcrdma_xprt *r_xprt);
469void rpcrdma_mr_put(struct rpcrdma_mr *mr);
470void rpcrdma_mrs_refresh(struct rpcrdma_xprt *r_xprt);
471
 
 
472struct rpcrdma_req *rpcrdma_buffer_get(struct rpcrdma_buffer *);
473void rpcrdma_buffer_put(struct rpcrdma_buffer *buffers,
474			struct rpcrdma_req *req);
475void rpcrdma_recv_buffer_put(struct rpcrdma_rep *);
476
477bool rpcrdma_regbuf_realloc(struct rpcrdma_regbuf *rb, size_t size,
478			    gfp_t flags);
479bool __rpcrdma_regbuf_dma_map(struct rpcrdma_xprt *r_xprt,
480			      struct rpcrdma_regbuf *rb);
481
482/**
483 * rpcrdma_regbuf_is_mapped - check if buffer is DMA mapped
484 *
485 * Returns true if the buffer is now mapped to rb->rg_device.
486 */
487static inline bool rpcrdma_regbuf_is_mapped(struct rpcrdma_regbuf *rb)
488{
489	return rb->rg_device != NULL;
490}
491
492/**
493 * rpcrdma_regbuf_dma_map - DMA-map a regbuf
494 * @r_xprt: controlling transport instance
495 * @rb: regbuf to be mapped
496 *
497 * Returns true if the buffer is currently DMA mapped.
498 */
499static inline bool rpcrdma_regbuf_dma_map(struct rpcrdma_xprt *r_xprt,
500					  struct rpcrdma_regbuf *rb)
501{
502	if (likely(rpcrdma_regbuf_is_mapped(rb)))
503		return true;
504	return __rpcrdma_regbuf_dma_map(r_xprt, rb);
505}
506
507/*
508 * Wrappers for chunk registration, shared by read/write chunk code.
509 */
510
 
 
511static inline enum dma_data_direction
512rpcrdma_data_dir(bool writing)
513{
514	return writing ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
515}
516
517/* Memory registration calls xprtrdma/frwr_ops.c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
518 */
519void frwr_reset(struct rpcrdma_req *req);
520int frwr_query_device(struct rpcrdma_ep *ep, const struct ib_device *device);
521int frwr_mr_init(struct rpcrdma_xprt *r_xprt, struct rpcrdma_mr *mr);
522void frwr_release_mr(struct rpcrdma_mr *mr);
523struct rpcrdma_mr_seg *frwr_map(struct rpcrdma_xprt *r_xprt,
524				struct rpcrdma_mr_seg *seg,
525				int nsegs, bool writing, __be32 xid,
526				struct rpcrdma_mr *mr);
527int frwr_send(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
528void frwr_reminv(struct rpcrdma_rep *rep, struct list_head *mrs);
529void frwr_unmap_sync(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
530void frwr_unmap_async(struct rpcrdma_xprt *r_xprt, struct rpcrdma_req *req);
531
532/*
533 * RPC/RDMA protocol calls - xprtrdma/rpc_rdma.c
534 */
535
536enum rpcrdma_chunktype {
537	rpcrdma_noch = 0,
538	rpcrdma_noch_pullup,
539	rpcrdma_noch_mapped,
540	rpcrdma_readch,
541	rpcrdma_areadch,
542	rpcrdma_writech,
543	rpcrdma_replych
544};
545
546int rpcrdma_prepare_send_sges(struct rpcrdma_xprt *r_xprt,
547			      struct rpcrdma_req *req, u32 hdrlen,
548			      struct xdr_buf *xdr,
549			      enum rpcrdma_chunktype rtype);
550void rpcrdma_sendctx_unmap(struct rpcrdma_sendctx *sc);
551int rpcrdma_marshal_req(struct rpcrdma_xprt *r_xprt, struct rpc_rqst *rqst);
552void rpcrdma_set_max_header_sizes(struct rpcrdma_ep *ep);
553void rpcrdma_reset_cwnd(struct rpcrdma_xprt *r_xprt);
554void rpcrdma_complete_rqst(struct rpcrdma_rep *rep);
555void rpcrdma_reply_handler(struct rpcrdma_rep *rep);
556
557static inline void rpcrdma_set_xdrlen(struct xdr_buf *xdr, size_t len)
558{
559	xdr->head[0].iov_len = len;
560	xdr->len = len;
561}
562
563/* RPC/RDMA module init - xprtrdma/transport.c
564 */
565extern unsigned int xprt_rdma_max_inline_read;
566extern unsigned int xprt_rdma_max_inline_write;
567void xprt_rdma_format_addresses(struct rpc_xprt *xprt, struct sockaddr *sap);
568void xprt_rdma_free_addresses(struct rpc_xprt *xprt);
569void xprt_rdma_close(struct rpc_xprt *xprt);
570void xprt_rdma_print_stats(struct rpc_xprt *xprt, struct seq_file *seq);
571int xprt_rdma_init(void);
572void xprt_rdma_cleanup(void);
573
574/* Backchannel calls - xprtrdma/backchannel.c
575 */
576#if defined(CONFIG_SUNRPC_BACKCHANNEL)
577int xprt_rdma_bc_setup(struct rpc_xprt *, unsigned int);
578size_t xprt_rdma_bc_maxpayload(struct rpc_xprt *);
579unsigned int xprt_rdma_bc_max_slots(struct rpc_xprt *);
580int rpcrdma_bc_post_recv(struct rpcrdma_xprt *, unsigned int);
581void rpcrdma_bc_receive_call(struct rpcrdma_xprt *, struct rpcrdma_rep *);
582int xprt_rdma_bc_send_reply(struct rpc_rqst *rqst);
583void xprt_rdma_bc_free_rqst(struct rpc_rqst *);
584void xprt_rdma_bc_destroy(struct rpc_xprt *, unsigned int);
585#endif	/* CONFIG_SUNRPC_BACKCHANNEL */
586
587extern struct xprt_class xprt_rdma_bc;
588
589#endif				/* _LINUX_SUNRPC_XPRT_RDMA_H */