1
2
3
4
5
6
7
8
9
10#ifndef _LINUX_SUNRPC_XPRT_H
11#define _LINUX_SUNRPC_XPRT_H
12
13#include <linux/uio.h>
14#include <linux/socket.h>
15#include <linux/in.h>
16#include <linux/ktime.h>
17#include <linux/kref.h>
18#include <linux/sunrpc/sched.h>
19#include <linux/sunrpc/xdr.h>
20#include <linux/sunrpc/msg_prot.h>
21
22#ifdef __KERNEL__
23
24#define RPC_MIN_SLOT_TABLE (2U)
25#define RPC_DEF_SLOT_TABLE (16U)
26#define RPC_MAX_SLOT_TABLE_LIMIT (65536U)
27#define RPC_MAX_SLOT_TABLE RPC_MAX_SLOT_TABLE_LIMIT
28
29#define RPC_CWNDSHIFT (8U)
30#define RPC_CWNDSCALE (1U << RPC_CWNDSHIFT)
31#define RPC_INITCWND RPC_CWNDSCALE
32#define RPC_MAXCWND(xprt) ((xprt)->max_reqs << RPC_CWNDSHIFT)
33#define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd)
34
35
36
37
38struct rpc_timeout {
39 unsigned long to_initval,
40 to_maxval,
41 to_increment;
42 unsigned int to_retries;
43 unsigned char to_exponential;
44};
45
46enum rpc_display_format_t {
47 RPC_DISPLAY_ADDR = 0,
48 RPC_DISPLAY_PORT,
49 RPC_DISPLAY_PROTO,
50 RPC_DISPLAY_HEX_ADDR,
51 RPC_DISPLAY_HEX_PORT,
52 RPC_DISPLAY_NETID,
53 RPC_DISPLAY_MAX,
54};
55
56struct rpc_task;
57struct rpc_xprt;
58struct seq_file;
59struct svc_serv;
60struct net;
61
62
63
64
65struct rpc_rqst {
66
67
68
69 struct rpc_xprt * rq_xprt;
70 struct xdr_buf rq_snd_buf;
71 struct xdr_buf rq_rcv_buf;
72
73
74
75
76 struct rpc_task * rq_task;
77 struct rpc_cred * rq_cred;
78 __be32 rq_xid;
79 int rq_cong;
80 u32 rq_seqno;
81 int rq_enc_pages_num;
82 struct page **rq_enc_pages;
83
84 void (*rq_release_snd_buf)(struct rpc_rqst *);
85 struct list_head rq_list;
86
87 void *rq_xprtdata;
88 void *rq_buffer;
89 size_t rq_callsize;
90 void *rq_rbuffer;
91 size_t rq_rcvsize;
92 size_t rq_xmit_bytes_sent;
93 size_t rq_reply_bytes_recvd;
94
95
96 struct xdr_buf rq_private_buf;
97
98
99 unsigned long rq_majortimeo;
100 unsigned long rq_timeout;
101 ktime_t rq_rtt;
102 unsigned int rq_retries;
103 unsigned int rq_connect_cookie;
104
105
106
107
108
109
110
111 u32 rq_bytes_sent;
112
113 ktime_t rq_xtime;
114 int rq_ntrans;
115
116#if defined(CONFIG_SUNRPC_BACKCHANNEL)
117 struct list_head rq_bc_list;
118 unsigned long rq_bc_pa_state;
119 struct list_head rq_bc_pa_list;
120#endif
121};
122#define rq_svec rq_snd_buf.head
123#define rq_slen rq_snd_buf.len
124
125struct rpc_xprt_ops {
126 void (*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize);
127 int (*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
128 void (*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
129 void (*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
130 void (*rpcbind)(struct rpc_task *task);
131 void (*set_port)(struct rpc_xprt *xprt, unsigned short port);
132 void (*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
133 int (*buf_alloc)(struct rpc_task *task);
134 void (*buf_free)(struct rpc_task *task);
135 int (*send_request)(struct rpc_task *task);
136 void (*set_retrans_timeout)(struct rpc_task *task);
137 void (*timer)(struct rpc_xprt *xprt, struct rpc_task *task);
138 void (*release_request)(struct rpc_task *task);
139 void (*close)(struct rpc_xprt *xprt);
140 void (*destroy)(struct rpc_xprt *xprt);
141 void (*set_connect_timeout)(struct rpc_xprt *xprt,
142 unsigned long connect_timeout,
143 unsigned long reconnect_timeout);
144 void (*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq);
145 int (*enable_swap)(struct rpc_xprt *xprt);
146 void (*disable_swap)(struct rpc_xprt *xprt);
147 void (*inject_disconnect)(struct rpc_xprt *xprt);
148 int (*bc_setup)(struct rpc_xprt *xprt,
149 unsigned int min_reqs);
150 int (*bc_up)(struct svc_serv *serv, struct net *net);
151 size_t (*bc_maxpayload)(struct rpc_xprt *xprt);
152 void (*bc_free_rqst)(struct rpc_rqst *rqst);
153 void (*bc_destroy)(struct rpc_xprt *xprt,
154 unsigned int max_reqs);
155};
156
157
158
159
160
161
162
163
164
165
166#define XPRT_TRANSPORT_BC (1 << 31)
167enum xprt_transports {
168 XPRT_TRANSPORT_UDP = IPPROTO_UDP,
169 XPRT_TRANSPORT_TCP = IPPROTO_TCP,
170 XPRT_TRANSPORT_BC_TCP = IPPROTO_TCP | XPRT_TRANSPORT_BC,
171 XPRT_TRANSPORT_RDMA = 256,
172 XPRT_TRANSPORT_BC_RDMA = XPRT_TRANSPORT_RDMA | XPRT_TRANSPORT_BC,
173 XPRT_TRANSPORT_LOCAL = 257,
174};
175
176struct rpc_xprt {
177 struct kref kref;
178 const struct rpc_xprt_ops *ops;
179
180 const struct rpc_timeout *timeout;
181 struct sockaddr_storage addr;
182 size_t addrlen;
183 int prot;
184
185 unsigned long cong;
186 unsigned long cwnd;
187
188 size_t max_payload;
189
190 unsigned int tsh_size;
191
192
193 struct rpc_wait_queue binding;
194 struct rpc_wait_queue sending;
195 struct rpc_wait_queue pending;
196 struct rpc_wait_queue backlog;
197 struct list_head free;
198 unsigned int max_reqs;
199 unsigned int min_reqs;
200 atomic_t num_reqs;
201 unsigned long state;
202 unsigned char resvport : 1;
203 atomic_t swapper;
204
205 unsigned int bind_index;
206
207
208
209
210 struct list_head xprt_switch;
211
212
213
214
215 unsigned long bind_timeout,
216 reestablish_timeout;
217 unsigned int connect_cookie;
218
219
220
221
222
223
224 struct work_struct task_cleanup;
225 struct timer_list timer;
226 unsigned long last_used,
227 idle_timeout,
228 connect_timeout,
229 max_reconnect_timeout;
230
231
232
233
234 spinlock_t transport_lock;
235 spinlock_t reserve_lock;
236 spinlock_t recv_lock;
237 u32 xid;
238 struct rpc_task * snd_task;
239 struct svc_xprt *bc_xprt;
240#if defined(CONFIG_SUNRPC_BACKCHANNEL)
241 struct svc_serv *bc_serv;
242
243 int bc_alloc_count;
244 atomic_t bc_free_slots;
245 spinlock_t bc_pa_lock;
246
247 struct list_head bc_pa_list;
248
249#endif
250 struct list_head recv;
251
252 struct {
253 unsigned long bind_count,
254 connect_count,
255 connect_start,
256 connect_time,
257 sends,
258 recvs,
259 bad_xids,
260 max_slots;
261
262 unsigned long long req_u,
263 bklog_u,
264 sending_u,
265 pending_u;
266 } stat;
267
268 struct net *xprt_net;
269 const char *servername;
270 const char *address_strings[RPC_DISPLAY_MAX];
271#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
272 struct dentry *debugfs;
273 atomic_t inject_disconnect;
274#endif
275 struct rcu_head rcu;
276};
277
278#if defined(CONFIG_SUNRPC_BACKCHANNEL)
279
280
281
282#define RPC_BC_PA_IN_USE 0x0001
283
284#endif
285
286#if defined(CONFIG_SUNRPC_BACKCHANNEL)
287static inline int bc_prealloc(struct rpc_rqst *req)
288{
289 return test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
290}
291#else
292static inline int bc_prealloc(struct rpc_rqst *req)
293{
294 return 0;
295}
296#endif
297
298#define XPRT_CREATE_INFINITE_SLOTS (1U)
299#define XPRT_CREATE_NO_IDLE_TIMEOUT (1U << 1)
300
301struct xprt_create {
302 int ident;
303 struct net * net;
304 struct sockaddr * srcaddr;
305 struct sockaddr * dstaddr;
306 size_t addrlen;
307 const char *servername;
308 struct svc_xprt *bc_xprt;
309 struct rpc_xprt_switch *bc_xps;
310 unsigned int flags;
311};
312
313struct xprt_class {
314 struct list_head list;
315 int ident;
316 struct rpc_xprt * (*setup)(struct xprt_create *);
317 struct module *owner;
318 char name[32];
319};
320
321
322
323
324struct rpc_xprt *xprt_create_transport(struct xprt_create *args);
325void xprt_connect(struct rpc_task *task);
326void xprt_reserve(struct rpc_task *task);
327void xprt_retry_reserve(struct rpc_task *task);
328int xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
329int xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
330void xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
331void xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
332bool xprt_prepare_transmit(struct rpc_task *task);
333void xprt_transmit(struct rpc_task *task);
334void xprt_end_transmit(struct rpc_task *task);
335int xprt_adjust_timeout(struct rpc_rqst *req);
336void xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
337void xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
338void xprt_release(struct rpc_task *task);
339struct rpc_xprt * xprt_get(struct rpc_xprt *xprt);
340void xprt_put(struct rpc_xprt *xprt);
341struct rpc_xprt * xprt_alloc(struct net *net, size_t size,
342 unsigned int num_prealloc,
343 unsigned int max_req);
344void xprt_free(struct rpc_xprt *);
345
346static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
347{
348 return p + xprt->tsh_size;
349}
350
351static inline int
352xprt_enable_swap(struct rpc_xprt *xprt)
353{
354 return xprt->ops->enable_swap(xprt);
355}
356
357static inline void
358xprt_disable_swap(struct rpc_xprt *xprt)
359{
360 xprt->ops->disable_swap(xprt);
361}
362
363
364
365
366int xprt_register_transport(struct xprt_class *type);
367int xprt_unregister_transport(struct xprt_class *type);
368int xprt_load_transport(const char *);
369void xprt_set_retrans_timeout_def(struct rpc_task *task);
370void xprt_set_retrans_timeout_rtt(struct rpc_task *task);
371void xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
372void xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action);
373void xprt_write_space(struct rpc_xprt *xprt);
374void xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result);
375struct rpc_rqst * xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
376void xprt_complete_rqst(struct rpc_task *task, int copied);
377void xprt_pin_rqst(struct rpc_rqst *req);
378void xprt_unpin_rqst(struct rpc_rqst *req);
379void xprt_release_rqst_cong(struct rpc_task *task);
380void xprt_disconnect_done(struct rpc_xprt *xprt);
381void xprt_force_disconnect(struct rpc_xprt *xprt);
382void xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
383
384bool xprt_lock_connect(struct rpc_xprt *, struct rpc_task *, void *);
385void xprt_unlock_connect(struct rpc_xprt *, void *);
386
387
388
389
390#define XPRT_LOCKED (0)
391#define XPRT_CONNECTED (1)
392#define XPRT_CONNECTING (2)
393#define XPRT_CLOSE_WAIT (3)
394#define XPRT_BOUND (4)
395#define XPRT_BINDING (5)
396#define XPRT_CLOSING (6)
397#define XPRT_CONGESTED (9)
398
399static inline void xprt_set_connected(struct rpc_xprt *xprt)
400{
401 set_bit(XPRT_CONNECTED, &xprt->state);
402}
403
404static inline void xprt_clear_connected(struct rpc_xprt *xprt)
405{
406 clear_bit(XPRT_CONNECTED, &xprt->state);
407}
408
409static inline int xprt_connected(struct rpc_xprt *xprt)
410{
411 return test_bit(XPRT_CONNECTED, &xprt->state);
412}
413
414static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt)
415{
416 return test_and_set_bit(XPRT_CONNECTED, &xprt->state);
417}
418
419static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt)
420{
421 return test_and_clear_bit(XPRT_CONNECTED, &xprt->state);
422}
423
424static inline void xprt_clear_connecting(struct rpc_xprt *xprt)
425{
426 smp_mb__before_atomic();
427 clear_bit(XPRT_CONNECTING, &xprt->state);
428 smp_mb__after_atomic();
429}
430
431static inline int xprt_connecting(struct rpc_xprt *xprt)
432{
433 return test_bit(XPRT_CONNECTING, &xprt->state);
434}
435
436static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt)
437{
438 return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
439}
440
441static inline void xprt_set_bound(struct rpc_xprt *xprt)
442{
443 test_and_set_bit(XPRT_BOUND, &xprt->state);
444}
445
446static inline int xprt_bound(struct rpc_xprt *xprt)
447{
448 return test_bit(XPRT_BOUND, &xprt->state);
449}
450
451static inline void xprt_clear_bound(struct rpc_xprt *xprt)
452{
453 clear_bit(XPRT_BOUND, &xprt->state);
454}
455
456static inline void xprt_clear_binding(struct rpc_xprt *xprt)
457{
458 smp_mb__before_atomic();
459 clear_bit(XPRT_BINDING, &xprt->state);
460 smp_mb__after_atomic();
461}
462
463static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
464{
465 return test_and_set_bit(XPRT_BINDING, &xprt->state);
466}
467
468#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
469extern unsigned int rpc_inject_disconnect;
470static inline void xprt_inject_disconnect(struct rpc_xprt *xprt)
471{
472 if (!rpc_inject_disconnect)
473 return;
474 if (atomic_dec_return(&xprt->inject_disconnect))
475 return;
476 atomic_set(&xprt->inject_disconnect, rpc_inject_disconnect);
477 xprt->ops->inject_disconnect(xprt);
478}
479#else
480static inline void xprt_inject_disconnect(struct rpc_xprt *xprt)
481{
482}
483#endif
484
485#endif
486
487#endif
488