Blame view

net/rds/rds.h 30.9 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
39de82817   Andy Grover   RDS: Main header ...
2
3
4
5
6
7
8
9
10
  #ifndef _RDS_RDS_H
  #define _RDS_RDS_H
  
  #include <net/sock.h>
  #include <linux/scatterlist.h>
  #include <linux/highmem.h>
  #include <rdma/rdma_cm.h>
  #include <linux/mutex.h>
  #include <linux/rds.h>
7b5654349   santosh.shilimkar@oracle.com   RDS: convert bind...
11
  #include <linux/rhashtable.h>
b7f029209   Reshetova, Elena   net, rds: convert...
12
  #include <linux/refcount.h>
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
13
  #include <linux/in6.h>
39de82817   Andy Grover   RDS: Main header ...
14
15
16
17
18
19
20
21
  
  #include "info.h"
  
  /*
   * RDS Network protocol version
   */
  #define RDS_PROTOCOL_3_0	0x0300
  #define RDS_PROTOCOL_3_1	0x0301
cdc306a5c   Santosh Shilimkar   rds: make v3.1 as...
22
23
  #define RDS_PROTOCOL_4_0	0x0400
  #define RDS_PROTOCOL_4_1	0x0401
39de82817   Andy Grover   RDS: Main header ...
24
25
26
27
  #define RDS_PROTOCOL_VERSION	RDS_PROTOCOL_3_1
  #define RDS_PROTOCOL_MAJOR(v)	((v) >> 8)
  #define RDS_PROTOCOL_MINOR(v)	((v) & 255)
  #define RDS_PROTOCOL(maj, min)	(((maj) << 8) | min)
cdc306a5c   Santosh Shilimkar   rds: make v3.1 as...
28
  #define RDS_PROTOCOL_COMPAT_VERSION	RDS_PROTOCOL_3_1
39de82817   Andy Grover   RDS: Main header ...
29

1e2b44e78   Ka-Cheong Poon   rds: Enable RDS I...
30
31
32
33
34
35
36
  /* The following ports, 16385, 18634, 18635, are registered with IANA as
   * the ports to be used for RDS over TCP and UDP.  Currently, only RDS over
   * TCP and RDS over IB/RDMA are implemented.  18634 is the historical value
   * used for the RDMA_CM listener port.  RDS/TCP uses port 16385.  After
   * IPv6 work, RDMA_CM also uses 16385 as the listener port.  18634 is kept
   * to ensure compatibility with older RDS modules.  Those ports are defined
   * in each transport's header file.
39de82817   Andy Grover   RDS: Main header ...
37
38
   */
  #define RDS_PORT	18634
8cbd9606a   Andy Grover   RDS: Use spinlock...
39
40
41
  #ifdef ATOMIC64_INIT
  #define KERNEL_HAS_ATOMIC64
  #endif
ff57087f3   shamir rabinovitch   rds: debug messag...
42
  #ifdef RDS_DEBUG
39de82817   Andy Grover   RDS: Main header ...
43
44
45
  #define rdsdebug(fmt, args...) pr_debug("%s(): " fmt, __func__ , ##args)
  #else
  /* sigh, pr_debug() causes unused variable warnings */
b9075fa96   Joe Perches   treewide: use __p...
46
47
  static inline __printf(1, 2)
  void rdsdebug(char *fmt, ...)
39de82817   Andy Grover   RDS: Main header ...
48
49
50
  {
  }
  #endif
39de82817   Andy Grover   RDS: Main header ...
51
52
  #define RDS_FRAG_SHIFT	12
  #define RDS_FRAG_SIZE	((unsigned int)(1 << RDS_FRAG_SHIFT))
f9fb69adb   Avinash Repaka   RDS: make message...
53
54
  /* Used to limit both RDMA and non-RDMA RDS message to 1MB */
  #define RDS_MAX_MSG_SIZE	((unsigned int)(1 << 20))
39de82817   Andy Grover   RDS: Main header ...
55
  #define RDS_CONG_MAP_BYTES	(65536 / 8)
39de82817   Andy Grover   RDS: Main header ...
56
57
58
59
60
  #define RDS_CONG_MAP_PAGES	(PAGE_ALIGN(RDS_CONG_MAP_BYTES) / PAGE_SIZE)
  #define RDS_CONG_MAP_PAGE_BITS	(PAGE_SIZE * 8)
  
  struct rds_cong_map {
  	struct rb_node		m_rb_node;
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
61
  	struct in6_addr		m_addr;
39de82817   Andy Grover   RDS: Main header ...
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
  	wait_queue_head_t	m_waitq;
  	struct list_head	m_conn_list;
  	unsigned long		m_page_addrs[RDS_CONG_MAP_PAGES];
  };
  
  
  /*
   * This is how we will track the connection state:
   * A connection is always in one of the following
   * states. Updates to the state are atomic and imply
   * a memory barrier.
   */
  enum {
  	RDS_CONN_DOWN = 0,
  	RDS_CONN_CONNECTING,
  	RDS_CONN_DISCONNECTING,
  	RDS_CONN_UP,
9c79440e2   Sowmini Varadhan   RDS: TCP: fix rac...
79
  	RDS_CONN_RESETTING,
39de82817   Andy Grover   RDS: Main header ...
80
81
82
83
84
85
  	RDS_CONN_ERROR,
  };
  
  /* Bits for c_flags */
  #define RDS_LL_SEND_FULL	0
  #define RDS_RECONNECT_PENDING	1
0f4b1c7e8   Zach Brown   rds: fix rds_send...
86
  #define RDS_IN_XMIT		2
73ce4317b   santosh.shilimkar@oracle.com   RDS: make sure we...
87
  #define RDS_RECV_REFILL		3
c90ecbfaf   Sowmini Varadhan   rds: Use atomic f...
88
  #define	RDS_DESTROY_PENDING	4
39de82817   Andy Grover   RDS: Main header ...
89

0cb43965d   Sowmini Varadhan   RDS: split out co...
90
  /* Max number of multipaths per RDS connection. Must be a power of 2 */
5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
91
92
93
  #define	RDS_MPATH_WORKERS	8
  #define	RDS_MPATH_HASH(rs, n) (jhash_1word((rs)->rs_bound_port, \
  			       (rs)->rs_hash_initval) & ((n) - 1))
0cb43965d   Sowmini Varadhan   RDS: split out co...
94

00354de57   Sowmini Varadhan   rds: tcp: various...
95
  #define IS_CANONICAL(laddr, faddr) (htonl(laddr) < htonl(faddr))
0cb43965d   Sowmini Varadhan   RDS: split out co...
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
  /* Per mpath connection state */
  struct rds_conn_path {
  	struct rds_connection	*cp_conn;
  	struct rds_message	*cp_xmit_rm;
  	unsigned long		cp_xmit_sg;
  	unsigned int		cp_xmit_hdr_off;
  	unsigned int		cp_xmit_data_off;
  	unsigned int		cp_xmit_atomic_sent;
  	unsigned int		cp_xmit_rdma_sent;
  	unsigned int		cp_xmit_data_sent;
  
  	spinlock_t		cp_lock;		/* protect msg queues */
  	u64			cp_next_tx_seq;
  	struct list_head	cp_send_queue;
  	struct list_head	cp_retrans;
  
  	u64			cp_next_rx_seq;
  
  	void			*cp_transport_data;
  
  	atomic_t		cp_state;
  	unsigned long		cp_send_gen;
  	unsigned long		cp_flags;
  	unsigned long		cp_reconnect_jiffies;
  	struct delayed_work	cp_send_w;
  	struct delayed_work	cp_recv_w;
  	struct delayed_work	cp_conn_w;
  	struct work_struct	cp_down_w;
  	struct mutex		cp_cm_lock;	/* protect cp_state & cm */
  	wait_queue_head_t	cp_waitq;
  
  	unsigned int		cp_unacked_packets;
  	unsigned int		cp_unacked_bytes;
0cb43965d   Sowmini Varadhan   RDS: split out co...
129
130
131
132
  	unsigned int		cp_index;
  };
  
  /* One rds_connection per RDS address pair */
39de82817   Andy Grover   RDS: Main header ...
133
134
  struct rds_connection {
  	struct hlist_node	c_hash_node;
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
135
136
  	struct in6_addr		c_laddr;
  	struct in6_addr		c_faddr;
1e2b44e78   Ka-Cheong Poon   rds: Enable RDS I...
137
138
  	int			c_dev_if; /* ifindex used for this conn */
  	int			c_bound_if; /* ifindex of c_laddr */
3b20fc389   Sowmini Varadhan   RDS: Use a single...
139
  	unsigned int		c_loopback:1,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
140
  				c_isv6:1,
5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
141
  				c_ping_triggered:1,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
142
  				c_pad_to_32:29;
0cb43965d   Sowmini Varadhan   RDS: split out co...
143
  	int			c_npaths;
39de82817   Andy Grover   RDS: Main header ...
144
  	struct rds_connection	*c_passive;
0cb43965d   Sowmini Varadhan   RDS: split out co...
145
  	struct rds_transport	*c_trans;
39de82817   Andy Grover   RDS: Main header ...
146
147
148
  
  	struct rds_cong_map	*c_lcong;
  	struct rds_cong_map	*c_fcong;
0cb43965d   Sowmini Varadhan   RDS: split out co...
149
  	/* Protocol version */
cdc306a5c   Santosh Shilimkar   rds: make v3.1 as...
150
  	unsigned int		c_proposed_version;
0cb43965d   Sowmini Varadhan   RDS: split out co...
151
  	unsigned int		c_version;
681648e67   Sowmini Varadhan   rds: tcp: correct...
152
  	possible_net_t		c_net;
39de82817   Andy Grover   RDS: Main header ...
153

3eb450367   Santosh Shilimkar   rds: add type of ...
154
155
  	/* TOS */
  	u8			c_tos;
39de82817   Andy Grover   RDS: Main header ...
156
157
  	struct list_head	c_map_item;
  	unsigned long		c_map_queued;
39de82817   Andy Grover   RDS: Main header ...
158

840df162b   Sowmini Varadhan   rds: reduce memor...
159
  	struct rds_conn_path	*c_path;
5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
160
  	wait_queue_head_t	c_hs_waitq; /* handshake waitq */
905dd4184   Sowmini Varadhan   RDS: TCP: Track p...
161
162
163
  
  	u32			c_my_gen_num;
  	u32			c_peer_gen_num;
39de82817   Andy Grover   RDS: Main header ...
164
  };
d5a8ac28a   Sowmini Varadhan   RDS-TCP: Make RDS...
165
166
167
  static inline
  struct net *rds_conn_net(struct rds_connection *conn)
  {
681648e67   Sowmini Varadhan   rds: tcp: correct...
168
  	return read_pnet(&conn->c_net);
d5a8ac28a   Sowmini Varadhan   RDS-TCP: Make RDS...
169
170
171
172
173
  }
  
  static inline
  void rds_conn_net_set(struct rds_connection *conn, struct net *net)
  {
681648e67   Sowmini Varadhan   rds: tcp: correct...
174
  	write_pnet(&conn->c_net, net);
d5a8ac28a   Sowmini Varadhan   RDS-TCP: Make RDS...
175
  }
39de82817   Andy Grover   RDS: Main header ...
176
177
178
  #define RDS_FLAG_CONG_BITMAP	0x01
  #define RDS_FLAG_ACK_REQUIRED	0x02
  #define RDS_FLAG_RETRANSMITTED	0x04
7b70d0336   Steve Wise   RDS/IW+IB: Allow ...
179
  #define RDS_MAX_ADV_CREDIT	255
39de82817   Andy Grover   RDS: Main header ...
180

5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
181
182
183
184
185
186
187
188
189
190
191
  /* RDS_FLAG_PROBE_PORT is the reserved sport used for sending a ping
   * probe to exchange control information before establishing a connection.
   * Currently the control information that is exchanged is the number of
   * supported paths. If the peer is a legacy (older kernel revision) peer,
   * it would return a pong message without additional control information
   * that would then alert the sender that the peer was an older rev.
   */
  #define RDS_FLAG_PROBE_PORT	1
  #define	RDS_HS_PROBE(sport, dport) \
  		((sport == RDS_FLAG_PROBE_PORT && dport == 0) || \
  		 (sport == 0 && dport == RDS_FLAG_PROBE_PORT))
39de82817   Andy Grover   RDS: Main header ...
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
  /*
   * Maximum space available for extension headers.
   */
  #define RDS_HEADER_EXT_SPACE	16
  
  struct rds_header {
  	__be64	h_sequence;
  	__be64	h_ack;
  	__be32	h_len;
  	__be16	h_sport;
  	__be16	h_dport;
  	u8	h_flags;
  	u8	h_credit;
  	u8	h_padding[4];
  	__sum16	h_csum;
  
  	u8	h_exthdr[RDS_HEADER_EXT_SPACE];
  };
  
  /*
   * Reserved - indicates end of extensions
   */
  #define RDS_EXTHDR_NONE		0
  
  /*
   * This extension header is included in the very
   * first message that is sent on a new connection,
   * and identifies the protocol level. This will help
   * rolling updates if a future change requires breaking
   * the protocol.
   * NB: This is no longer true for IB, where we do a version
   * negotiation during the connection setup phase (protocol
   * version information is included in the RDMA CM private data).
   */
  #define RDS_EXTHDR_VERSION	1
  struct rds_ext_header_version {
  	__be32			h_version;
  };
  
  /*
   * This extension header is included in the RDS message
   * chasing an RDMA operation.
   */
  #define RDS_EXTHDR_RDMA		2
  struct rds_ext_header_rdma {
  	__be32			h_rdma_rkey;
  };
  
  /*
   * This extension header tells the peer about the
   * destination <R_Key,offset> of the requested RDMA
   * operation.
   */
  #define RDS_EXTHDR_RDMA_DEST	3
  struct rds_ext_header_rdma_dest {
  	__be32			h_rdma_rkey;
  	__be32			h_rdma_offset;
  };
5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
250
251
252
  /* Extension header announcing number of paths.
   * Implicit length = 2 bytes.
   */
905dd4184   Sowmini Varadhan   RDS: TCP: Track p...
253
254
  #define RDS_EXTHDR_NPATHS	5
  #define RDS_EXTHDR_GEN_NUM	6
5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
255

39de82817   Andy Grover   RDS: Main header ...
256
  #define __RDS_EXTHDR_MAX	16 /* for now */
3289025ae   Santosh Shilimkar   RDS: add receive ...
257
258
259
260
261
  #define RDS_RX_MAX_TRACES	(RDS_MSG_RX_DGRAM_TRACE_MAX + 1)
  #define	RDS_MSG_RX_HDR		0
  #define	RDS_MSG_RX_START	1
  #define	RDS_MSG_RX_END		2
  #define	RDS_MSG_RX_CMSG		3
39de82817   Andy Grover   RDS: Main header ...
262

bf1867db9   Dag Moxnes   net/rds: Whitelis...
263
264
265
266
267
  /* The following values are whitelisted for usercopy */
  struct rds_inc_usercopy {
  	rds_rdma_cookie_t	rdma_cookie;
  	ktime_t			rx_tstamp;
  };
39de82817   Andy Grover   RDS: Main header ...
268
  struct rds_incoming {
b7f029209   Reshetova, Elena   net, rds: convert...
269
  	refcount_t		i_refcount;
39de82817   Andy Grover   RDS: Main header ...
270
271
  	struct list_head	i_item;
  	struct rds_connection	*i_conn;
ef9e62c2e   Sowmini Varadhan   RDS: recv path ge...
272
  	struct rds_conn_path	*i_conn_path;
39de82817   Andy Grover   RDS: Main header ...
273
274
  	struct rds_header	i_hdr;
  	unsigned long		i_rx_jiffies;
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
275
  	struct in6_addr		i_saddr;
39de82817   Andy Grover   RDS: Main header ...
276

bf1867db9   Dag Moxnes   net/rds: Whitelis...
277
  	struct rds_inc_usercopy i_usercopy;
3289025ae   Santosh Shilimkar   RDS: add receive ...
278
  	u64			i_rx_lat_trace[RDS_RX_MAX_TRACES];
39de82817   Andy Grover   RDS: Main header ...
279
  };
21f79afa5   Andy Grover   RDS: fold rdma.h ...
280
281
  struct rds_mr {
  	struct rb_node		r_rb_node;
803ea8505   Reshetova, Elena   net, rds: convert...
282
  	refcount_t		r_refcount;
21f79afa5   Andy Grover   RDS: fold rdma.h ...
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
  	u32			r_key;
  
  	/* A copy of the creation flags */
  	unsigned int		r_use_once:1;
  	unsigned int		r_invalidate:1;
  	unsigned int		r_write:1;
  
  	/* This is for RDS_MR_DEAD.
  	 * It would be nice & consistent to make this part of the above
  	 * bit field here, but we need to use test_and_set_bit.
  	 */
  	unsigned long		r_state;
  	struct rds_sock		*r_sock; /* back pointer to the socket that owns us */
  	struct rds_transport	*r_trans;
  	void			*r_trans_private;
  };
  
  /* Flags for mr->r_state */
  #define RDS_MR_DEAD		0
21f79afa5   Andy Grover   RDS: fold rdma.h ...
302
303
304
305
306
307
308
309
310
311
312
313
314
315
  static inline rds_rdma_cookie_t rds_rdma_make_cookie(u32 r_key, u32 offset)
  {
  	return r_key | (((u64) offset) << 32);
  }
  
  static inline u32 rds_rdma_cookie_key(rds_rdma_cookie_t cookie)
  {
  	return cookie;
  }
  
  static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie)
  {
  	return cookie >> 32;
  }
15133f6e6   Andy Grover   RDS: Implement at...
316
317
318
  /* atomic operation types */
  #define RDS_ATOMIC_TYPE_CSWP		0
  #define RDS_ATOMIC_TYPE_FADD		1
39de82817   Andy Grover   RDS: Main header ...
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
  /*
   * m_sock_item and m_conn_item are on lists that are serialized under
   * conn->c_lock.  m_sock_item has additional meaning in that once it is empty
   * the message will not be put back on the retransmit list after being sent.
   * messages that are canceled while being sent rely on this.
   *
   * m_inc is used by loopback so that it can pass an incoming message straight
   * back up into the rx path.  It embeds a wire header which is also used by
   * the send path, which is kind of awkward.
   *
   * m_sock_item indicates the message's presence on a socket's send or receive
   * queue.  m_rs will point to that socket.
   *
   * m_daddr is used by cancellation to prune messages to a given destination.
   *
   * The RDS_MSG_ON_SOCK and RDS_MSG_ON_CONN flags are used to avoid lock
   * nesting.  As paths iterate over messages on a sock, or conn, they must
   * also lock the conn, or sock, to remove the message from those lists too.
   * Testing the flag to determine if the message is still on the lists lets
   * us avoid testing the list_head directly.  That means each path can use
   * the message's list_head to keep it on a local list while juggling locks
   * without confusing the other path.
   *
   * m_ack_seq is an optional field set by transports who need a different
   * sequence number range to invalidate.  They can use this in a callback
   * that they pass to rds_send_drop_acked() to see if each message has been
   * acked.  The HAS_ACK_SEQ flag can be used to detect messages which haven't
   * had ack_seq set yet.
   */
  #define RDS_MSG_ON_SOCK		1
  #define RDS_MSG_ON_CONN		2
  #define RDS_MSG_HAS_ACK_SEQ	3
  #define RDS_MSG_ACK_REQUIRED	4
  #define RDS_MSG_RETRANSMITTED	5
  #define RDS_MSG_MAPPED		6
  #define RDS_MSG_PAGEVEC		7
905dd4184   Sowmini Varadhan   RDS: TCP: Track p...
355
  #define RDS_MSG_FLUSH		8
39de82817   Andy Grover   RDS: Main header ...
356

01883eda7   Sowmini Varadhan   rds: support for ...
357
  struct rds_znotifier {
01883eda7   Sowmini Varadhan   rds: support for ...
358
359
360
  	struct mmpin		z_mmp;
  	u32			z_cookie;
  };
9426bbc6d   Sowmini Varadhan   rds: use list str...
361
362
363
364
365
366
367
  struct rds_msg_zcopy_info {
  	struct list_head rs_zcookie_next;
  	union {
  		struct rds_znotifier znotif;
  		struct rds_zcopy_cookies zcookies;
  	};
  };
01883eda7   Sowmini Varadhan   rds: support for ...
368

9426bbc6d   Sowmini Varadhan   rds: use list str...
369
370
371
372
373
374
  struct rds_msg_zcopy_queue {
  	struct list_head zcookie_head;
  	spinlock_t lock; /* protects zcookie_head queue */
  };
  
  static inline void rds_message_zcopy_queue_init(struct rds_msg_zcopy_queue *q)
01883eda7   Sowmini Varadhan   rds: support for ...
375
  {
9426bbc6d   Sowmini Varadhan   rds: use list str...
376
377
  	spin_lock_init(&q->lock);
  	INIT_LIST_HEAD(&q->zcookie_head);
01883eda7   Sowmini Varadhan   rds: support for ...
378
  }
ea010070d   shamir rabinovitch   net/rds: fix warn...
379
380
381
382
383
384
385
386
387
388
389
  struct rds_iov_vector {
  	struct rds_iovec *iov;
  	int               len;
  };
  
  struct rds_iov_vector_arr {
  	struct rds_iov_vector *vec;
  	int                    len;
  	int                    indx;
  	int                    incr;
  };
39de82817   Andy Grover   RDS: Main header ...
390
  struct rds_message {
6c5a1c4a2   Reshetova, Elena   net, rds: convert...
391
  	refcount_t		m_refcount;
39de82817   Andy Grover   RDS: Main header ...
392
393
394
395
  	struct list_head	m_sock_item;
  	struct list_head	m_conn_item;
  	struct rds_incoming	m_inc;
  	u64			m_ack_seq;
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
396
  	struct in6_addr		m_daddr;
39de82817   Andy Grover   RDS: Main header ...
397
398
399
400
401
402
403
404
  	unsigned long		m_flags;
  
  	/* Never access m_rs without holding m_rs_lock.
  	 * Lock nesting is
  	 *  rm->m_rs_lock
  	 *   -> rs->rs_lock
  	 */
  	spinlock_t		m_rs_lock;
c83188dcd   Chris Mason   rds: per-rm flush...
405
  	wait_queue_head_t	m_flush_wait;
39de82817   Andy Grover   RDS: Main header ...
406
  	struct rds_sock		*m_rs;
7e3bd65eb   Andy Grover   RDS: Move some va...
407
408
  
  	/* cookie to send to remote, in rds header */
39de82817   Andy Grover   RDS: Main header ...
409
  	rds_rdma_cookie_t	m_rdma_cookie;
7e3bd65eb   Andy Grover   RDS: Move some va...
410
411
412
  
  	unsigned int		m_used_sgs;
  	unsigned int		m_total_sgs;
ff3d7d361   Andy Grover   RDS: Perform unma...
413
  	void			*m_final_op;
e779137aa   Andy Grover   RDS: break out rd...
414
  	struct {
15133f6e6   Andy Grover   RDS: Implement at...
415
416
  		struct rm_atomic_op {
  			int			op_type;
20c72bd5f   Andy Grover   RDS: Implement ma...
417
418
419
420
421
422
423
424
425
426
427
428
  			union {
  				struct {
  					uint64_t	compare;
  					uint64_t	swap;
  					uint64_t	compare_mask;
  					uint64_t	swap_mask;
  				} op_m_cswp;
  				struct {
  					uint64_t	add;
  					uint64_t	nocarry_mask;
  				} op_m_fadd;
  			};
15133f6e6   Andy Grover   RDS: Implement at...
429
430
431
432
433
434
  
  			u32			op_rkey;
  			u64			op_remote_addr;
  			unsigned int		op_notify:1;
  			unsigned int		op_recverr:1;
  			unsigned int		op_mapped:1;
2c3a5f9ab   Andy Grover   RDS: Add flag for...
435
  			unsigned int		op_silent:1;
15133f6e6   Andy Grover   RDS: Implement at...
436
  			unsigned int		op_active:1;
15133f6e6   Andy Grover   RDS: Implement at...
437
  			struct scatterlist	*op_sg;
f8b3aaf2b   Andy Grover   RDS: Remove struc...
438
  			struct rds_notifier	*op_notifier;
15133f6e6   Andy Grover   RDS: Implement at...
439
440
441
442
  
  			struct rds_mr		*op_rdma_mr;
  		} atomic;
  		struct rm_rdma_op {
f8b3aaf2b   Andy Grover   RDS: Remove struc...
443
444
445
446
447
448
449
  			u32			op_rkey;
  			u64			op_remote_addr;
  			unsigned int		op_write:1;
  			unsigned int		op_fence:1;
  			unsigned int		op_notify:1;
  			unsigned int		op_recverr:1;
  			unsigned int		op_mapped:1;
2c3a5f9ab   Andy Grover   RDS: Add flag for...
450
  			unsigned int		op_silent:1;
f8b3aaf2b   Andy Grover   RDS: Remove struc...
451
452
453
454
455
456
457
458
  			unsigned int		op_active:1;
  			unsigned int		op_bytes;
  			unsigned int		op_nents;
  			unsigned int		op_count;
  			struct scatterlist	*op_sg;
  			struct rds_notifier	*op_notifier;
  
  			struct rds_mr		*op_rdma_mr;
e779137aa   Andy Grover   RDS: break out rd...
459
  		} rdma;
15133f6e6   Andy Grover   RDS: Implement at...
460
  		struct rm_data_op {
241eef3e2   Andy Grover   RDS: Implement si...
461
  			unsigned int		op_active:1;
6c7cc6e46   Andy Grover   RDS: Rename data ...
462
463
  			unsigned int		op_nents;
  			unsigned int		op_count;
d655a9fbc   Wengang Wang   rds: re-entry of ...
464
465
  			unsigned int		op_dmasg;
  			unsigned int		op_dmaoff;
01883eda7   Sowmini Varadhan   rds: support for ...
466
  			struct rds_znotifier	*op_mmp_znotifier;
6c7cc6e46   Andy Grover   RDS: Rename data ...
467
  			struct scatterlist	*op_sg;
e779137aa   Andy Grover   RDS: break out rd...
468
469
  		} data;
  	};
9e630bcb7   Avinash Repaka   RDS: RDMA: Fix th...
470
471
  
  	struct rds_conn_path *m_conn_path;
39de82817   Andy Grover   RDS: Main header ...
472
473
474
475
476
477
478
479
480
481
482
483
484
485
  };
  
  /*
   * The RDS notifier is used (optionally) to tell the application about
   * completed RDMA operations. Rather than keeping the whole rds message
   * around on the queue, we allocate a small notifier that is put on the
   * socket's notifier_list. Notifications are delivered to the application
   * through control messages.
   */
  struct rds_notifier {
  	struct list_head	n_list;
  	uint64_t		n_user_token;
  	int			n_status;
  };
f1693c63a   Santosh Shilimkar   rds: avoid unenec...
486
487
488
489
  /* Available as part of RDS core, so doesn't need to participate
   * in get_preferred transport etc
   */
  #define	RDS_TRANS_LOOP	3
39de82817   Andy Grover   RDS: Main header ...
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
  /**
   * struct rds_transport -  transport specific behavioural hooks
   *
   * @xmit: .xmit is called by rds_send_xmit() to tell the transport to send
   *        part of a message.  The caller serializes on the send_sem so this
   *        doesn't need to be reentrant for a given conn.  The header must be
   *        sent before the data payload.  .xmit must be prepared to send a
   *        message with no data payload.  .xmit should return the number of
   *        bytes that were sent down the connection, including header bytes.
   *        Returning 0 tells the caller that it doesn't need to perform any
   *        additional work now.  This is usually the case when the transport has
   *        filled the sending queue for its connection and will handle
   *        triggering the rds thread to continue the send when space becomes
   *        available.  Returning -EAGAIN tells the caller to retry the send
   *        immediately.  Returning -ENOMEM tells the caller to retry the send at
   *        some point in the future.
   *
   * @conn_shutdown: conn_shutdown stops traffic on the given connection.  Once
   *                 it returns the connection can not call rds_recv_incoming().
   *                 This will only be called once after conn_connect returns
   *                 non-zero success and will The caller serializes this with
   *                 the send and connecting paths (xmit_* and conn_*).  The
   *                 transport is responsible for other serialization, including
   *                 rds_recv_incoming().  This is called in process context but
   *                 should try hard not to block.
39de82817   Andy Grover   RDS: Main header ...
515
516
517
518
519
520
   */
  
  struct rds_transport {
  	char			t_name[TRANSNAMSIZ];
  	struct list_head	t_item;
  	struct module		*t_owner;
7e8f4413d   Sowmini Varadhan   RDS: add t_mp_cap...
521
522
  	unsigned int		t_prefer_loopback:1,
  				t_mp_capable:1;
335776bd6   Andy Grover   RDS: Track transp...
523
  	unsigned int		t_type;
39de82817   Andy Grover   RDS: Main header ...
524

eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
525
526
  	int (*laddr_check)(struct net *net, const struct in6_addr *addr,
  			   __u32 scope_id);
39de82817   Andy Grover   RDS: Main header ...
527
528
  	int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp);
  	void (*conn_free)(void *data);
b04e8554f   Sowmini Varadhan   RDS: TCP: Hooks t...
529
  	int (*conn_path_connect)(struct rds_conn_path *cp);
d769ef81d   Sowmini Varadhan   RDS: Update rds_c...
530
  	void (*conn_path_shutdown)(struct rds_conn_path *conn);
1f9ecd7ea   Sowmini Varadhan   RDS: Pass rds_con...
531
  	void (*xmit_path_prepare)(struct rds_conn_path *cp);
1f9ecd7ea   Sowmini Varadhan   RDS: Pass rds_con...
532
  	void (*xmit_path_complete)(struct rds_conn_path *cp);
39de82817   Andy Grover   RDS: Main header ...
533
534
  	int (*xmit)(struct rds_connection *conn, struct rds_message *rm,
  		    unsigned int hdr_off, unsigned int sg, unsigned int off);
f8b3aaf2b   Andy Grover   RDS: Remove struc...
535
  	int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op);
ff3d7d361   Andy Grover   RDS: Perform unma...
536
  	int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op);
2da43c4a1   Sowmini Varadhan   RDS: TCP: make re...
537
  	int (*recv_path)(struct rds_conn_path *cp);
c310e72c8   Al Viro   rds: switch ->inc...
538
  	int (*inc_copy_to_user)(struct rds_incoming *inc, struct iov_iter *to);
39de82817   Andy Grover   RDS: Main header ...
539
540
541
  	void (*inc_free)(struct rds_incoming *inc);
  
  	int (*cm_handle_connect)(struct rdma_cm_id *cm_id,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
542
543
  				 struct rdma_cm_event *event, bool isv6);
  	int (*cm_initiate_connect)(struct rdma_cm_id *cm_id, bool isv6);
39de82817   Andy Grover   RDS: Main header ...
544
545
546
547
548
549
550
  	void (*cm_connect_complete)(struct rds_connection *conn,
  				    struct rdma_cm_event *event);
  
  	unsigned int (*stats_info_copy)(struct rds_info_iterator *iter,
  					unsigned int avail);
  	void (*exit)(void);
  	void *(*get_mr)(struct scatterlist *sg, unsigned long nr_sg,
9e630bcb7   Avinash Repaka   RDS: RDMA: Fix th...
551
552
  			struct rds_sock *rs, u32 *key_ret,
  			struct rds_connection *conn);
39de82817   Andy Grover   RDS: Main header ...
553
554
555
  	void (*sync_mr)(void *trans_private, int direction);
  	void (*free_mr)(void *trans_private, int invalidate);
  	void (*flush_mrs)(void);
ebeeb1ad9   Sowmini Varadhan   rds: tcp: use rds...
556
  	bool (*t_unloading)(struct rds_connection *conn);
56dc8bce9   Santosh Shilimkar   rds: add transpor...
557
  	u8 (*get_tos_map)(u8 tos);
39de82817   Andy Grover   RDS: Main header ...
558
  };
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
559
560
561
562
563
  /* Bind hash table key length.  It is the sum of the size of a struct
   * in6_addr, a scope_id  and a port.
   */
  #define RDS_BOUND_KEY_LEN \
  	(sizeof(struct in6_addr) + sizeof(__u32) + sizeof(__be16))
39de82817   Andy Grover   RDS: Main header ...
564
565
566
567
568
569
570
571
572
573
  struct rds_sock {
  	struct sock		rs_sk;
  
  	u64			rs_user_addr;
  	u64			rs_user_bytes;
  
  	/*
  	 * bound_addr used for both incoming and outgoing, no INADDR_ANY
  	 * support.
  	 */
7b5654349   santosh.shilimkar@oracle.com   RDS: convert bind...
574
  	struct rhash_head	rs_bound_node;
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
575
576
577
578
579
580
581
582
  	u8			rs_bound_key[RDS_BOUND_KEY_LEN];
  	struct sockaddr_in6	rs_bound_sin6;
  #define rs_bound_addr		rs_bound_sin6.sin6_addr
  #define rs_bound_addr_v4	rs_bound_sin6.sin6_addr.s6_addr32[3]
  #define rs_bound_port		rs_bound_sin6.sin6_port
  #define rs_bound_scope_id	rs_bound_sin6.sin6_scope_id
  	struct in6_addr		rs_conn_addr;
  #define rs_conn_addr_v4		rs_conn_addr.s6_addr32[3]
39de82817   Andy Grover   RDS: Main header ...
583
  	__be16			rs_conn_port;
39de82817   Andy Grover   RDS: Main header ...
584
585
586
587
588
589
590
591
592
593
  	struct rds_transport    *rs_transport;
  
  	/*
  	 * rds_sendmsg caches the conn it used the last time around.
  	 * This helps avoid costly lookups.
  	 */
  	struct rds_connection	*rs_conn;
  
  	/* flag indicating we were congested or not */
  	int			rs_congested;
b98ba52f9   Andy Grover   RDS: only put soc...
594
595
  	/* seen congestion (ENOBUFS) when sending? */
  	int			rs_seen_congestion;
39de82817   Andy Grover   RDS: Main header ...
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
  
  	/* rs_lock protects all these adjacent members before the newline */
  	spinlock_t		rs_lock;
  	struct list_head	rs_send_queue;
  	u32			rs_snd_bytes;
  	int			rs_rcv_bytes;
  	struct list_head	rs_notify_queue;	/* currently used for failed RDMAs */
  
  	/* Congestion wake_up. If rs_cong_monitor is set, we use cong_mask
  	 * to decide whether the application should be woken up.
  	 * If not set, we use rs_cong_track to find out whether a cong map
  	 * update arrived.
  	 */
  	uint64_t		rs_cong_mask;
  	uint64_t		rs_cong_notify;
  	struct list_head	rs_cong_list;
  	unsigned long		rs_cong_track;
  
  	/*
  	 * rs_recv_lock protects the receive queue, and is
  	 * used to serialize with rds_release.
  	 */
  	rwlock_t		rs_recv_lock;
  	struct list_head	rs_recv_queue;
  
  	/* just for stats reporting */
  	struct list_head	rs_item;
  
  	/* these have their own lock */
  	spinlock_t		rs_rdma_lock;
  	struct rb_root		rs_rdma_keys;
  
  	/* Socket options - in case there will be more */
  	unsigned char		rs_recverr,
  				rs_cong_monitor;
5916e2c15   Sowmini Varadhan   RDS: TCP: Enable ...
631
  	u32			rs_hash_initval;
3289025ae   Santosh Shilimkar   RDS: add receive ...
632
633
634
635
  
  	/* Socket receive path trace points*/
  	u8			rs_rx_traces;
  	u8			rs_rx_trace[RDS_MSG_RX_DGRAM_TRACE_MAX];
9426bbc6d   Sowmini Varadhan   rds: use list str...
636
  	struct rds_msg_zcopy_queue rs_zcookie_queue;
3eb450367   Santosh Shilimkar   rds: add type of ...
637
  	u8			rs_tos;
39de82817   Andy Grover   RDS: Main header ...
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
  };
  
  static inline struct rds_sock *rds_sk_to_rs(const struct sock *sk)
  {
  	return container_of(sk, struct rds_sock, rs_sk);
  }
  static inline struct sock *rds_rs_to_sk(struct rds_sock *rs)
  {
  	return &rs->rs_sk;
  }
  
  /*
   * The stack assigns sk_sndbuf and sk_rcvbuf to twice the specified value
   * to account for overhead.  We don't account for overhead, we just apply
   * the number of payload bytes to the specified value.
   */
  static inline int rds_sk_sndbuf(struct rds_sock *rs)
  {
  	return rds_rs_to_sk(rs)->sk_sndbuf / 2;
  }
  static inline int rds_sk_rcvbuf(struct rds_sock *rs)
  {
  	return rds_rs_to_sk(rs)->sk_rcvbuf / 2;
  }
  
  struct rds_statistics {
  	uint64_t	s_conn_reset;
  	uint64_t	s_recv_drop_bad_checksum;
  	uint64_t	s_recv_drop_old_seq;
  	uint64_t	s_recv_drop_no_sock;
  	uint64_t	s_recv_drop_dead_sock;
  	uint64_t	s_recv_deliver_raced;
  	uint64_t	s_recv_delivered;
  	uint64_t	s_recv_queued;
  	uint64_t	s_recv_immediate_retry;
  	uint64_t	s_recv_delayed_retry;
  	uint64_t	s_recv_ack_required;
  	uint64_t	s_recv_rdma_bytes;
  	uint64_t	s_recv_ping;
  	uint64_t	s_send_queue_empty;
  	uint64_t	s_send_queue_full;
049ee3f50   Andy Grover   RDS: Change send ...
679
680
  	uint64_t	s_send_lock_contention;
  	uint64_t	s_send_lock_queue_raced;
39de82817   Andy Grover   RDS: Main header ...
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
  	uint64_t	s_send_immediate_retry;
  	uint64_t	s_send_delayed_retry;
  	uint64_t	s_send_drop_acked;
  	uint64_t	s_send_ack_required;
  	uint64_t	s_send_queued;
  	uint64_t	s_send_rdma;
  	uint64_t	s_send_rdma_bytes;
  	uint64_t	s_send_pong;
  	uint64_t	s_page_remainder_hit;
  	uint64_t	s_page_remainder_miss;
  	uint64_t	s_copy_to_user;
  	uint64_t	s_copy_from_user;
  	uint64_t	s_cong_update_queued;
  	uint64_t	s_cong_update_received;
  	uint64_t	s_cong_send_error;
  	uint64_t	s_cong_send_blocked;
192a798f5   Venkat Venkatsubra   RDS: add stat for...
697
698
  	uint64_t	s_recv_bytes_added_to_socket;
  	uint64_t	s_recv_bytes_removed_from_socket;
11740ef44   Andy Grover   rds: check for ex...
699
  	uint64_t	s_send_stuck_rm;
39de82817   Andy Grover   RDS: Main header ...
700
701
702
703
704
705
706
707
  };
  
  /* af_rds.c */
  void rds_sock_addref(struct rds_sock *rs);
  void rds_sock_put(struct rds_sock *rs);
  void rds_wake_sk_sleep(struct rds_sock *rs);
  static inline void __rds_wake_sk_sleep(struct sock *sk)
  {
aa3951451   Eric Dumazet   net: sk_sleep() h...
708
  	wait_queue_head_t *waitq = sk_sleep(sk);
39de82817   Andy Grover   RDS: Main header ...
709
710
711
712
713
714
715
716
717
718
  
  	if (!sock_flag(sk, SOCK_DEAD) && waitq)
  		wake_up(waitq);
  }
  extern wait_queue_head_t rds_poll_waitq;
  
  
  /* bind.c */
  int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
  void rds_remove_bound(struct rds_sock *rs);
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
719
720
  struct rds_sock *rds_find_bound(const struct in6_addr *addr, __be16 port,
  				__u32 scope_id);
7b5654349   santosh.shilimkar@oracle.com   RDS: convert bind...
721
722
  int rds_bind_lock_init(void);
  void rds_bind_lock_destroy(void);
39de82817   Andy Grover   RDS: Main header ...
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
  
  /* cong.c */
  int rds_cong_get_maps(struct rds_connection *conn);
  void rds_cong_add_conn(struct rds_connection *conn);
  void rds_cong_remove_conn(struct rds_connection *conn);
  void rds_cong_set_bit(struct rds_cong_map *map, __be16 port);
  void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port);
  int rds_cong_wait(struct rds_cong_map *map, __be16 port, int nonblock, struct rds_sock *rs);
  void rds_cong_queue_updates(struct rds_cong_map *map);
  void rds_cong_map_updated(struct rds_cong_map *map, uint64_t);
  int rds_cong_updated_since(unsigned long *recent);
  void rds_cong_add_socket(struct rds_sock *);
  void rds_cong_remove_socket(struct rds_sock *);
  void rds_cong_exit(void);
  struct rds_message *rds_cong_update_alloc(struct rds_connection *conn);
1e2b44e78   Ka-Cheong Poon   rds: Enable RDS I...
738
  /* connection.c */
905dd4184   Sowmini Varadhan   RDS: TCP: Track p...
739
  extern u32 rds_gen_num;
ef87b7ea3   Zach Brown   RDS: remove __ini...
740
  int rds_conn_init(void);
39de82817   Andy Grover   RDS: Main header ...
741
  void rds_conn_exit(void);
d5a8ac28a   Sowmini Varadhan   RDS-TCP: Make RDS...
742
  struct rds_connection *rds_conn_create(struct net *net,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
743
744
  				       const struct in6_addr *laddr,
  				       const struct in6_addr *faddr,
3eb450367   Santosh Shilimkar   rds: add type of ...
745
746
  				       struct rds_transport *trans,
  				       u8 tos, gfp_t gfp,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
747
  				       int dev_if);
d5a8ac28a   Sowmini Varadhan   RDS-TCP: Make RDS...
748
  struct rds_connection *rds_conn_create_outgoing(struct net *net,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
749
750
751
  						const struct in6_addr *laddr,
  						const struct in6_addr *faddr,
  						struct rds_transport *trans,
3eb450367   Santosh Shilimkar   rds: add type of ...
752
  						u8 tos, gfp_t gfp, int dev_if);
d769ef81d   Sowmini Varadhan   RDS: Update rds_c...
753
  void rds_conn_shutdown(struct rds_conn_path *cpath);
39de82817   Andy Grover   RDS: Main header ...
754
  void rds_conn_destroy(struct rds_connection *conn);
39de82817   Andy Grover   RDS: Main header ...
755
  void rds_conn_drop(struct rds_connection *conn);
aed20a53a   Sowmini Varadhan   rds: cancel send/...
756
  void rds_conn_path_drop(struct rds_conn_path *cpath, bool destroy);
f3c6808d3   Zach Brown   RDS: introduce rd...
757
  void rds_conn_connect_if_down(struct rds_connection *conn);
3c0a59001   Sowmini Varadhan   RDS: Add rds_conn...
758
  void rds_conn_path_connect_if_down(struct rds_conn_path *cp);
39de82817   Andy Grover   RDS: Main header ...
759
760
761
762
  void rds_for_each_conn_info(struct socket *sock, unsigned int len,
  			  struct rds_info_iterator *iter,
  			  struct rds_info_lengths *lens,
  			  int (*visitor)(struct rds_connection *, void *),
f1cb9d68b   Salvatore Mesoraca   net: rds: drop VL...
763
  			  u64 *buffer,
39de82817   Andy Grover   RDS: Main header ...
764
  			  size_t item_len);
39de82817   Andy Grover   RDS: Main header ...
765

6cdaf03f8   Nicolas Iooss   RDS: add __printf...
766
  __printf(2, 3)
fb1b3dc43   Sowmini Varadhan   RDS: Add rds_conn...
767
768
769
  void __rds_conn_path_error(struct rds_conn_path *cp, const char *, ...);
  #define rds_conn_path_error(cp, fmt...) \
  	__rds_conn_path_error(cp, KERN_WARNING "RDS: " fmt)
39de82817   Andy Grover   RDS: Main header ...
770
  static inline int
0cb43965d   Sowmini Varadhan   RDS: split out co...
771
772
773
774
775
776
  rds_conn_path_transition(struct rds_conn_path *cp, int old, int new)
  {
  	return atomic_cmpxchg(&cp->cp_state, old, new) == old;
  }
  
  static inline int
39de82817   Andy Grover   RDS: Main header ...
777
778
  rds_conn_transition(struct rds_connection *conn, int old, int new)
  {
7e8f4413d   Sowmini Varadhan   RDS: add t_mp_cap...
779
  	WARN_ON(conn->c_trans->t_mp_capable);
0cb43965d   Sowmini Varadhan   RDS: split out co...
780
781
782
783
784
785
786
  	return rds_conn_path_transition(&conn->c_path[0], old, new);
  }
  
  static inline int
  rds_conn_path_state(struct rds_conn_path *cp)
  {
  	return atomic_read(&cp->cp_state);
39de82817   Andy Grover   RDS: Main header ...
787
788
789
790
791
  }
  
  static inline int
  rds_conn_state(struct rds_connection *conn)
  {
7e8f4413d   Sowmini Varadhan   RDS: add t_mp_cap...
792
  	WARN_ON(conn->c_trans->t_mp_capable);
0cb43965d   Sowmini Varadhan   RDS: split out co...
793
794
795
796
797
798
799
  	return rds_conn_path_state(&conn->c_path[0]);
  }
  
  static inline int
  rds_conn_path_up(struct rds_conn_path *cp)
  {
  	return atomic_read(&cp->cp_state) == RDS_CONN_UP;
39de82817   Andy Grover   RDS: Main header ...
800
801
802
803
804
  }
  
  static inline int
  rds_conn_up(struct rds_connection *conn)
  {
7e8f4413d   Sowmini Varadhan   RDS: add t_mp_cap...
805
  	WARN_ON(conn->c_trans->t_mp_capable);
0cb43965d   Sowmini Varadhan   RDS: split out co...
806
807
808
809
810
811
812
  	return rds_conn_path_up(&conn->c_path[0]);
  }
  
  static inline int
  rds_conn_path_connecting(struct rds_conn_path *cp)
  {
  	return atomic_read(&cp->cp_state) == RDS_CONN_CONNECTING;
39de82817   Andy Grover   RDS: Main header ...
813
814
815
816
817
  }
  
  static inline int
  rds_conn_connecting(struct rds_connection *conn)
  {
7e8f4413d   Sowmini Varadhan   RDS: add t_mp_cap...
818
  	WARN_ON(conn->c_trans->t_mp_capable);
0cb43965d   Sowmini Varadhan   RDS: split out co...
819
  	return rds_conn_path_connecting(&conn->c_path[0]);
39de82817   Andy Grover   RDS: Main header ...
820
821
822
823
  }
  
  /* message.c */
  struct rds_message *rds_message_alloc(unsigned int nents, gfp_t gfp);
c75ab8a55   shamir rabinovitch   net/rds: remove u...
824
825
  struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents,
  					  int *ret);
0cebaccef   Sowmini Varadhan   rds: zerocopy Tx ...
826
827
  int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from,
  			       bool zcopy);
39de82817   Andy Grover   RDS: Main header ...
828
829
830
831
832
833
834
  struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned int total_len);
  void rds_message_populate_header(struct rds_header *hdr, __be16 sport,
  				 __be16 dport, u64 seq);
  int rds_message_add_extension(struct rds_header *hdr,
  			      unsigned int type, const void *data, unsigned int len);
  int rds_message_next_extension(struct rds_header *hdr,
  			       unsigned int *pos, void *buf, unsigned int *buflen);
39de82817   Andy Grover   RDS: Main header ...
835
  int rds_message_add_rdma_dest_extension(struct rds_header *hdr, u32 r_key, u32 offset);
c310e72c8   Al Viro   rds: switch ->inc...
836
  int rds_message_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to);
39de82817   Andy Grover   RDS: Main header ...
837
838
839
840
841
  void rds_message_inc_free(struct rds_incoming *inc);
  void rds_message_addref(struct rds_message *rm);
  void rds_message_put(struct rds_message *rm);
  void rds_message_wait(struct rds_message *rm);
  void rds_message_unmapped(struct rds_message *rm);
9426bbc6d   Sowmini Varadhan   rds: use list str...
842
  void rds_notify_msg_zcopy_purge(struct rds_msg_zcopy_queue *info);
39de82817   Andy Grover   RDS: Main header ...
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
  
  static inline void rds_message_make_checksum(struct rds_header *hdr)
  {
  	hdr->h_csum = 0;
  	hdr->h_csum = ip_fast_csum((void *) hdr, sizeof(*hdr) >> 2);
  }
  
  static inline int rds_message_verify_checksum(const struct rds_header *hdr)
  {
  	return !hdr->h_csum || ip_fast_csum((void *) hdr, sizeof(*hdr) >> 2) == 0;
  }
  
  
  /* page.c */
  int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
  			     gfp_t gfp);
39de82817   Andy Grover   RDS: Main header ...
859
860
861
862
  void rds_page_exit(void);
  
  /* recv.c */
  void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
863
  		  struct in6_addr *saddr);
5e833e025   Sowmini Varadhan   RDS: rds_inc_path...
864
  void rds_inc_path_init(struct rds_incoming *inc, struct rds_conn_path *conn,
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
865
  		       struct in6_addr *saddr);
39de82817   Andy Grover   RDS: Main header ...
866
  void rds_inc_put(struct rds_incoming *inc);
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
867
868
  void rds_recv_incoming(struct rds_connection *conn, struct in6_addr *saddr,
  		       struct in6_addr *daddr,
6114eab53   Cong Wang   rds: remove the s...
869
  		       struct rds_incoming *inc, gfp_t gfp);
1b7841404   Ying Xue   net: Remove iocb ...
870
871
  int rds_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
  		int msg_flags);
39de82817   Andy Grover   RDS: Main header ...
872
873
874
875
876
  void rds_clear_recv_queue(struct rds_sock *rs);
  int rds_notify_queue_get(struct rds_sock *rs, struct msghdr *msg);
  void rds_inc_info_copy(struct rds_incoming *inc,
  		       struct rds_info_iterator *iter,
  		       __be32 saddr, __be32 daddr, int flip);
1e2b44e78   Ka-Cheong Poon   rds: Enable RDS I...
877
878
879
880
  void rds6_inc_info_copy(struct rds_incoming *inc,
  			struct rds_info_iterator *iter,
  			struct in6_addr *saddr, struct in6_addr *daddr,
  			int flip);
39de82817   Andy Grover   RDS: Main header ...
881
882
  
  /* send.c */
1b7841404   Ying Xue   net: Remove iocb ...
883
  int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len);
d769ef81d   Sowmini Varadhan   RDS: Update rds_c...
884
  void rds_send_path_reset(struct rds_conn_path *conn);
1f9ecd7ea   Sowmini Varadhan   RDS: Pass rds_con...
885
  int rds_send_xmit(struct rds_conn_path *cp);
39de82817   Andy Grover   RDS: Main header ...
886
  struct sockaddr_in;
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
887
  void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in6 *dest);
39de82817   Andy Grover   RDS: Main header ...
888
889
890
  typedef int (*is_acked_func)(struct rds_message *rm, uint64_t ack);
  void rds_send_drop_acked(struct rds_connection *conn, u64 ack,
  			 is_acked_func is_acked);
5c3d274c7   Sowmini Varadhan   RDS: Add rds_send...
891
892
  void rds_send_path_drop_acked(struct rds_conn_path *cp, u64 ack,
  			      is_acked_func is_acked);
69b92b5b7   Sowmini Varadhan   rds: tcp: send ha...
893
  void rds_send_ping(struct rds_connection *conn, int cp_index);
45997e9e2   Sowmini Varadhan   RDS: Make rds_sen...
894
  int rds_send_pong(struct rds_conn_path *cp, __be16 dport);
39de82817   Andy Grover   RDS: Main header ...
895
896
897
  
  /* rdma.c */
  void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force);
21f79afa5   Andy Grover   RDS: fold rdma.h ...
898
899
900
901
  int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen);
  int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen);
  int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
  void rds_rdma_drop_keys(struct rds_sock *rs);
ea010070d   shamir rabinovitch   net/rds: fix warn...
902
903
  int rds_rdma_extra_size(struct rds_rdma_args *args,
  			struct rds_iov_vector *iov);
21f79afa5   Andy Grover   RDS: fold rdma.h ...
904
905
906
  int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm,
  			  struct cmsghdr *cmsg);
  int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
ea010070d   shamir rabinovitch   net/rds: fix warn...
907
908
  			  struct cmsghdr *cmsg,
  			  struct rds_iov_vector *vec);
21f79afa5   Andy Grover   RDS: fold rdma.h ...
909
910
  int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
  			  struct cmsghdr *cmsg);
f8b3aaf2b   Andy Grover   RDS: Remove struc...
911
  void rds_rdma_free_op(struct rm_rdma_op *ro);
d0ab25a83   Andy Grover   RDS: purge atomic...
912
  void rds_atomic_free_op(struct rm_atomic_op *ao);
15133f6e6   Andy Grover   RDS: Implement at...
913
914
915
916
  void rds_rdma_send_complete(struct rds_message *rm, int wc_status);
  void rds_atomic_send_complete(struct rds_message *rm, int wc_status);
  int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
  		    struct cmsghdr *cmsg);
21f79afa5   Andy Grover   RDS: fold rdma.h ...
917

c1b1203d6   Joe Perches   net: misc: Remove...
918
  void __rds_put_mr_final(struct rds_mr *mr);
21f79afa5   Andy Grover   RDS: fold rdma.h ...
919
920
  static inline void rds_mr_put(struct rds_mr *mr)
  {
803ea8505   Reshetova, Elena   net, rds: convert...
921
  	if (refcount_dec_and_test(&mr->r_refcount))
21f79afa5   Andy Grover   RDS: fold rdma.h ...
922
923
  		__rds_put_mr_final(mr);
  }
39de82817   Andy Grover   RDS: Main header ...
924

ebeeb1ad9   Sowmini Varadhan   rds: tcp: use rds...
925
926
927
928
929
  static inline bool rds_destroy_pending(struct rds_connection *conn)
  {
  	return !check_net(rds_conn_net(conn)) ||
  	       (conn->c_trans->t_unloading && conn->c_trans->t_unloading(conn));
  }
39de82817   Andy Grover   RDS: Main header ...
930
  /* stats.c */
9b8de7479   David Howells   FRV: Fix the sect...
931
  DECLARE_PER_CPU_SHARED_ALIGNED(struct rds_statistics, rds_stats);
39de82817   Andy Grover   RDS: Main header ...
932
933
934
935
936
937
938
939
940
941
  #define rds_stats_inc_which(which, member) do {		\
  	per_cpu(which, get_cpu()).member++;		\
  	put_cpu();					\
  } while (0)
  #define rds_stats_inc(member) rds_stats_inc_which(rds_stats, member)
  #define rds_stats_add_which(which, member, count) do {		\
  	per_cpu(which, get_cpu()).member += count;	\
  	put_cpu();					\
  } while (0)
  #define rds_stats_add(member, count) rds_stats_add_which(rds_stats, member, count)
ef87b7ea3   Zach Brown   RDS: remove __ini...
942
  int rds_stats_init(void);
39de82817   Andy Grover   RDS: Main header ...
943
944
  void rds_stats_exit(void);
  void rds_stats_info_copy(struct rds_info_iterator *iter,
36cbd3dcc   Jan Engelhardt   net: mark read-on...
945
946
  			 uint64_t *values, const char *const *names,
  			 size_t nr);
39de82817   Andy Grover   RDS: Main header ...
947
948
  
  /* sysctl.c */
ef87b7ea3   Zach Brown   RDS: remove __ini...
949
  int rds_sysctl_init(void);
39de82817   Andy Grover   RDS: Main header ...
950
951
952
953
954
955
956
957
958
959
960
961
962
  void rds_sysctl_exit(void);
  extern unsigned long rds_sysctl_sndbuf_min;
  extern unsigned long rds_sysctl_sndbuf_default;
  extern unsigned long rds_sysctl_sndbuf_max;
  extern unsigned long rds_sysctl_reconnect_min_jiffies;
  extern unsigned long rds_sysctl_reconnect_max_jiffies;
  extern unsigned int  rds_sysctl_max_unacked_packets;
  extern unsigned int  rds_sysctl_max_unacked_bytes;
  extern unsigned int  rds_sysctl_ping_enable;
  extern unsigned long rds_sysctl_trace_flags;
  extern unsigned int  rds_sysctl_trace_level;
  
  /* threads.c */
ef87b7ea3   Zach Brown   RDS: remove __ini...
963
  int rds_threads_init(void);
39de82817   Andy Grover   RDS: Main header ...
964
965
  void rds_threads_exit(void);
  extern struct workqueue_struct *rds_wq;
0cb43965d   Sowmini Varadhan   RDS: split out co...
966
  void rds_queue_reconnect(struct rds_conn_path *cp);
39de82817   Andy Grover   RDS: Main header ...
967
968
969
970
  void rds_connect_worker(struct work_struct *);
  void rds_shutdown_worker(struct work_struct *);
  void rds_send_worker(struct work_struct *);
  void rds_recv_worker(struct work_struct *);
0cb43965d   Sowmini Varadhan   RDS: split out co...
971
  void rds_connect_path_complete(struct rds_conn_path *conn, int curr);
39de82817   Andy Grover   RDS: Main header ...
972
  void rds_connect_complete(struct rds_connection *conn);
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
973
  int rds_addr_cmp(const struct in6_addr *a1, const struct in6_addr *a2);
39de82817   Andy Grover   RDS: Main header ...
974
975
  
  /* transport.c */
a8d63a53b   Zhu Yanjun   rds: remove unnec...
976
  void rds_trans_register(struct rds_transport *trans);
39de82817   Andy Grover   RDS: Main header ...
977
  void rds_trans_unregister(struct rds_transport *trans);
eee2fa6ab   Ka-Cheong Poon   rds: Changing IP ...
978
979
980
  struct rds_transport *rds_trans_get_preferred(struct net *net,
  					      const struct in6_addr *addr,
  					      __u32 scope_id);
5adb5bc65   Zach Brown   RDS: have sockets...
981
  void rds_trans_put(struct rds_transport *trans);
39de82817   Andy Grover   RDS: Main header ...
982
983
  unsigned int rds_trans_stats_info_copy(struct rds_info_iterator *iter,
  				       unsigned int avail);
d97dac54b   Sowmini Varadhan   net/rds: Add sets...
984
  struct rds_transport *rds_trans_get(int t_type);
ef87b7ea3   Zach Brown   RDS: remove __ini...
985
  int rds_trans_init(void);
39de82817   Andy Grover   RDS: Main header ...
986
987
988
  void rds_trans_exit(void);
  
  #endif