1#ifndef _RDS_RDS_H
2#define _RDS_RDS_H
3
4#include <net/sock.h>
5#include <linux/scatterlist.h>
6#include <linux/highmem.h>
7#include <rdma/rdma_cm.h>
8#include <linux/mutex.h>
9#include <linux/rds.h>
10#include <linux/rhashtable.h>
11
12#include "info.h"
13
14
15
16
17#define RDS_PROTOCOL_3_0 0x0300
18#define RDS_PROTOCOL_3_1 0x0301
19#define RDS_PROTOCOL_VERSION RDS_PROTOCOL_3_1
20#define RDS_PROTOCOL_MAJOR(v) ((v) >> 8)
21#define RDS_PROTOCOL_MINOR(v) ((v) & 255)
22#define RDS_PROTOCOL(maj, min) (((maj) << 8) | min)
23
24
25
26
27
28
29
30#define RDS_PORT 18634
31
32#ifdef ATOMIC64_INIT
33#define KERNEL_HAS_ATOMIC64
34#endif
35
36#ifdef DEBUG
37#define rdsdebug(fmt, args...) pr_debug("%s(): " fmt, __func__ , ##args)
38#else
39
40static inline __printf(1, 2)
41void rdsdebug(char *fmt, ...)
42{
43}
44#endif
45
46
47#define ceil(x, y) \
48 ({ unsigned long __x = (x), __y = (y); (__x + __y - 1) / __y; })
49
50#define RDS_FRAG_SHIFT 12
51#define RDS_FRAG_SIZE ((unsigned int)(1 << RDS_FRAG_SHIFT))
52
53#define RDS_CONG_MAP_BYTES (65536 / 8)
54#define RDS_CONG_MAP_PAGES (PAGE_ALIGN(RDS_CONG_MAP_BYTES) / PAGE_SIZE)
55#define RDS_CONG_MAP_PAGE_BITS (PAGE_SIZE * 8)
56
57struct rds_cong_map {
58 struct rb_node m_rb_node;
59 __be32 m_addr;
60 wait_queue_head_t m_waitq;
61 struct list_head m_conn_list;
62 unsigned long m_page_addrs[RDS_CONG_MAP_PAGES];
63};
64
65
66
67
68
69
70
71
72enum {
73 RDS_CONN_DOWN = 0,
74 RDS_CONN_CONNECTING,
75 RDS_CONN_DISCONNECTING,
76 RDS_CONN_UP,
77 RDS_CONN_RESETTING,
78 RDS_CONN_ERROR,
79};
80
81
82#define RDS_LL_SEND_FULL 0
83#define RDS_RECONNECT_PENDING 1
84#define RDS_IN_XMIT 2
85#define RDS_RECV_REFILL 3
86
87struct rds_connection {
88 struct hlist_node c_hash_node;
89 __be32 c_laddr;
90 __be32 c_faddr;
91 unsigned int c_loopback:1,
92 c_outgoing:1,
93 c_pad_to_32:30;
94 struct rds_connection *c_passive;
95
96 struct rds_cong_map *c_lcong;
97 struct rds_cong_map *c_fcong;
98
99 struct rds_message *c_xmit_rm;
100 unsigned long c_xmit_sg;
101 unsigned int c_xmit_hdr_off;
102 unsigned int c_xmit_data_off;
103 unsigned int c_xmit_atomic_sent;
104 unsigned int c_xmit_rdma_sent;
105 unsigned int c_xmit_data_sent;
106
107 spinlock_t c_lock;
108 u64 c_next_tx_seq;
109 struct list_head c_send_queue;
110 struct list_head c_retrans;
111
112 u64 c_next_rx_seq;
113
114 struct rds_transport *c_trans;
115 void *c_transport_data;
116
117 atomic_t c_state;
118 unsigned long c_send_gen;
119 unsigned long c_flags;
120 unsigned long c_reconnect_jiffies;
121 struct delayed_work c_send_w;
122 struct delayed_work c_recv_w;
123 struct delayed_work c_conn_w;
124 struct work_struct c_down_w;
125 struct mutex c_cm_lock;
126 wait_queue_head_t c_waitq;
127
128 struct list_head c_map_item;
129 unsigned long c_map_queued;
130
131 unsigned int c_unacked_packets;
132 unsigned int c_unacked_bytes;
133
134
135 unsigned int c_version;
136 possible_net_t c_net;
137};
138
139static inline
140struct net *rds_conn_net(struct rds_connection *conn)
141{
142 return read_pnet(&conn->c_net);
143}
144
145static inline
146void rds_conn_net_set(struct rds_connection *conn, struct net *net)
147{
148 write_pnet(&conn->c_net, net);
149}
150
151#define RDS_FLAG_CONG_BITMAP 0x01
152#define RDS_FLAG_ACK_REQUIRED 0x02
153#define RDS_FLAG_RETRANSMITTED 0x04
154#define RDS_MAX_ADV_CREDIT 255
155
156
157
158
159#define RDS_HEADER_EXT_SPACE 16
160
161struct rds_header {
162 __be64 h_sequence;
163 __be64 h_ack;
164 __be32 h_len;
165 __be16 h_sport;
166 __be16 h_dport;
167 u8 h_flags;
168 u8 h_credit;
169 u8 h_padding[4];
170 __sum16 h_csum;
171
172 u8 h_exthdr[RDS_HEADER_EXT_SPACE];
173};
174
175
176
177
178#define RDS_EXTHDR_NONE 0
179
180
181
182
183
184
185
186
187
188
189
190#define RDS_EXTHDR_VERSION 1
191struct rds_ext_header_version {
192 __be32 h_version;
193};
194
195
196
197
198
199#define RDS_EXTHDR_RDMA 2
200struct rds_ext_header_rdma {
201 __be32 h_rdma_rkey;
202};
203
204
205
206
207
208
209#define RDS_EXTHDR_RDMA_DEST 3
210struct rds_ext_header_rdma_dest {
211 __be32 h_rdma_rkey;
212 __be32 h_rdma_offset;
213};
214
215#define __RDS_EXTHDR_MAX 16
216
217struct rds_incoming {
218 atomic_t i_refcount;
219 struct list_head i_item;
220 struct rds_connection *i_conn;
221 struct rds_header i_hdr;
222 unsigned long i_rx_jiffies;
223 __be32 i_saddr;
224
225 rds_rdma_cookie_t i_rdma_cookie;
226 struct timeval i_rx_tstamp;
227};
228
229struct rds_mr {
230 struct rb_node r_rb_node;
231 atomic_t r_refcount;
232 u32 r_key;
233
234
235 unsigned int r_use_once:1;
236 unsigned int r_invalidate:1;
237 unsigned int r_write:1;
238
239
240
241
242
243 unsigned long r_state;
244 struct rds_sock *r_sock;
245 struct rds_transport *r_trans;
246 void *r_trans_private;
247};
248
249
250#define RDS_MR_DEAD 0
251
252static inline rds_rdma_cookie_t rds_rdma_make_cookie(u32 r_key, u32 offset)
253{
254 return r_key | (((u64) offset) << 32);
255}
256
257static inline u32 rds_rdma_cookie_key(rds_rdma_cookie_t cookie)
258{
259 return cookie;
260}
261
262static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie)
263{
264 return cookie >> 32;
265}
266
267
268#define RDS_ATOMIC_TYPE_CSWP 0
269#define RDS_ATOMIC_TYPE_FADD 1
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300#define RDS_MSG_ON_SOCK 1
301#define RDS_MSG_ON_CONN 2
302#define RDS_MSG_HAS_ACK_SEQ 3
303#define RDS_MSG_ACK_REQUIRED 4
304#define RDS_MSG_RETRANSMITTED 5
305#define RDS_MSG_MAPPED 6
306#define RDS_MSG_PAGEVEC 7
307
308struct rds_message {
309 atomic_t m_refcount;
310 struct list_head m_sock_item;
311 struct list_head m_conn_item;
312 struct rds_incoming m_inc;
313 u64 m_ack_seq;
314 __be32 m_daddr;
315 unsigned long m_flags;
316
317
318
319
320
321
322 spinlock_t m_rs_lock;
323 wait_queue_head_t m_flush_wait;
324
325 struct rds_sock *m_rs;
326
327
328 rds_rdma_cookie_t m_rdma_cookie;
329
330 unsigned int m_used_sgs;
331 unsigned int m_total_sgs;
332
333 void *m_final_op;
334
335 struct {
336 struct rm_atomic_op {
337 int op_type;
338 union {
339 struct {
340 uint64_t compare;
341 uint64_t swap;
342 uint64_t compare_mask;
343 uint64_t swap_mask;
344 } op_m_cswp;
345 struct {
346 uint64_t add;
347 uint64_t nocarry_mask;
348 } op_m_fadd;
349 };
350
351 u32 op_rkey;
352 u64 op_remote_addr;
353 unsigned int op_notify:1;
354 unsigned int op_recverr:1;
355 unsigned int op_mapped:1;
356 unsigned int op_silent:1;
357 unsigned int op_active:1;
358 struct scatterlist *op_sg;
359 struct rds_notifier *op_notifier;
360
361 struct rds_mr *op_rdma_mr;
362 } atomic;
363 struct rm_rdma_op {
364 u32 op_rkey;
365 u64 op_remote_addr;
366 unsigned int op_write:1;
367 unsigned int op_fence:1;
368 unsigned int op_notify:1;
369 unsigned int op_recverr:1;
370 unsigned int op_mapped:1;
371 unsigned int op_silent:1;
372 unsigned int op_active:1;
373 unsigned int op_bytes;
374 unsigned int op_nents;
375 unsigned int op_count;
376 struct scatterlist *op_sg;
377 struct rds_notifier *op_notifier;
378
379 struct rds_mr *op_rdma_mr;
380 } rdma;
381 struct rm_data_op {
382 unsigned int op_active:1;
383 unsigned int op_nents;
384 unsigned int op_count;
385 unsigned int op_dmasg;
386 unsigned int op_dmaoff;
387 struct scatterlist *op_sg;
388 } data;
389 };
390};
391
392
393
394
395
396
397
398
399struct rds_notifier {
400 struct list_head n_list;
401 uint64_t n_user_token;
402 int n_status;
403};
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432struct rds_transport {
433 char t_name[TRANSNAMSIZ];
434 struct list_head t_item;
435 struct module *t_owner;
436 unsigned int t_prefer_loopback:1;
437 unsigned int t_type;
438
439 int (*laddr_check)(struct net *net, __be32 addr);
440 int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp);
441 void (*conn_free)(void *data);
442 int (*conn_connect)(struct rds_connection *conn);
443 void (*conn_shutdown)(struct rds_connection *conn);
444 void (*xmit_prepare)(struct rds_connection *conn);
445 void (*xmit_complete)(struct rds_connection *conn);
446 int (*xmit)(struct rds_connection *conn, struct rds_message *rm,
447 unsigned int hdr_off, unsigned int sg, unsigned int off);
448 int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op);
449 int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op);
450 int (*recv)(struct rds_connection *conn);
451 int (*inc_copy_to_user)(struct rds_incoming *inc, struct iov_iter *to);
452 void (*inc_free)(struct rds_incoming *inc);
453
454 int (*cm_handle_connect)(struct rdma_cm_id *cm_id,
455 struct rdma_cm_event *event);
456 int (*cm_initiate_connect)(struct rdma_cm_id *cm_id);
457 void (*cm_connect_complete)(struct rds_connection *conn,
458 struct rdma_cm_event *event);
459
460 unsigned int (*stats_info_copy)(struct rds_info_iterator *iter,
461 unsigned int avail);
462 void (*exit)(void);
463 void *(*get_mr)(struct scatterlist *sg, unsigned long nr_sg,
464 struct rds_sock *rs, u32 *key_ret);
465 void (*sync_mr)(void *trans_private, int direction);
466 void (*free_mr)(void *trans_private, int invalidate);
467 void (*flush_mrs)(void);
468};
469
470struct rds_sock {
471 struct sock rs_sk;
472
473 u64 rs_user_addr;
474 u64 rs_user_bytes;
475
476
477
478
479
480 struct rhash_head rs_bound_node;
481 u64 rs_bound_key;
482 __be32 rs_bound_addr;
483 __be32 rs_conn_addr;
484 __be16 rs_bound_port;
485 __be16 rs_conn_port;
486 struct rds_transport *rs_transport;
487
488
489
490
491
492 struct rds_connection *rs_conn;
493
494
495 int rs_congested;
496
497 int rs_seen_congestion;
498
499
500 spinlock_t rs_lock;
501 struct list_head rs_send_queue;
502 u32 rs_snd_bytes;
503 int rs_rcv_bytes;
504 struct list_head rs_notify_queue;
505
506
507
508
509
510
511 uint64_t rs_cong_mask;
512 uint64_t rs_cong_notify;
513 struct list_head rs_cong_list;
514 unsigned long rs_cong_track;
515
516
517
518
519
520 rwlock_t rs_recv_lock;
521 struct list_head rs_recv_queue;
522
523
524 struct list_head rs_item;
525
526
527 spinlock_t rs_rdma_lock;
528 struct rb_root rs_rdma_keys;
529
530
531 unsigned char rs_recverr,
532 rs_cong_monitor;
533};
534
535static inline struct rds_sock *rds_sk_to_rs(const struct sock *sk)
536{
537 return container_of(sk, struct rds_sock, rs_sk);
538}
539static inline struct sock *rds_rs_to_sk(struct rds_sock *rs)
540{
541 return &rs->rs_sk;
542}
543
544
545
546
547
548
549static inline int rds_sk_sndbuf(struct rds_sock *rs)
550{
551 return rds_rs_to_sk(rs)->sk_sndbuf / 2;
552}
553static inline int rds_sk_rcvbuf(struct rds_sock *rs)
554{
555 return rds_rs_to_sk(rs)->sk_rcvbuf / 2;
556}
557
558struct rds_statistics {
559 uint64_t s_conn_reset;
560 uint64_t s_recv_drop_bad_checksum;
561 uint64_t s_recv_drop_old_seq;
562 uint64_t s_recv_drop_no_sock;
563 uint64_t s_recv_drop_dead_sock;
564 uint64_t s_recv_deliver_raced;
565 uint64_t s_recv_delivered;
566 uint64_t s_recv_queued;
567 uint64_t s_recv_immediate_retry;
568 uint64_t s_recv_delayed_retry;
569 uint64_t s_recv_ack_required;
570 uint64_t s_recv_rdma_bytes;
571 uint64_t s_recv_ping;
572 uint64_t s_send_queue_empty;
573 uint64_t s_send_queue_full;
574 uint64_t s_send_lock_contention;
575 uint64_t s_send_lock_queue_raced;
576 uint64_t s_send_immediate_retry;
577 uint64_t s_send_delayed_retry;
578 uint64_t s_send_drop_acked;
579 uint64_t s_send_ack_required;
580 uint64_t s_send_queued;
581 uint64_t s_send_rdma;
582 uint64_t s_send_rdma_bytes;
583 uint64_t s_send_pong;
584 uint64_t s_page_remainder_hit;
585 uint64_t s_page_remainder_miss;
586 uint64_t s_copy_to_user;
587 uint64_t s_copy_from_user;
588 uint64_t s_cong_update_queued;
589 uint64_t s_cong_update_received;
590 uint64_t s_cong_send_error;
591 uint64_t s_cong_send_blocked;
592};
593
594
595void rds_sock_addref(struct rds_sock *rs);
596void rds_sock_put(struct rds_sock *rs);
597void rds_wake_sk_sleep(struct rds_sock *rs);
598static inline void __rds_wake_sk_sleep(struct sock *sk)
599{
600 wait_queue_head_t *waitq = sk_sleep(sk);
601
602 if (!sock_flag(sk, SOCK_DEAD) && waitq)
603 wake_up(waitq);
604}
605extern wait_queue_head_t rds_poll_waitq;
606
607
608
609int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
610void rds_remove_bound(struct rds_sock *rs);
611struct rds_sock *rds_find_bound(__be32 addr, __be16 port);
612int rds_bind_lock_init(void);
613void rds_bind_lock_destroy(void);
614
615
616int rds_cong_get_maps(struct rds_connection *conn);
617void rds_cong_add_conn(struct rds_connection *conn);
618void rds_cong_remove_conn(struct rds_connection *conn);
619void rds_cong_set_bit(struct rds_cong_map *map, __be16 port);
620void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port);
621int rds_cong_wait(struct rds_cong_map *map, __be16 port, int nonblock, struct rds_sock *rs);
622void rds_cong_queue_updates(struct rds_cong_map *map);
623void rds_cong_map_updated(struct rds_cong_map *map, uint64_t);
624int rds_cong_updated_since(unsigned long *recent);
625void rds_cong_add_socket(struct rds_sock *);
626void rds_cong_remove_socket(struct rds_sock *);
627void rds_cong_exit(void);
628struct rds_message *rds_cong_update_alloc(struct rds_connection *conn);
629
630
631int rds_conn_init(void);
632void rds_conn_exit(void);
633struct rds_connection *rds_conn_create(struct net *net,
634 __be32 laddr, __be32 faddr,
635 struct rds_transport *trans, gfp_t gfp);
636struct rds_connection *rds_conn_create_outgoing(struct net *net,
637 __be32 laddr, __be32 faddr,
638 struct rds_transport *trans, gfp_t gfp);
639void rds_conn_shutdown(struct rds_connection *conn);
640void rds_conn_destroy(struct rds_connection *conn);
641void rds_conn_drop(struct rds_connection *conn);
642void rds_conn_connect_if_down(struct rds_connection *conn);
643void rds_for_each_conn_info(struct socket *sock, unsigned int len,
644 struct rds_info_iterator *iter,
645 struct rds_info_lengths *lens,
646 int (*visitor)(struct rds_connection *, void *),
647 size_t item_len);
648__printf(2, 3)
649void __rds_conn_error(struct rds_connection *conn, const char *, ...);
650#define rds_conn_error(conn, fmt...) \
651 __rds_conn_error(conn, KERN_WARNING "RDS: " fmt)
652
653static inline int
654rds_conn_transition(struct rds_connection *conn, int old, int new)
655{
656 return atomic_cmpxchg(&conn->c_state, old, new) == old;
657}
658
659static inline int
660rds_conn_state(struct rds_connection *conn)
661{
662 return atomic_read(&conn->c_state);
663}
664
665static inline int
666rds_conn_up(struct rds_connection *conn)
667{
668 return atomic_read(&conn->c_state) == RDS_CONN_UP;
669}
670
671static inline int
672rds_conn_connecting(struct rds_connection *conn)
673{
674 return atomic_read(&conn->c_state) == RDS_CONN_CONNECTING;
675}
676
677
678struct rds_message *rds_message_alloc(unsigned int nents, gfp_t gfp);
679struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents);
680int rds_message_copy_from_user(struct rds_message *rm, struct iov_iter *from);
681struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned int total_len);
682void rds_message_populate_header(struct rds_header *hdr, __be16 sport,
683 __be16 dport, u64 seq);
684int rds_message_add_extension(struct rds_header *hdr,
685 unsigned int type, const void *data, unsigned int len);
686int rds_message_next_extension(struct rds_header *hdr,
687 unsigned int *pos, void *buf, unsigned int *buflen);
688int rds_message_add_rdma_dest_extension(struct rds_header *hdr, u32 r_key, u32 offset);
689int rds_message_inc_copy_to_user(struct rds_incoming *inc, struct iov_iter *to);
690void rds_message_inc_free(struct rds_incoming *inc);
691void rds_message_addref(struct rds_message *rm);
692void rds_message_put(struct rds_message *rm);
693void rds_message_wait(struct rds_message *rm);
694void rds_message_unmapped(struct rds_message *rm);
695
696static inline void rds_message_make_checksum(struct rds_header *hdr)
697{
698 hdr->h_csum = 0;
699 hdr->h_csum = ip_fast_csum((void *) hdr, sizeof(*hdr) >> 2);
700}
701
702static inline int rds_message_verify_checksum(const struct rds_header *hdr)
703{
704 return !hdr->h_csum || ip_fast_csum((void *) hdr, sizeof(*hdr) >> 2) == 0;
705}
706
707
708
709int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
710 gfp_t gfp);
711int rds_page_copy_user(struct page *page, unsigned long offset,
712 void __user *ptr, unsigned long bytes,
713 int to_user);
714#define rds_page_copy_to_user(page, offset, ptr, bytes) \
715 rds_page_copy_user(page, offset, ptr, bytes, 1)
716#define rds_page_copy_from_user(page, offset, ptr, bytes) \
717 rds_page_copy_user(page, offset, ptr, bytes, 0)
718void rds_page_exit(void);
719
720
721void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn,
722 __be32 saddr);
723void rds_inc_put(struct rds_incoming *inc);
724void rds_recv_incoming(struct rds_connection *conn, __be32 saddr, __be32 daddr,
725 struct rds_incoming *inc, gfp_t gfp);
726int rds_recvmsg(struct socket *sock, struct msghdr *msg, size_t size,
727 int msg_flags);
728void rds_clear_recv_queue(struct rds_sock *rs);
729int rds_notify_queue_get(struct rds_sock *rs, struct msghdr *msg);
730void rds_inc_info_copy(struct rds_incoming *inc,
731 struct rds_info_iterator *iter,
732 __be32 saddr, __be32 daddr, int flip);
733
734
735int rds_sendmsg(struct socket *sock, struct msghdr *msg, size_t payload_len);
736void rds_send_reset(struct rds_connection *conn);
737int rds_send_xmit(struct rds_connection *conn);
738struct sockaddr_in;
739void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in *dest);
740typedef int (*is_acked_func)(struct rds_message *rm, uint64_t ack);
741void rds_send_drop_acked(struct rds_connection *conn, u64 ack,
742 is_acked_func is_acked);
743int rds_send_pong(struct rds_connection *conn, __be16 dport);
744struct rds_message *rds_send_get_message(struct rds_connection *,
745 struct rm_rdma_op *);
746
747
748void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force);
749int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen);
750int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen);
751int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
752void rds_rdma_drop_keys(struct rds_sock *rs);
753int rds_rdma_extra_size(struct rds_rdma_args *args);
754int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
755 struct cmsghdr *cmsg);
756int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm,
757 struct cmsghdr *cmsg);
758int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
759 struct cmsghdr *cmsg);
760int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
761 struct cmsghdr *cmsg);
762void rds_rdma_free_op(struct rm_rdma_op *ro);
763void rds_atomic_free_op(struct rm_atomic_op *ao);
764void rds_rdma_send_complete(struct rds_message *rm, int wc_status);
765void rds_atomic_send_complete(struct rds_message *rm, int wc_status);
766int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
767 struct cmsghdr *cmsg);
768
769void __rds_put_mr_final(struct rds_mr *mr);
770static inline void rds_mr_put(struct rds_mr *mr)
771{
772 if (atomic_dec_and_test(&mr->r_refcount))
773 __rds_put_mr_final(mr);
774}
775
776
777DECLARE_PER_CPU_SHARED_ALIGNED(struct rds_statistics, rds_stats);
778#define rds_stats_inc_which(which, member) do { \
779 per_cpu(which, get_cpu()).member++; \
780 put_cpu(); \
781} while (0)
782#define rds_stats_inc(member) rds_stats_inc_which(rds_stats, member)
783#define rds_stats_add_which(which, member, count) do { \
784 per_cpu(which, get_cpu()).member += count; \
785 put_cpu(); \
786} while (0)
787#define rds_stats_add(member, count) rds_stats_add_which(rds_stats, member, count)
788int rds_stats_init(void);
789void rds_stats_exit(void);
790void rds_stats_info_copy(struct rds_info_iterator *iter,
791 uint64_t *values, const char *const *names,
792 size_t nr);
793
794
795int rds_sysctl_init(void);
796void rds_sysctl_exit(void);
797extern unsigned long rds_sysctl_sndbuf_min;
798extern unsigned long rds_sysctl_sndbuf_default;
799extern unsigned long rds_sysctl_sndbuf_max;
800extern unsigned long rds_sysctl_reconnect_min_jiffies;
801extern unsigned long rds_sysctl_reconnect_max_jiffies;
802extern unsigned int rds_sysctl_max_unacked_packets;
803extern unsigned int rds_sysctl_max_unacked_bytes;
804extern unsigned int rds_sysctl_ping_enable;
805extern unsigned long rds_sysctl_trace_flags;
806extern unsigned int rds_sysctl_trace_level;
807
808
809int rds_threads_init(void);
810void rds_threads_exit(void);
811extern struct workqueue_struct *rds_wq;
812void rds_queue_reconnect(struct rds_connection *conn);
813void rds_connect_worker(struct work_struct *);
814void rds_shutdown_worker(struct work_struct *);
815void rds_send_worker(struct work_struct *);
816void rds_recv_worker(struct work_struct *);
817void rds_connect_path_complete(struct rds_connection *conn, int curr);
818void rds_connect_complete(struct rds_connection *conn);
819
820
821int rds_trans_register(struct rds_transport *trans);
822void rds_trans_unregister(struct rds_transport *trans);
823struct rds_transport *rds_trans_get_preferred(struct net *net, __be32 addr);
824void rds_trans_put(struct rds_transport *trans);
825unsigned int rds_trans_stats_info_copy(struct rds_info_iterator *iter,
826 unsigned int avail);
827struct rds_transport *rds_trans_get(int t_type);
828int rds_trans_init(void);
829void rds_trans_exit(void);
830
831#endif
832