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