xprt_rdma.h 18 KB

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