xprt.h 13.1 KB
Newer Older
L
Linus Torvalds 已提交
1
/*
2
 *  linux/include/linux/sunrpc/xprt.h
L
Linus Torvalds 已提交
3 4 5 6 7 8 9 10 11 12 13 14
 *
 *  Declarations for the RPC transport interface.
 *
 *  Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
 */

#ifndef _LINUX_SUNRPC_XPRT_H
#define _LINUX_SUNRPC_XPRT_H

#include <linux/uio.h>
#include <linux/socket.h>
#include <linux/in.h>
15
#include <linux/ktime.h>
L
Linus Torvalds 已提交
16 17
#include <linux/sunrpc/sched.h>
#include <linux/sunrpc/xdr.h>
18
#include <linux/sunrpc/msg_prot.h>
L
Linus Torvalds 已提交
19

20 21
#ifdef __KERNEL__

L
Linus Torvalds 已提交
22 23
#define RPC_MIN_SLOT_TABLE	(2U)
#define RPC_DEF_SLOT_TABLE	(16U)
24
#define RPC_MAX_SLOT_TABLE_LIMIT	(65536U)
25
#define RPC_MAX_SLOT_TABLE	RPC_MAX_SLOT_TABLE_LIMIT
L
Linus Torvalds 已提交
26

27 28 29 30 31 32
#define RPC_CWNDSHIFT		(8U)
#define RPC_CWNDSCALE		(1U << RPC_CWNDSHIFT)
#define RPC_INITCWND		RPC_CWNDSCALE
#define RPC_MAXCWND(xprt)	((xprt)->max_reqs << RPC_CWNDSHIFT)
#define RPCXPRT_CONGESTED(xprt) ((xprt)->cong >= (xprt)->cwnd)

L
Linus Torvalds 已提交
33 34 35 36 37 38 39 40 41 42 43
/*
 * This describes a timeout strategy
 */
struct rpc_timeout {
	unsigned long		to_initval,		/* initial timeout */
				to_maxval,		/* max timeout */
				to_increment;		/* if !exponential */
	unsigned int		to_retries;		/* max # of retries */
	unsigned char		to_exponential;
};

44 45 46 47
enum rpc_display_format_t {
	RPC_DISPLAY_ADDR = 0,
	RPC_DISPLAY_PORT,
	RPC_DISPLAY_PROTO,
48 49
	RPC_DISPLAY_HEX_ADDR,
	RPC_DISPLAY_HEX_PORT,
50
	RPC_DISPLAY_NETID,
51 52 53
	RPC_DISPLAY_MAX,
};

54 55
struct rpc_task;
struct rpc_xprt;
56
struct seq_file;
57

L
Linus Torvalds 已提交
58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
/*
 * This describes a complete RPC request
 */
struct rpc_rqst {
	/*
	 * This is the user-visible part
	 */
	struct rpc_xprt *	rq_xprt;		/* RPC client */
	struct xdr_buf		rq_snd_buf;		/* send buffer */
	struct xdr_buf		rq_rcv_buf;		/* recv buffer */

	/*
	 * This is the private part
	 */
	struct rpc_task *	rq_task;	/* RPC task data */
73
	struct rpc_cred *	rq_cred;	/* Bound cred */
74
	__be32			rq_xid;		/* request XID */
L
Linus Torvalds 已提交
75 76
	int			rq_cong;	/* has incremented xprt->cong */
	u32			rq_seqno;	/* gss seq no. used on req. */
77 78 79 80
	int			rq_enc_pages_num;
	struct page		**rq_enc_pages;	/* scratch pages for use by
						   gss privacy code */
	void (*rq_release_snd_buf)(struct rpc_rqst *); /* release rq_enc_pages */
L
Linus Torvalds 已提交
81 82
	struct list_head	rq_list;

83
	__u32 *			rq_buffer;	/* XDR encode buffer */
84
	size_t			rq_callsize,
85
				rq_rcvsize;
86 87 88
	size_t			rq_xmit_bytes_sent;	/* total bytes sent */
	size_t			rq_reply_bytes_recvd;	/* total reply bytes */
							/* received */
89

L
Linus Torvalds 已提交
90 91 92 93 94
	struct xdr_buf		rq_private_buf;		/* The receive buffer
							 * used in the softirq.
							 */
	unsigned long		rq_majortimeo;	/* major timeout alarm */
	unsigned long		rq_timeout;	/* Current timeout value */
95
	ktime_t			rq_rtt;		/* round-trip time */
L
Linus Torvalds 已提交
96
	unsigned int		rq_retries;	/* # of retries */
97 98 99 100
	unsigned int		rq_connect_cookie;
						/* A cookie used to track the
						   state of the transport
						   connection */
L
Linus Torvalds 已提交
101 102 103 104 105 106
	
	/*
	 * Partial send handling
	 */
	u32			rq_bytes_sent;	/* Bytes we have sent */

107
	ktime_t			rq_xtime;	/* transmit time stamp */
L
Linus Torvalds 已提交
108
	int			rq_ntrans;
109

110
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
111 112 113
	struct list_head	rq_bc_list;	/* Callback service list */
	unsigned long		rq_bc_pa_state;	/* Backchannel prealloc state */
	struct list_head	rq_bc_pa_list;	/* Backchannel prealloc list */
114
#endif /* CONFIG_SUNRPC_BACKCHANEL */
L
Linus Torvalds 已提交
115 116 117 118
};
#define rq_svec			rq_snd_buf.head
#define rq_slen			rq_snd_buf.len

119
struct rpc_xprt_ops {
120
	void		(*set_buffer_size)(struct rpc_xprt *xprt, size_t sndsize, size_t rcvsize);
121
	int		(*reserve_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
122
	void		(*release_xprt)(struct rpc_xprt *xprt, struct rpc_task *task);
123
	void		(*alloc_slot)(struct rpc_xprt *xprt, struct rpc_task *task);
124
	void		(*rpcbind)(struct rpc_task *task);
125
	void		(*set_port)(struct rpc_xprt *xprt, unsigned short port);
126
	void		(*connect)(struct rpc_xprt *xprt, struct rpc_task *task);
127
	void *		(*buf_alloc)(struct rpc_task *task, size_t size);
128
	void		(*buf_free)(void *buffer);
129
	int		(*send_request)(struct rpc_task *task);
130
	void		(*set_retrans_timeout)(struct rpc_task *task);
131
	void		(*timer)(struct rpc_xprt *xprt, struct rpc_task *task);
132
	void		(*release_request)(struct rpc_task *task);
133 134
	void		(*close)(struct rpc_xprt *xprt);
	void		(*destroy)(struct rpc_xprt *xprt);
135
	void		(*print_stats)(struct rpc_xprt *xprt, struct seq_file *seq);
136
};
L
Linus Torvalds 已提交
137

138 139 140 141 142 143 144 145 146 147 148 149 150 151
/*
 * RPC transport identifiers
 *
 * To preserve compatibility with the historical use of raw IP protocol
 * id's for transport selection, UDP and TCP identifiers are specified
 * with the previous values. No such restriction exists for new transports,
 * except that they may not collide with these values (17 and 6,
 * respectively).
 */
#define XPRT_TRANSPORT_BC       (1 << 31)
enum xprt_transports {
	XPRT_TRANSPORT_UDP	= IPPROTO_UDP,
	XPRT_TRANSPORT_TCP	= IPPROTO_TCP,
	XPRT_TRANSPORT_BC_TCP	= IPPROTO_TCP | XPRT_TRANSPORT_BC,
152 153
	XPRT_TRANSPORT_RDMA	= 256,
	XPRT_TRANSPORT_LOCAL	= 257,
154 155
};

L
Linus Torvalds 已提交
156
struct rpc_xprt {
157
	atomic_t		count;		/* Reference count */
158
	struct rpc_xprt_ops *	ops;		/* transport methods */
L
Linus Torvalds 已提交
159

160
	const struct rpc_timeout *timeout;	/* timeout parms */
161 162
	struct sockaddr_storage	addr;		/* server address */
	size_t			addrlen;	/* size of server address */
L
Linus Torvalds 已提交
163 164 165 166 167 168 169
	int			prot;		/* IP protocol */

	unsigned long		cong;		/* current congestion */
	unsigned long		cwnd;		/* congestion window */

	size_t			max_payload;	/* largest RPC payload size,
						   in bytes */
170 171
	unsigned int		tsh_size;	/* size of transport specific
						   header */
L
Linus Torvalds 已提交
172

173
	struct rpc_wait_queue	binding;	/* requests waiting on rpcbind */
L
Linus Torvalds 已提交
174 175 176 177
	struct rpc_wait_queue	sending;	/* requests waiting to send */
	struct rpc_wait_queue	pending;	/* requests in flight */
	struct rpc_wait_queue	backlog;	/* waiting for slot */
	struct list_head	free;		/* free slots */
178 179 180
	unsigned int		max_reqs;	/* max number of slots */
	unsigned int		min_reqs;	/* min number of slots */
	atomic_t		num_reqs;	/* total slots */
181
	unsigned long		state;		/* transport state */
182
	unsigned char		resvport   : 1; /* use a reserved port */
M
Mel Gorman 已提交
183 184
	unsigned int		swapper;	/* we're swapping over this
						   transport */
185
	unsigned int		bind_index;	/* bind function index */
L
Linus Torvalds 已提交
186 187

	/*
188
	 * Connection of transports
L
Linus Torvalds 已提交
189
	 */
190
	unsigned long		bind_timeout,
191
				reestablish_timeout;
192 193 194
	unsigned int		connect_cookie;	/* A cookie that gets bumped
						   every time the transport
						   is reconnected */
195

L
Linus Torvalds 已提交
196
	/*
197
	 * Disconnection of idle transports
L
Linus Torvalds 已提交
198 199 200
	 */
	struct work_struct	task_cleanup;
	struct timer_list	timer;
201 202
	unsigned long		last_used,
				idle_timeout;
L
Linus Torvalds 已提交
203 204 205 206

	/*
	 * Send stuff
	 */
C
Chuck Lever 已提交
207
	spinlock_t		transport_lock;	/* lock transport info */
C
Chuck Lever 已提交
208
	spinlock_t		reserve_lock;	/* lock slot table */
209
	u32			xid;		/* Next XID value to use */
L
Linus Torvalds 已提交
210
	struct rpc_task *	snd_task;	/* Task blocked in send */
211
	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
212
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
213 214
	struct svc_serv		*bc_serv;       /* The RPC service which will */
						/* process the callback */
T
Trond Myklebust 已提交
215 216
	int			bc_alloc_count;	/* Total number of preallocs */
	atomic_t		bc_free_slots;
217 218 219 220
	spinlock_t		bc_pa_lock;	/* Protects the preallocated
						 * items */
	struct list_head	bc_pa_list;	/* List of preallocated
						 * backchannel rpc_rqst's */
221
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
L
Linus Torvalds 已提交
222 223
	struct list_head	recv;

224 225 226 227 228 229 230
	struct {
		unsigned long		bind_count,	/* total number of binds */
					connect_count,	/* total number of connects */
					connect_start,	/* connect start timestamp */
					connect_time,	/* jiffies waiting for connect */
					sends,		/* how many complete requests */
					recvs,		/* how many complete requests */
231 232
					bad_xids,	/* lookup_rqst didn't find XID */
					max_slots;	/* max rpc_slots used */
233 234

		unsigned long long	req_u,		/* average requests on the wire */
235 236 237
					bklog_u,	/* backlog queue utilization */
					sending_u,	/* send q utilization */
					pending_u;	/* pend q utilization */
238
	} stat;
L
Linus Torvalds 已提交
239

P
Pavel Emelyanov 已提交
240
	struct net		*xprt_net;
241
	const char		*servername;
242
	const char		*address_strings[RPC_DISPLAY_MAX];
243 244 245
#if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
	struct dentry		*debugfs;		/* debugfs directory */
#endif
L
Linus Torvalds 已提交
246 247
};

248
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
249 250 251 252 253
/*
 * Backchannel flags
 */
#define	RPC_BC_PA_IN_USE	0x0001		/* Preallocated backchannel */
						/* buffer in use */
254
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
255

256
#if defined(CONFIG_SUNRPC_BACKCHANNEL)
257 258 259 260 261 262 263 264 265
static inline int bc_prealloc(struct rpc_rqst *req)
{
	return test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state);
}
#else
static inline int bc_prealloc(struct rpc_rqst *req)
{
	return 0;
}
266
#endif /* CONFIG_SUNRPC_BACKCHANNEL */
267

268
#define XPRT_CREATE_INFINITE_SLOTS	(1U)
269
#define XPRT_CREATE_NO_IDLE_TIMEOUT	(1U << 1)
270

271
struct xprt_create {
272
	int			ident;		/* XPRT_TRANSPORT identifier */
P
Pavel Emelyanov 已提交
273
	struct net *		net;
274
	struct sockaddr *	srcaddr;	/* optional local address */
275 276
	struct sockaddr *	dstaddr;	/* remote peer address */
	size_t			addrlen;
277
	const char		*servername;
278
	struct svc_xprt		*bc_xprt;	/* NFSv4.1 backchannel */
279
	unsigned int		flags;
280
};
L
Linus Torvalds 已提交
281

282 283
struct xprt_class {
	struct list_head	list;
284
	int			ident;		/* XPRT_TRANSPORT identifier */
285
	struct rpc_xprt *	(*setup)(struct xprt_create *);
286 287 288 289
	struct module		*owner;
	char			name[32];
};

290 291 292
/*
 * Generic internal transport functions
 */
293
struct rpc_xprt		*xprt_create_transport(struct xprt_create *args);
294 295
void			xprt_connect(struct rpc_task *task);
void			xprt_reserve(struct rpc_task *task);
296
void			xprt_retry_reserve(struct rpc_task *task);
297 298
int			xprt_reserve_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
int			xprt_reserve_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
299 300
void			xprt_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
void			xprt_lock_and_alloc_slot(struct rpc_xprt *xprt, struct rpc_task *task);
301
bool			xprt_prepare_transmit(struct rpc_task *task);
302
void			xprt_transmit(struct rpc_task *task);
303
void			xprt_end_transmit(struct rpc_task *task);
L
Linus Torvalds 已提交
304
int			xprt_adjust_timeout(struct rpc_rqst *req);
305 306
void			xprt_release_xprt(struct rpc_xprt *xprt, struct rpc_task *task);
void			xprt_release_xprt_cong(struct rpc_xprt *xprt, struct rpc_task *task);
307
void			xprt_release(struct rpc_task *task);
308
void			xprt_put(struct rpc_xprt *xprt);
309 310 311
struct rpc_xprt *	xprt_alloc(struct net *net, size_t size,
				unsigned int num_prealloc,
				unsigned int max_req);
312
void			xprt_free(struct rpc_xprt *);
313

314 315 316 317 318 319 320 321 322 323 324 325
/**
 * xprt_get - return a reference to an RPC transport.
 * @xprt: pointer to the transport
 *
 */
static inline struct rpc_xprt *xprt_get(struct rpc_xprt *xprt)
{
	if (atomic_inc_not_zero(&xprt->count))
		return xprt;
	return NULL;
}

326
static inline __be32 *xprt_skip_transport_header(struct rpc_xprt *xprt, __be32 *p)
327 328 329 330
{
	return p + xprt->tsh_size;
}

331 332 333
/*
 * Transport switch helper functions
 */
334 335
int			xprt_register_transport(struct xprt_class *type);
int			xprt_unregister_transport(struct xprt_class *type);
336
int			xprt_load_transport(const char *);
337 338
void			xprt_set_retrans_timeout_def(struct rpc_task *task);
void			xprt_set_retrans_timeout_rtt(struct rpc_task *task);
339
void			xprt_wake_pending_tasks(struct rpc_xprt *xprt, int status);
340
void			xprt_wait_for_buffer_space(struct rpc_task *task, rpc_action action);
341
void			xprt_write_space(struct rpc_xprt *xprt);
342
void			xprt_adjust_cwnd(struct rpc_xprt *xprt, struct rpc_task *task, int result);
343
struct rpc_rqst *	xprt_lookup_rqst(struct rpc_xprt *xprt, __be32 xid);
344
void			xprt_complete_rqst(struct rpc_task *task, int copied);
345
void			xprt_release_rqst_cong(struct rpc_task *task);
346
void			xprt_disconnect_done(struct rpc_xprt *xprt);
347
void			xprt_force_disconnect(struct rpc_xprt *xprt);
348
void			xprt_conditional_disconnect(struct rpc_xprt *xprt, unsigned int cookie);
M
Mel Gorman 已提交
349
int			xs_swapper(struct rpc_xprt *xprt, int enable);
350

351 352 353
bool			xprt_lock_connect(struct rpc_xprt *, struct rpc_task *, void *);
void			xprt_unlock_connect(struct rpc_xprt *, void *);

354 355 356 357 358 359
/*
 * Reserved bit positions in xprt->state
 */
#define XPRT_LOCKED		(0)
#define XPRT_CONNECTED		(1)
#define XPRT_CONNECTING		(2)
360
#define XPRT_CLOSE_WAIT		(3)
361
#define XPRT_BOUND		(4)
362
#define XPRT_BINDING		(5)
363
#define XPRT_CLOSING		(6)
364
#define XPRT_CONGESTED		(9)
365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392

static inline void xprt_set_connected(struct rpc_xprt *xprt)
{
	set_bit(XPRT_CONNECTED, &xprt->state);
}

static inline void xprt_clear_connected(struct rpc_xprt *xprt)
{
	clear_bit(XPRT_CONNECTED, &xprt->state);
}

static inline int xprt_connected(struct rpc_xprt *xprt)
{
	return test_bit(XPRT_CONNECTED, &xprt->state);
}

static inline int xprt_test_and_set_connected(struct rpc_xprt *xprt)
{
	return test_and_set_bit(XPRT_CONNECTED, &xprt->state);
}

static inline int xprt_test_and_clear_connected(struct rpc_xprt *xprt)
{
	return test_and_clear_bit(XPRT_CONNECTED, &xprt->state);
}

static inline void xprt_clear_connecting(struct rpc_xprt *xprt)
{
393
	smp_mb__before_atomic();
394
	clear_bit(XPRT_CONNECTING, &xprt->state);
395
	smp_mb__after_atomic();
396 397 398 399 400 401 402 403 404 405 406
}

static inline int xprt_connecting(struct rpc_xprt *xprt)
{
	return test_bit(XPRT_CONNECTING, &xprt->state);
}

static inline int xprt_test_and_set_connecting(struct rpc_xprt *xprt)
{
	return test_and_set_bit(XPRT_CONNECTING, &xprt->state);
}
L
Linus Torvalds 已提交
407

408 409 410 411 412 413 414 415 416 417 418 419 420 421 422
static inline void xprt_set_bound(struct rpc_xprt *xprt)
{
	test_and_set_bit(XPRT_BOUND, &xprt->state);
}

static inline int xprt_bound(struct rpc_xprt *xprt)
{
	return test_bit(XPRT_BOUND, &xprt->state);
}

static inline void xprt_clear_bound(struct rpc_xprt *xprt)
{
	clear_bit(XPRT_BOUND, &xprt->state);
}

423 424
static inline void xprt_clear_binding(struct rpc_xprt *xprt)
{
425
	smp_mb__before_atomic();
426
	clear_bit(XPRT_BINDING, &xprt->state);
427
	smp_mb__after_atomic();
428 429 430 431 432 433 434
}

static inline int xprt_test_and_set_binding(struct rpc_xprt *xprt)
{
	return test_and_set_bit(XPRT_BINDING, &xprt->state);
}

L
Linus Torvalds 已提交
435 436 437
#endif /* __KERNEL__*/

#endif /* _LINUX_SUNRPC_XPRT_H */