1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42#ifndef SVC_RDMA_H
43#define SVC_RDMA_H
44#include <linux/sunrpc/xdr.h>
45#include <linux/sunrpc/svcsock.h>
46#include <linux/sunrpc/rpc_rdma.h>
47#include <rdma/ib_verbs.h>
48#include <rdma/rdma_cm.h>
49#define SVCRDMA_DEBUG
50
51
52extern unsigned int svcrdma_ord;
53extern unsigned int svcrdma_max_requests;
54extern unsigned int svcrdma_max_bc_requests;
55extern unsigned int svcrdma_max_req_size;
56
57extern atomic_t rdma_stat_recv;
58extern atomic_t rdma_stat_read;
59extern atomic_t rdma_stat_write;
60extern atomic_t rdma_stat_sq_starve;
61extern atomic_t rdma_stat_rq_starve;
62extern atomic_t rdma_stat_rq_poll;
63extern atomic_t rdma_stat_rq_prod;
64extern atomic_t rdma_stat_sq_poll;
65extern atomic_t rdma_stat_sq_prod;
66
67
68
69
70
71
72struct svc_rdma_op_ctxt {
73 struct list_head free;
74 struct svc_rdma_op_ctxt *read_hdr;
75 struct svc_rdma_fastreg_mr *frmr;
76 int hdr_count;
77 struct xdr_buf arg;
78 struct ib_cqe cqe;
79 struct ib_cqe reg_cqe;
80 struct ib_cqe inv_cqe;
81 struct list_head dto_q;
82 u32 byte_len;
83 u32 position;
84 struct svcxprt_rdma *xprt;
85 unsigned long flags;
86 enum dma_data_direction direction;
87 int count;
88 unsigned int mapped_sges;
89 struct ib_sge sge[RPCSVC_MAXPAGES];
90 struct page *pages[RPCSVC_MAXPAGES];
91};
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106struct svc_rdma_chunk_sge {
107 int start;
108 int count;
109};
110struct svc_rdma_fastreg_mr {
111 struct ib_mr *mr;
112 struct scatterlist *sg;
113 int sg_nents;
114 unsigned long access_flags;
115 enum dma_data_direction direction;
116 struct list_head frmr_list;
117};
118struct svc_rdma_req_map {
119 struct list_head free;
120 unsigned long count;
121 union {
122 struct kvec sge[RPCSVC_MAXPAGES];
123 struct svc_rdma_chunk_sge ch[RPCSVC_MAXPAGES];
124 unsigned long lkey[RPCSVC_MAXPAGES];
125 };
126};
127#define RDMACTXT_F_LAST_CTXT 2
128
129#define SVCRDMA_DEVCAP_FAST_REG 1
130#define SVCRDMA_DEVCAP_READ_W_INV 2
131
132struct svcxprt_rdma {
133 struct svc_xprt sc_xprt;
134 struct rdma_cm_id *sc_cm_id;
135 struct list_head sc_accept_q;
136 int sc_ord;
137 int sc_max_sge;
138 int sc_max_sge_rd;
139 bool sc_snd_w_inv;
140
141 atomic_t sc_sq_avail;
142 unsigned int sc_sq_depth;
143 unsigned int sc_rq_depth;
144 u32 sc_max_requests;
145 u32 sc_max_bc_requests;
146 int sc_max_req_size;
147
148 struct ib_pd *sc_pd;
149
150 spinlock_t sc_ctxt_lock;
151 struct list_head sc_ctxts;
152 int sc_ctxt_used;
153 spinlock_t sc_map_lock;
154 struct list_head sc_maps;
155
156 struct list_head sc_rq_dto_q;
157 spinlock_t sc_rq_dto_lock;
158 struct ib_qp *sc_qp;
159 struct ib_cq *sc_rq_cq;
160 struct ib_cq *sc_sq_cq;
161 int (*sc_reader)(struct svcxprt_rdma *,
162 struct svc_rqst *,
163 struct svc_rdma_op_ctxt *,
164 int *, u32 *, u32, u32, u64, bool);
165 u32 sc_dev_caps;
166 unsigned int sc_frmr_pg_list_len;
167 struct list_head sc_frmr_q;
168 spinlock_t sc_frmr_q_lock;
169
170 spinlock_t sc_lock;
171
172 wait_queue_head_t sc_send_wait;
173 unsigned long sc_flags;
174 struct list_head sc_dto_q;
175 struct list_head sc_read_complete_q;
176 struct work_struct sc_work;
177};
178
179#define RDMAXPRT_CONN_PENDING 3
180
181#define RPCRDMA_LISTEN_BACKLOG 10
182
183
184#define RPCRDMA_ORD (64/4)
185#define RPCRDMA_SQ_DEPTH_MULT 8
186#define RPCRDMA_MAX_REQUESTS 32
187#define RPCRDMA_MAX_REQ_SIZE 4096
188
189
190
191
192#define RPCRDMA_MAX_BC_REQUESTS 2
193
194#define RPCSVC_MAXPAYLOAD_RDMA RPCSVC_MAXPAYLOAD
195
196
197static inline void svc_rdma_count_mappings(struct svcxprt_rdma *rdma,
198 struct svc_rdma_op_ctxt *ctxt)
199{
200 ctxt->mapped_sges++;
201}
202
203
204extern int svc_rdma_handle_bc_reply(struct rpc_xprt *xprt,
205 struct rpcrdma_msg *rmsgp,
206 struct xdr_buf *rcvbuf);
207
208
209extern int svc_rdma_xdr_decode_req(struct xdr_buf *);
210extern int svc_rdma_xdr_encode_error(struct svcxprt_rdma *,
211 struct rpcrdma_msg *,
212 enum rpcrdma_errcode, __be32 *);
213extern void svc_rdma_xdr_encode_write_list(struct rpcrdma_msg *, int);
214extern void svc_rdma_xdr_encode_reply_array(struct rpcrdma_write_array *, int);
215extern void svc_rdma_xdr_encode_array_chunk(struct rpcrdma_write_array *, int,
216 __be32, __be64, u32);
217extern void svc_rdma_xdr_encode_reply_header(struct svcxprt_rdma *,
218 struct rpcrdma_msg *,
219 struct rpcrdma_msg *,
220 enum rpcrdma_proc);
221extern int svc_rdma_xdr_get_reply_hdr_len(struct rpcrdma_msg *);
222
223
224extern int svc_rdma_recvfrom(struct svc_rqst *);
225extern int rdma_read_chunk_lcl(struct svcxprt_rdma *, struct svc_rqst *,
226 struct svc_rdma_op_ctxt *, int *, u32 *,
227 u32, u32, u64, bool);
228extern int rdma_read_chunk_frmr(struct svcxprt_rdma *, struct svc_rqst *,
229 struct svc_rdma_op_ctxt *, int *, u32 *,
230 u32, u32, u64, bool);
231
232
233extern int svc_rdma_map_xdr(struct svcxprt_rdma *, struct xdr_buf *,
234 struct svc_rdma_req_map *, bool);
235extern int svc_rdma_sendto(struct svc_rqst *);
236extern void svc_rdma_send_error(struct svcxprt_rdma *, struct rpcrdma_msg *,
237 int);
238
239
240extern void svc_rdma_wc_send(struct ib_cq *, struct ib_wc *);
241extern void svc_rdma_wc_write(struct ib_cq *, struct ib_wc *);
242extern void svc_rdma_wc_reg(struct ib_cq *, struct ib_wc *);
243extern void svc_rdma_wc_read(struct ib_cq *, struct ib_wc *);
244extern void svc_rdma_wc_inv(struct ib_cq *, struct ib_wc *);
245extern int svc_rdma_send(struct svcxprt_rdma *, struct ib_send_wr *);
246extern int svc_rdma_post_recv(struct svcxprt_rdma *, gfp_t);
247extern int svc_rdma_repost_recv(struct svcxprt_rdma *, gfp_t);
248extern int svc_rdma_create_listen(struct svc_serv *, int, struct sockaddr *);
249extern struct svc_rdma_op_ctxt *svc_rdma_get_context(struct svcxprt_rdma *);
250extern void svc_rdma_put_context(struct svc_rdma_op_ctxt *, int);
251extern void svc_rdma_unmap_dma(struct svc_rdma_op_ctxt *ctxt);
252extern struct svc_rdma_req_map *svc_rdma_get_req_map(struct svcxprt_rdma *);
253extern void svc_rdma_put_req_map(struct svcxprt_rdma *,
254 struct svc_rdma_req_map *);
255extern struct svc_rdma_fastreg_mr *svc_rdma_get_frmr(struct svcxprt_rdma *);
256extern void svc_rdma_put_frmr(struct svcxprt_rdma *,
257 struct svc_rdma_fastreg_mr *);
258extern void svc_sq_reap(struct svcxprt_rdma *);
259extern void svc_rq_reap(struct svcxprt_rdma *);
260extern void svc_rdma_prep_reply_hdr(struct svc_rqst *);
261
262extern struct svc_xprt_class svc_rdma_class;
263#ifdef CONFIG_SUNRPC_BACKCHANNEL
264extern struct svc_xprt_class svc_rdma_bc_class;
265#endif
266
267
268extern struct workqueue_struct *svc_rdma_wq;
269extern int svc_rdma_init(void);
270extern void svc_rdma_cleanup(void);
271
272#endif
273