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