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