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 RDS_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
87
88#define RDS_MPATH_WORKERS 8
89#define RDS_MPATH_HASH(rs, n) (jhash_1word((rs)->rs_bound_port, \
90 (rs)->rs_hash_initval) & ((n) - 1))
91
92
93struct rds_conn_path {
94 struct rds_connection *cp_conn;
95 struct rds_message *cp_xmit_rm;
96 unsigned long cp_xmit_sg;
97 unsigned int cp_xmit_hdr_off;
98 unsigned int cp_xmit_data_off;
99 unsigned int cp_xmit_atomic_sent;
100 unsigned int cp_xmit_rdma_sent;
101 unsigned int cp_xmit_data_sent;
102
103 spinlock_t cp_lock;
104 u64 cp_next_tx_seq;
105 struct list_head cp_send_queue;
106 struct list_head cp_retrans;
107
108 u64 cp_next_rx_seq;
109
110 void *cp_transport_data;
111
112 atomic_t cp_state;
113 unsigned long cp_send_gen;
114 unsigned long cp_flags;
115 unsigned long cp_reconnect_jiffies;
116 struct delayed_work cp_send_w;
117 struct delayed_work cp_recv_w;
118 struct delayed_work cp_conn_w;
119 struct work_struct cp_down_w;
120 struct mutex cp_cm_lock;
121 wait_queue_head_t cp_waitq;
122
123 unsigned int cp_unacked_packets;
124 unsigned int cp_unacked_bytes;
125 unsigned int cp_outgoing:1,
126 cp_pad_to_32:31;
127 unsigned int cp_index;
128};
129
130
131struct rds_connection {
132 struct hlist_node c_hash_node;
133 __be32 c_laddr;
134 __be32 c_faddr;
135 unsigned int c_loopback:1,
136 c_ping_triggered:1,
137 c_pad_to_32:30;
138 int c_npaths;
139 struct rds_connection *c_passive;
140 struct rds_transport *c_trans;
141
142 struct rds_cong_map *c_lcong;
143 struct rds_cong_map *c_fcong;
144
145
146 unsigned int c_version;
147 possible_net_t c_net;
148
149 struct list_head c_map_item;
150 unsigned long c_map_queued;
151
152 struct rds_conn_path c_path[RDS_MPATH_WORKERS];
153 wait_queue_head_t c_hs_waitq;
154
155 u32 c_my_gen_num;
156 u32 c_peer_gen_num;
157};
158
159static inline
160struct net *rds_conn_net(struct rds_connection *conn)
161{
162 return read_pnet(&conn->c_net);
163}
164
165static inline
166void rds_conn_net_set(struct rds_connection *conn, struct net *net)
167{
168 write_pnet(&conn->c_net, net);
169}
170
171#define RDS_FLAG_CONG_BITMAP 0x01
172#define RDS_FLAG_ACK_REQUIRED 0x02
173#define RDS_FLAG_RETRANSMITTED 0x04
174#define RDS_MAX_ADV_CREDIT 255
175
176
177
178
179
180
181
182
183#define RDS_FLAG_PROBE_PORT 1
184#define RDS_HS_PROBE(sport, dport) \
185 ((sport == RDS_FLAG_PROBE_PORT && dport == 0) || \
186 (sport == 0 && dport == RDS_FLAG_PROBE_PORT))
187
188
189
190#define RDS_HEADER_EXT_SPACE 16
191
192struct rds_header {
193 __be64 h_sequence;
194 __be64 h_ack;
195 __be32 h_len;
196 __be16 h_sport;
197 __be16 h_dport;
198 u8 h_flags;
199 u8 h_credit;
200 u8 h_padding[4];
201 __sum16 h_csum;
202
203 u8 h_exthdr[RDS_HEADER_EXT_SPACE];
204};
205
206
207
208
209#define RDS_EXTHDR_NONE 0
210
211
212
213
214
215
216
217
218
219
220
221#define RDS_EXTHDR_VERSION 1
222struct rds_ext_header_version {
223 __be32 h_version;
224};
225
226
227
228
229
230#define RDS_EXTHDR_RDMA 2
231struct rds_ext_header_rdma {
232 __be32 h_rdma_rkey;
233};
234
235
236
237
238
239
240#define RDS_EXTHDR_RDMA_DEST 3
241struct rds_ext_header_rdma_dest {
242 __be32 h_rdma_rkey;
243 __be32 h_rdma_offset;
244};
245
246
247
248
249#define RDS_EXTHDR_NPATHS 5
250#define RDS_EXTHDR_GEN_NUM 6
251
252#define __RDS_EXTHDR_MAX 16
253
254struct rds_incoming {
255 atomic_t i_refcount;
256 struct list_head i_item;
257 struct rds_connection *i_conn;
258 struct rds_conn_path *i_conn_path;
259 struct rds_header i_hdr;
260 unsigned long i_rx_jiffies;
261 __be32 i_saddr;
262
263 rds_rdma_cookie_t i_rdma_cookie;
264 struct timeval i_rx_tstamp;
265};
266
267struct rds_mr {
268 struct rb_node r_rb_node;
269 atomic_t r_refcount;
270 u32 r_key;
271
272
273 unsigned int r_use_once:1;
274 unsigned int r_invalidate:1;
275 unsigned int r_write:1;
276
277
278
279
280
281 unsigned long r_state;
282 struct rds_sock *r_sock;
283 struct rds_transport *r_trans;
284 void *r_trans_private;
285};
286
287
288#define RDS_MR_DEAD 0
289
290static inline rds_rdma_cookie_t rds_rdma_make_cookie(u32 r_key, u32 offset)
291{
292 return r_key | (((u64) offset) << 32);
293}
294
295static inline u32 rds_rdma_cookie_key(rds_rdma_cookie_t cookie)
296{
297 return cookie;
298}
299
300static inline u32 rds_rdma_cookie_offset(rds_rdma_cookie_t cookie)
301{
302 return cookie >> 32;
303}
304
305
306#define RDS_ATOMIC_TYPE_CSWP 0
307#define RDS_ATOMIC_TYPE_FADD 1
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338#define RDS_MSG_ON_SOCK 1
339#define RDS_MSG_ON_CONN 2
340#define RDS_MSG_HAS_ACK_SEQ 3
341#define RDS_MSG_ACK_REQUIRED 4
342#define RDS_MSG_RETRANSMITTED 5
343#define RDS_MSG_MAPPED 6
344#define RDS_MSG_PAGEVEC 7
345#define RDS_MSG_FLUSH 8
346
347struct rds_message {
348 atomic_t m_refcount;
349 struct list_head m_sock_item;
350 struct list_head m_conn_item;
351 struct rds_incoming m_inc;
352 u64 m_ack_seq;
353 __be32 m_daddr;
354 unsigned long m_flags;
355
356
357
358
359
360
361 spinlock_t m_rs_lock;
362 wait_queue_head_t m_flush_wait;
363
364 struct rds_sock *m_rs;
365
366
367 rds_rdma_cookie_t m_rdma_cookie;
368
369 unsigned int m_used_sgs;
370 unsigned int m_total_sgs;
371
372 void *m_final_op;
373
374 struct {
375 struct rm_atomic_op {
376 int op_type;
377 union {
378 struct {
379 uint64_t compare;
380 uint64_t swap;
381 uint64_t compare_mask;
382 uint64_t swap_mask;
383 } op_m_cswp;
384 struct {
385 uint64_t add;
386 uint64_t nocarry_mask;
387 } op_m_fadd;
388 };
389
390 u32 op_rkey;
391 u64 op_remote_addr;
392 unsigned int op_notify:1;
393 unsigned int op_recverr:1;
394 unsigned int op_mapped:1;
395 unsigned int op_silent:1;
396 unsigned int op_active:1;
397 struct scatterlist *op_sg;
398 struct rds_notifier *op_notifier;
399
400 struct rds_mr *op_rdma_mr;
401 } atomic;
402 struct rm_rdma_op {
403 u32 op_rkey;
404 u64 op_remote_addr;
405 unsigned int op_write:1;
406 unsigned int op_fence:1;
407 unsigned int op_notify:1;
408 unsigned int op_recverr:1;
409 unsigned int op_mapped:1;
410 unsigned int op_silent:1;
411 unsigned int op_active:1;
412 unsigned int op_bytes;
413 unsigned int op_nents;
414 unsigned int op_count;
415 struct scatterlist *op_sg;
416 struct rds_notifier *op_notifier;
417
418 struct rds_mr *op_rdma_mr;
419 } rdma;
420 struct rm_data_op {
421 unsigned int op_active:1;
422 unsigned int op_nents;
423 unsigned int op_count;
424 unsigned int op_dmasg;
425 unsigned int op_dmaoff;
426 struct scatterlist *op_sg;
427 } data;
428 };
429};
430
431
432
433
434
435
436
437
438struct rds_notifier {
439 struct list_head n_list;
440 uint64_t n_user_token;
441 int n_status;
442};
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471struct rds_transport {
472 char t_name[TRANSNAMSIZ];
473 struct list_head t_item;
474 struct module *t_owner;
475 unsigned int t_prefer_loopback:1,
476 t_mp_capable:1;
477 unsigned int t_type;
478
479 int (*laddr_check)(struct net *net, __be32 addr);
480 int (*conn_alloc)(struct rds_connection *conn, gfp_t gfp);
481 void (*conn_free)(void *data);
482 int (*conn_path_connect)(struct rds_conn_path *cp);
483 void (*conn_path_shutdown)(struct rds_conn_path *conn);
484 void (*xmit_path_prepare)(struct rds_conn_path *cp);
485 void (*xmit_path_complete)(struct rds_conn_path *cp);
486 int (*xmit)(struct rds_connection *conn, struct rds_message *rm,
487 unsigned int hdr_off, unsigned int sg, unsigned int off);
488 int (*xmit_rdma)(struct rds_connection *conn, struct rm_rdma_op *op);
489 int (*xmit_atomic)(struct rds_connection *conn, struct rm_atomic_op *op);
490 int (*recv_path)(struct rds_conn_path *cp);
491 int (*inc_copy_to_user)(struct rds_incoming *inc, struct iovec *iov,
492 size_t size);
493 void (*inc_free)(struct rds_incoming *inc);
494
495 int (*cm_handle_connect)(struct rdma_cm_id *cm_id,
496 struct rdma_cm_event *event);
497 int (*cm_initiate_connect)(struct rdma_cm_id *cm_id);
498 void (*cm_connect_complete)(struct rds_connection *conn,
499 struct rdma_cm_event *event);
500
501 unsigned int (*stats_info_copy)(struct rds_info_iterator *iter,
502 unsigned int avail);
503 void (*exit)(void);
504 void *(*get_mr)(struct scatterlist *sg, unsigned long nr_sg,
505 struct rds_sock *rs, u32 *key_ret);
506 void (*sync_mr)(void *trans_private, int direction);
507 void (*free_mr)(void *trans_private, int invalidate);
508 void (*flush_mrs)(void);
509};
510
511struct rds_sock {
512 struct sock rs_sk;
513
514 u64 rs_user_addr;
515 u64 rs_user_bytes;
516
517
518
519
520
521 struct rhash_head rs_bound_node;
522 u64 rs_bound_key;
523 __be32 rs_bound_addr;
524 __be32 rs_conn_addr;
525 __be16 rs_bound_port;
526 __be16 rs_conn_port;
527 struct rds_transport *rs_transport;
528
529
530
531
532
533 struct rds_connection *rs_conn;
534
535
536 int rs_congested;
537
538 int rs_seen_congestion;
539
540
541 spinlock_t rs_lock;
542 struct list_head rs_send_queue;
543 u32 rs_snd_bytes;
544 int rs_rcv_bytes;
545 struct list_head rs_notify_queue;
546
547
548
549
550
551
552 uint64_t rs_cong_mask;
553 uint64_t rs_cong_notify;
554 struct list_head rs_cong_list;
555 unsigned long rs_cong_track;
556
557
558
559
560
561 rwlock_t rs_recv_lock;
562 struct list_head rs_recv_queue;
563
564
565 struct list_head rs_item;
566
567
568 spinlock_t rs_rdma_lock;
569 struct rb_root rs_rdma_keys;
570
571
572 unsigned char rs_recverr,
573 rs_cong_monitor;
574 u32 rs_hash_initval;
575};
576
577static inline struct rds_sock *rds_sk_to_rs(const struct sock *sk)
578{
579 return container_of(sk, struct rds_sock, rs_sk);
580}
581static inline struct sock *rds_rs_to_sk(struct rds_sock *rs)
582{
583 return &rs->rs_sk;
584}
585
586
587
588
589
590
591static inline int rds_sk_sndbuf(struct rds_sock *rs)
592{
593 return rds_rs_to_sk(rs)->sk_sndbuf / 2;
594}
595static inline int rds_sk_rcvbuf(struct rds_sock *rs)
596{
597 return rds_rs_to_sk(rs)->sk_rcvbuf / 2;
598}
599
600struct rds_statistics {
601 uint64_t s_conn_reset;
602 uint64_t s_recv_drop_bad_checksum;
603 uint64_t s_recv_drop_old_seq;
604 uint64_t s_recv_drop_no_sock;
605 uint64_t s_recv_drop_dead_sock;
606 uint64_t s_recv_deliver_raced;
607 uint64_t s_recv_delivered;
608 uint64_t s_recv_queued;
609 uint64_t s_recv_immediate_retry;
610 uint64_t s_recv_delayed_retry;
611 uint64_t s_recv_ack_required;
612 uint64_t s_recv_rdma_bytes;
613 uint64_t s_recv_ping;
614 uint64_t s_send_queue_empty;
615 uint64_t s_send_queue_full;
616 uint64_t s_send_lock_contention;
617 uint64_t s_send_lock_queue_raced;
618 uint64_t s_send_immediate_retry;
619 uint64_t s_send_delayed_retry;
620 uint64_t s_send_drop_acked;
621 uint64_t s_send_ack_required;
622 uint64_t s_send_queued;
623 uint64_t s_send_rdma;
624 uint64_t s_send_rdma_bytes;
625 uint64_t s_send_pong;
626 uint64_t s_page_remainder_hit;
627 uint64_t s_page_remainder_miss;
628 uint64_t s_copy_to_user;
629 uint64_t s_copy_from_user;
630 uint64_t s_cong_update_queued;
631 uint64_t s_cong_update_received;
632 uint64_t s_cong_send_error;
633 uint64_t s_cong_send_blocked;
634};
635
636
637void rds_sock_addref(struct rds_sock *rs);
638void rds_sock_put(struct rds_sock *rs);
639void rds_wake_sk_sleep(struct rds_sock *rs);
640static inline void __rds_wake_sk_sleep(struct sock *sk)
641{
642 wait_queue_head_t *waitq = sk_sleep(sk);
643
644 if (!sock_flag(sk, SOCK_DEAD) && waitq)
645 wake_up(waitq);
646}
647extern wait_queue_head_t rds_poll_waitq;
648
649
650
651int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
652void rds_remove_bound(struct rds_sock *rs);
653struct rds_sock *rds_find_bound(__be32 addr, __be16 port);
654int rds_bind_lock_init(void);
655void rds_bind_lock_destroy(void);
656
657
658int rds_cong_get_maps(struct rds_connection *conn);
659void rds_cong_add_conn(struct rds_connection *conn);
660void rds_cong_remove_conn(struct rds_connection *conn);
661void rds_cong_set_bit(struct rds_cong_map *map, __be16 port);
662void rds_cong_clear_bit(struct rds_cong_map *map, __be16 port);
663int rds_cong_wait(struct rds_cong_map *map, __be16 port, int nonblock, struct rds_sock *rs);
664void rds_cong_queue_updates(struct rds_cong_map *map);
665void rds_cong_map_updated(struct rds_cong_map *map, uint64_t);
666int rds_cong_updated_since(unsigned long *recent);
667void rds_cong_add_socket(struct rds_sock *);
668void rds_cong_remove_socket(struct rds_sock *);
669void rds_cong_exit(void);
670struct rds_message *rds_cong_update_alloc(struct rds_connection *conn);
671
672
673extern u32 rds_gen_num;
674int rds_conn_init(void);
675void rds_conn_exit(void);
676struct rds_connection *rds_conn_create(struct net *net,
677 __be32 laddr, __be32 faddr,
678 struct rds_transport *trans, gfp_t gfp);
679struct rds_connection *rds_conn_create_outgoing(struct net *net,
680 __be32 laddr, __be32 faddr,
681 struct rds_transport *trans, gfp_t gfp);
682void rds_conn_shutdown(struct rds_conn_path *cpath);
683void rds_conn_destroy(struct rds_connection *conn);
684void rds_conn_drop(struct rds_connection *conn);
685void rds_conn_path_drop(struct rds_conn_path *cpath);
686void rds_conn_connect_if_down(struct rds_connection *conn);
687void rds_conn_path_connect_if_down(struct rds_conn_path *cp);
688void rds_for_each_conn_info(struct socket *sock, unsigned int len,
689 struct rds_info_iterator *iter,
690 struct rds_info_lengths *lens,
691 int (*visitor)(struct rds_connection *, void *),
692 size_t item_len);
693
694__printf(2, 3)
695void __rds_conn_path_error(struct rds_conn_path *cp, const char *, ...);
696#define rds_conn_path_error(cp, fmt...) \
697 __rds_conn_path_error(cp, KERN_WARNING "RDS: " fmt)
698
699static inline int
700rds_conn_path_transition(struct rds_conn_path *cp, int old, int new)
701{
702 return atomic_cmpxchg(&cp->cp_state, old, new) == old;
703}
704
705static inline int
706rds_conn_transition(struct rds_connection *conn, int old, int new)
707{
708 WARN_ON(conn->c_trans->t_mp_capable);
709 return rds_conn_path_transition(&conn->c_path[0], old, new);
710}
711
712static inline int
713rds_conn_path_state(struct rds_conn_path *cp)
714{
715 return atomic_read(&cp->cp_state);
716}
717
718static inline int
719rds_conn_state(struct rds_connection *conn)
720{
721 WARN_ON(conn->c_trans->t_mp_capable);
722 return rds_conn_path_state(&conn->c_path[0]);
723}
724
725static inline int
726rds_conn_path_up(struct rds_conn_path *cp)
727{
728 return atomic_read(&cp->cp_state) == RDS_CONN_UP;
729}
730
731static inline int
732rds_conn_up(struct rds_connection *conn)
733{
734 WARN_ON(conn->c_trans->t_mp_capable);
735 return rds_conn_path_up(&conn->c_path[0]);
736}
737
738static inline int
739rds_conn_path_connecting(struct rds_conn_path *cp)
740{
741 return atomic_read(&cp->cp_state) == RDS_CONN_CONNECTING;
742}
743
744static inline int
745rds_conn_connecting(struct rds_connection *conn)
746{
747 WARN_ON(conn->c_trans->t_mp_capable);
748 return rds_conn_path_connecting(&conn->c_path[0]);
749}
750
751
752struct rds_message *rds_message_alloc(unsigned int nents, gfp_t gfp);
753struct scatterlist *rds_message_alloc_sgs(struct rds_message *rm, int nents);
754int rds_message_copy_from_user(struct rds_message *rm, struct iovec *first_iov,
755 size_t total_len);
756struct rds_message *rds_message_map_pages(unsigned long *page_addrs, unsigned int total_len);
757void rds_message_populate_header(struct rds_header *hdr, __be16 sport,
758 __be16 dport, u64 seq);
759int rds_message_add_extension(struct rds_header *hdr,
760 unsigned int type, const void *data, unsigned int len);
761int rds_message_next_extension(struct rds_header *hdr,
762 unsigned int *pos, void *buf, unsigned int *buflen);
763int rds_message_add_rdma_dest_extension(struct rds_header *hdr, u32 r_key, u32 offset);
764int rds_message_inc_copy_to_user(struct rds_incoming *inc,
765 struct iovec *first_iov, size_t size);
766void rds_message_inc_free(struct rds_incoming *inc);
767void rds_message_addref(struct rds_message *rm);
768void rds_message_put(struct rds_message *rm);
769void rds_message_wait(struct rds_message *rm);
770void rds_message_unmapped(struct rds_message *rm);
771
772static inline void rds_message_make_checksum(struct rds_header *hdr)
773{
774 hdr->h_csum = 0;
775 hdr->h_csum = ip_fast_csum((void *) hdr, sizeof(*hdr) >> 2);
776}
777
778static inline int rds_message_verify_checksum(const struct rds_header *hdr)
779{
780 return !hdr->h_csum || ip_fast_csum((void *) hdr, sizeof(*hdr) >> 2) == 0;
781}
782
783
784
785int rds_page_remainder_alloc(struct scatterlist *scat, unsigned long bytes,
786 gfp_t gfp);
787int rds_page_copy_user(struct page *page, unsigned long offset,
788 void __user *ptr, unsigned long bytes,
789 int to_user);
790#define rds_page_copy_to_user(page, offset, ptr, bytes) \
791 rds_page_copy_user(page, offset, ptr, bytes, 1)
792#define rds_page_copy_from_user(page, offset, ptr, bytes) \
793 rds_page_copy_user(page, offset, ptr, bytes, 0)
794void rds_page_exit(void);
795
796
797void rds_inc_init(struct rds_incoming *inc, struct rds_connection *conn,
798 __be32 saddr);
799void rds_inc_path_init(struct rds_incoming *inc, struct rds_conn_path *conn,
800 __be32 saddr);
801void rds_inc_put(struct rds_incoming *inc);
802void rds_recv_incoming(struct rds_connection *conn, __be32 saddr, __be32 daddr,
803 struct rds_incoming *inc, gfp_t gfp);
804int rds_recvmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
805 size_t size, int msg_flags);
806void rds_clear_recv_queue(struct rds_sock *rs);
807int rds_notify_queue_get(struct rds_sock *rs, struct msghdr *msg);
808void rds_inc_info_copy(struct rds_incoming *inc,
809 struct rds_info_iterator *iter,
810 __be32 saddr, __be32 daddr, int flip);
811
812
813int rds_sendmsg(struct kiocb *iocb, struct socket *sock, struct msghdr *msg,
814 size_t payload_len);
815void rds_send_path_reset(struct rds_conn_path *conn);
816int rds_send_xmit(struct rds_conn_path *cp);
817struct sockaddr_in;
818void rds_send_drop_to(struct rds_sock *rs, struct sockaddr_in *dest);
819typedef int (*is_acked_func)(struct rds_message *rm, uint64_t ack);
820void rds_send_drop_acked(struct rds_connection *conn, u64 ack,
821 is_acked_func is_acked);
822void rds_send_path_drop_acked(struct rds_conn_path *cp, u64 ack,
823 is_acked_func is_acked);
824int rds_send_pong(struct rds_conn_path *cp, __be16 dport);
825
826
827void rds_rdma_unuse(struct rds_sock *rs, u32 r_key, int force);
828int rds_get_mr(struct rds_sock *rs, char __user *optval, int optlen);
829int rds_get_mr_for_dest(struct rds_sock *rs, char __user *optval, int optlen);
830int rds_free_mr(struct rds_sock *rs, char __user *optval, int optlen);
831void rds_rdma_drop_keys(struct rds_sock *rs);
832int rds_rdma_extra_size(struct rds_rdma_args *args);
833int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
834 struct cmsghdr *cmsg);
835int rds_cmsg_rdma_dest(struct rds_sock *rs, struct rds_message *rm,
836 struct cmsghdr *cmsg);
837int rds_cmsg_rdma_args(struct rds_sock *rs, struct rds_message *rm,
838 struct cmsghdr *cmsg);
839int rds_cmsg_rdma_map(struct rds_sock *rs, struct rds_message *rm,
840 struct cmsghdr *cmsg);
841void rds_rdma_free_op(struct rm_rdma_op *ro);
842void rds_atomic_free_op(struct rm_atomic_op *ao);
843void rds_rdma_send_complete(struct rds_message *rm, int wc_status);
844void rds_atomic_send_complete(struct rds_message *rm, int wc_status);
845int rds_cmsg_atomic(struct rds_sock *rs, struct rds_message *rm,
846 struct cmsghdr *cmsg);
847
848extern void __rds_put_mr_final(struct rds_mr *mr);
849static inline void rds_mr_put(struct rds_mr *mr)
850{
851 if (atomic_dec_and_test(&mr->r_refcount))
852 __rds_put_mr_final(mr);
853}
854
855
856DECLARE_PER_CPU_SHARED_ALIGNED(struct rds_statistics, rds_stats);
857#define rds_stats_inc_which(which, member) do { \
858 per_cpu(which, get_cpu()).member++; \
859 put_cpu(); \
860} while (0)
861#define rds_stats_inc(member) rds_stats_inc_which(rds_stats, member)
862#define rds_stats_add_which(which, member, count) do { \
863 per_cpu(which, get_cpu()).member += count; \
864 put_cpu(); \
865} while (0)
866#define rds_stats_add(member, count) rds_stats_add_which(rds_stats, member, count)
867int rds_stats_init(void);
868void rds_stats_exit(void);
869void rds_stats_info_copy(struct rds_info_iterator *iter,
870 uint64_t *values, const char *const *names,
871 size_t nr);
872
873
874int rds_sysctl_init(void);
875void rds_sysctl_exit(void);
876extern unsigned long rds_sysctl_sndbuf_min;
877extern unsigned long rds_sysctl_sndbuf_default;
878extern unsigned long rds_sysctl_sndbuf_max;
879extern unsigned long rds_sysctl_reconnect_min_jiffies;
880extern unsigned long rds_sysctl_reconnect_max_jiffies;
881extern unsigned int rds_sysctl_max_unacked_packets;
882extern unsigned int rds_sysctl_max_unacked_bytes;
883extern unsigned int rds_sysctl_ping_enable;
884extern unsigned long rds_sysctl_trace_flags;
885extern unsigned int rds_sysctl_trace_level;
886
887
888int rds_threads_init(void);
889void rds_threads_exit(void);
890extern struct workqueue_struct *rds_wq;
891void rds_queue_reconnect(struct rds_conn_path *cp);
892void rds_connect_worker(struct work_struct *);
893void rds_shutdown_worker(struct work_struct *);
894void rds_send_worker(struct work_struct *);
895void rds_recv_worker(struct work_struct *);
896void rds_connect_path_complete(struct rds_conn_path *conn, int curr);
897void rds_connect_complete(struct rds_connection *conn);
898
899
900int rds_trans_register(struct rds_transport *trans);
901void rds_trans_unregister(struct rds_transport *trans);
902struct rds_transport *rds_trans_get_preferred(struct net *net, __be32 addr);
903void rds_trans_put(struct rds_transport *trans);
904unsigned int rds_trans_stats_info_copy(struct rds_info_iterator *iter,
905 unsigned int avail);
906struct rds_transport *rds_trans_get(int t_type);
907int rds_trans_init(void);
908void rds_trans_exit(void);
909
910#endif
911