@@ -50,16 +50,18 @@ static bool rds_wq_strictly_ordered;
50
50
module_param (rds_wq_strictly_ordered , bool , 0644 );
51
51
52
52
/* converting this to RCU is a chore for another day.. */
53
+ static DEFINE_SPINLOCK (rds_conn_lock );
54
+ static struct hlist_head rds_conn_hash [RDS_CONNECTION_HASH_ENTRIES ];
53
55
static struct hlist_head rds_conn_faddr_hash [RDS_CONN_FADDR_HASH_ENTRIES ];
54
56
static struct kmem_cache * rds_conn_slab ;
55
57
56
- /* Loop through the rns_conn_hash table and set head to the hlist_head
58
+ /* Loop through the rds_conn_hash table and set head to the hlist_head
57
59
* of each element.
58
60
*/
59
- #define for_each_conn_hash_bucket (rns , head ) \
60
- for ((head) = (rns)->rns_conn_hash ; \
61
- (head) < (rns)->rns_conn_hash + RDS_CONNECTION_HASH_ENTRIES; \
62
- (head)++)
61
+ #define for_each_conn_hash_bucket (head ) \
62
+ for ((head) = rds_conn_hash ; \
63
+ (head) < rds_conn_hash + ARRAY_SIZE(rds_conn_hash); \
64
+ (head)++)
63
65
64
66
static void rds_conn_ha_changed_task (struct work_struct * work );
65
67
static void rds_conn_shutdown_check_wait (struct work_struct * work );
@@ -96,13 +98,12 @@ static u32 rds_conn_bucket_hash(const struct in6_addr *laddr,
96
98
return hash ;
97
99
}
98
100
99
- static struct hlist_head * rds_conn_bucket (struct rds_net * rns ,
100
- const struct in6_addr * laddr ,
101
+ static struct hlist_head * rds_conn_bucket (const struct in6_addr * laddr ,
101
102
const struct in6_addr * faddr ,
102
103
u8 tos )
103
104
{
104
105
u32 hash = rds_conn_bucket_hash (laddr , faddr , tos );
105
- return & rns -> rns_conn_hash [hash & RDS_CONNECTION_HASH_MASK ];
106
+ return & rds_conn_hash [hash & RDS_CONNECTION_HASH_MASK ];
106
107
}
107
108
108
109
static struct hlist_head * rds_conn_faddr_bucket (const struct in6_addr * faddr )
@@ -117,7 +118,8 @@ static struct hlist_head *rds_conn_faddr_bucket(const struct in6_addr *faddr)
117
118
} while (0)
118
119
119
120
/* rcu read lock must be held or the connection spinlock */
120
- static struct rds_connection * rds_conn_lookup (struct hlist_head * head ,
121
+ static struct rds_connection * rds_conn_lookup (struct net * net ,
122
+ struct hlist_head * head ,
121
123
const struct in6_addr * laddr ,
122
124
const struct in6_addr * faddr ,
123
125
struct rds_transport * trans ,
@@ -130,6 +132,7 @@ static struct rds_connection *rds_conn_lookup(struct hlist_head *head,
130
132
if (ipv6_addr_equal (& conn -> c_faddr , faddr ) &&
131
133
ipv6_addr_equal (& conn -> c_laddr , laddr ) &&
132
134
conn -> c_tos == tos && conn -> c_trans == trans &&
135
+ net == rds_conn_net (conn ) &&
133
136
conn -> c_dev_if == dev_if ) {
134
137
ret = conn ;
135
138
break ;
@@ -139,17 +142,18 @@ static struct rds_connection *rds_conn_lookup(struct hlist_head *head,
139
142
return ret ;
140
143
}
141
144
142
- void rds_conn_laddr_list (struct rds_net * rns , struct in6_addr * laddr ,
145
+ void rds_conn_laddr_list (struct net * net , struct in6_addr * laddr ,
143
146
struct list_head * laddr_conns )
144
147
{
145
148
struct rds_connection * conn ;
146
149
struct hlist_head * head ;
147
150
148
151
rcu_read_lock ();
149
152
150
- for_each_conn_hash_bucket (rns , head ) {
153
+ for_each_conn_hash_bucket (head ) {
151
154
hlist_for_each_entry_rcu (conn , head , c_hash_node )
152
- if (ipv6_addr_equal (& conn -> c_laddr , laddr ))
155
+ if (ipv6_addr_equal (& conn -> c_laddr , laddr ) &&
156
+ net == rds_conn_net (conn ))
153
157
list_add (& conn -> c_laddr_node , laddr_conns );
154
158
}
155
159
@@ -239,20 +243,16 @@ static struct rds_connection *__rds_conn_create(struct net *net,
239
243
int dev_if )
240
244
{
241
245
struct rds_connection * conn , * parent = NULL ;
242
- struct hlist_head * head ;
246
+ struct hlist_head * head = rds_conn_bucket ( laddr , faddr , tos ) ;
243
247
struct hlist_head * faddr_head = rds_conn_faddr_bucket (faddr );
244
248
struct rds_transport * loop_trans ;
245
- struct rds_net * rns ;
246
249
char * reason = NULL ;
247
250
unsigned long flags ;
248
251
int ret , i ;
249
252
int npaths ;
250
253
251
- rns = rds_ns (net );
252
- head = rds_conn_bucket (rns , laddr , faddr , tos );
253
-
254
254
rcu_read_lock ();
255
- conn = rds_conn_lookup (head , laddr , faddr , trans , tos , dev_if );
255
+ conn = rds_conn_lookup (net , head , laddr , faddr , trans , tos , dev_if );
256
256
if (conn &&
257
257
conn -> c_loopback &&
258
258
conn -> c_trans != & rds_loop_transport &&
@@ -397,7 +397,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
397
397
* init and return our conn. If we lost, we rollback and return the
398
398
* other one.
399
399
*/
400
- spin_lock_irqsave (& rns -> rns_conn_lock , flags );
400
+ spin_lock_irqsave (& rds_conn_lock , flags );
401
401
if (parent ) {
402
402
/* Creating passive conn */
403
403
if (parent -> c_passive ) {
@@ -417,7 +417,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
417
417
/* Creating normal conn */
418
418
struct rds_connection * found ;
419
419
420
- found = rds_conn_lookup (head , laddr , faddr , trans , tos ,
420
+ found = rds_conn_lookup (net , head , laddr , faddr , trans , tos ,
421
421
dev_if );
422
422
if (found ) {
423
423
struct rds_conn_path * cp ;
@@ -442,7 +442,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
442
442
atomic_inc (& conn -> c_trans -> t_conn_count );
443
443
}
444
444
}
445
- spin_unlock_irqrestore (& rns -> rns_conn_lock , flags );
445
+ spin_unlock_irqrestore (& rds_conn_lock , flags );
446
446
447
447
out :
448
448
if (reason )
@@ -472,17 +472,16 @@ struct rds_connection *rds_conn_create_outgoing(struct net *net,
472
472
}
473
473
EXPORT_SYMBOL_GPL (rds_conn_create_outgoing );
474
474
475
- struct rds_connection * rds_conn_find (struct rds_net * rns ,
476
- struct in6_addr * laddr ,
475
+ struct rds_connection * rds_conn_find (struct net * net , struct in6_addr * laddr ,
477
476
struct in6_addr * faddr ,
478
477
struct rds_transport * trans , u8 tos ,
479
478
int dev_if )
480
479
{
481
480
struct rds_connection * conn ;
482
- struct hlist_head * head = rds_conn_bucket (rns , laddr , faddr , tos );
481
+ struct hlist_head * head = rds_conn_bucket (laddr , faddr , tos );
483
482
484
483
rcu_read_lock ();
485
- conn = rds_conn_lookup (head , laddr , faddr , trans , tos , dev_if );
484
+ conn = rds_conn_lookup (net , head , laddr , faddr , trans , tos , dev_if );
486
485
rcu_read_unlock ();
487
486
488
487
return conn ;
@@ -725,25 +724,20 @@ static void rds_conn_path_destroy(struct rds_conn_path *cp, int shutdown)
725
724
void rds_conn_destroy (struct rds_connection * conn , int shutdown )
726
725
{
727
726
int npaths = (conn -> c_trans -> t_mp_capable ? RDS_MPATH_WORKERS : 1 );
728
- struct rds_net * rns ;
729
- spinlock_t * lock ; /* protect connection */
730
727
int i ;
731
728
732
729
trace_rds_conn_destroy (NULL , conn , NULL , NULL , 0 );
733
730
734
- rns = conn -> c_rns ;
735
- lock = & rns -> rns_conn_lock ;
736
-
737
731
conn -> c_destroy_in_prog = 1 ;
738
732
smp_mb ();
739
733
cancel_work_sync (& conn -> c_ha_changed .work );
740
734
cancel_delayed_work_sync (& conn -> c_dr_sock_cancel_w );
741
735
742
736
/* Ensure conn will not be scheduled for reconnect */
743
- spin_lock_irq (lock );
737
+ spin_lock_irq (& rds_conn_lock );
744
738
hlist_del_init_rcu (& conn -> c_hash_node );
745
739
hlist_del_init_rcu (& conn -> c_faddr_node );
746
- spin_unlock_irq (lock );
740
+ spin_unlock_irq (& rds_conn_lock );
747
741
synchronize_rcu ();
748
742
749
743
/* shut the connection down */
@@ -764,7 +758,6 @@ void rds_conn_destroy(struct rds_connection *conn, int shutdown)
764
758
765
759
atomic_dec (& conn -> c_trans -> t_conn_count );
766
760
767
- rds_conn_net_set (conn , NULL );
768
761
kfree (conn -> c_path );
769
762
kmem_cache_free (rds_conn_slab , conn );
770
763
}
@@ -789,10 +782,9 @@ static void rds_conn_message_info_cmn(struct socket *sock, unsigned int len,
789
782
struct rds_info_lengths * lens ,
790
783
int want_send , bool isv6 )
791
784
{
792
- struct rds_connection * conn ;
793
- struct rds_net * rns ;
794
785
struct hlist_head * head ;
795
786
struct list_head * list ;
787
+ struct rds_connection * conn ;
796
788
struct rds_message * rm ;
797
789
unsigned int total = 0 ;
798
790
unsigned long flags ;
@@ -803,11 +795,9 @@ static void rds_conn_message_info_cmn(struct socket *sock, unsigned int len,
803
795
else
804
796
len /= sizeof (struct rds_info_message );
805
797
806
- rns = rds_ns (sock_net (sock -> sk ));
807
-
808
798
rcu_read_lock ();
809
799
810
- for_each_conn_hash_bucket (rns , head ) {
800
+ for_each_conn_hash_bucket (head ) {
811
801
hlist_for_each_entry_rcu (conn , head , c_hash_node ) {
812
802
struct rds_conn_path * cp ;
813
803
int npaths ;
@@ -908,18 +898,15 @@ void rds_for_each_conn_info(struct socket *sock, unsigned int len,
908
898
u64 * buffer ,
909
899
size_t item_len )
910
900
{
911
- struct rds_connection * conn ;
912
- struct rds_net * rns ;
913
901
struct hlist_head * head ;
914
-
915
- rns = rds_ns (sock_net (sock -> sk ));
902
+ struct rds_connection * conn ;
916
903
917
904
rcu_read_lock ();
918
905
919
906
lens -> nr = 0 ;
920
907
lens -> each = item_len ;
921
908
922
- for_each_conn_hash_bucket (rns , head ) {
909
+ for_each_conn_hash_bucket (head ) {
923
910
hlist_for_each_entry_rcu (conn , head , c_hash_node ) {
924
911
925
912
/* XXX no c_lock usage.. */
@@ -948,18 +935,15 @@ static void rds_walk_conn_path_info(struct socket *sock, unsigned int len,
948
935
u64 * buffer ,
949
936
size_t item_len )
950
937
{
951
- struct rds_connection * conn ;
952
- struct rds_net * rns ;
953
938
struct hlist_head * head ;
954
-
955
- rns = rds_sk_to_rs (sock -> sk )-> rs_rns ;
939
+ struct rds_connection * conn ;
956
940
957
941
rcu_read_lock ();
958
942
959
943
lens -> nr = 0 ;
960
944
lens -> each = item_len ;
961
945
962
- for_each_conn_hash_bucket (rns , head ) {
946
+ for_each_conn_hash_bucket (head ) {
963
947
hlist_for_each_entry_rcu (conn , head , c_hash_node ) {
964
948
struct rds_conn_path * cp ;
965
949
@@ -1193,8 +1177,13 @@ int rds_conn_init(void)
1193
1177
1194
1178
void rds_conn_exit (void )
1195
1179
{
1180
+ struct hlist_head * head ;
1181
+
1196
1182
rds_loop_exit ();
1197
1183
1184
+ for_each_conn_hash_bucket (head )
1185
+ WARN_ON (!hlist_empty (head ));
1186
+
1198
1187
kmem_cache_destroy (rds_conn_slab );
1199
1188
1200
1189
rds_info_deregister_func (RDS_INFO_CONNECTIONS , rds_conn_info );
@@ -1211,29 +1200,6 @@ void rds_conn_exit(void)
1211
1200
#endif
1212
1201
}
1213
1202
1214
- int rds_conn_tbl_net_init (struct rds_net * rns )
1215
- {
1216
- rns -> rns_conn_hash = kzalloc (sizeof (* rns -> rns_conn_hash ) *
1217
- RDS_CONNECTION_HASH_ENTRIES ,
1218
- GFP_KERNEL | GFP_NOWAIT );
1219
- if (!rns -> rns_conn_hash )
1220
- return - ENOMEM ;
1221
- spin_lock_init (& rns -> rns_conn_lock );
1222
-
1223
- return 0 ;
1224
- }
1225
-
1226
- void rds_conn_tbl_net_exit (struct rds_net * rns )
1227
- {
1228
- struct hlist_head * head ;
1229
-
1230
- for_each_conn_hash_bucket (rns , head ) {
1231
- WARN_ON (!hlist_empty (head ));
1232
- }
1233
- kfree (rns -> rns_conn_hash );
1234
- rns -> rns_conn_hash = NULL ;
1235
- }
1236
-
1237
1203
static char * conn_drop_reasons [] = {
1238
1204
[DR_DEFAULT ] = "unknown reason (default_state)" ,
1239
1205
[DR_USER_RESET ] = "user reset" ,
0 commit comments