42
42
43
43
#include "trace.h"
44
44
45
+ /* only for info exporting */
46
+ static DEFINE_SPINLOCK (rds_tcp_tc_list_lock );
47
+ static LIST_HEAD (rds_tcp_tc_list );
48
+
49
+ /* rds_tcp_tc_count counts only IPv4 connections.
50
+ * rds6_tcp_tc_count counts both IPv4 and IPv6 connections.
51
+ */
52
+ static unsigned int rds_tcp_tc_count ;
53
+ #if IS_ENABLED (CONFIG_IPV6 )
54
+ static unsigned int rds6_tcp_tc_count ;
55
+ #endif
56
+
57
+ /* Track rds_tcp_connection structs so they can be cleaned up */
58
+ static DEFINE_SPINLOCK (rds_tcp_conn_lock );
59
+ static LIST_HEAD (rds_tcp_conn_list );
60
+
45
61
static struct kmem_cache * rds_tcp_conn_slab ;
46
62
47
63
static int rds_tcp_skbuf_handler (const struct ctl_table * ctl , int write ,
@@ -51,8 +67,6 @@ static int rds_tcp_skbuf_handler(const struct ctl_table *ctl, int write,
51
67
static int rds_tcp_min_sndbuf = SOCK_MIN_SNDBUF ;
52
68
static int rds_tcp_min_rcvbuf = SOCK_MIN_RCVBUF ;
53
69
54
- int rds_tcp_netid ;
55
-
56
70
static struct ctl_table rds_tcp_sysctl_table [] = {
57
71
#define RDS_TCP_SNDBUF 0
58
72
{
@@ -86,21 +100,20 @@ u32 rds_tcp_snd_una(struct rds_tcp_connection *tc)
86
100
}
87
101
88
102
void rds_tcp_restore_callbacks (struct socket * sock ,
89
- struct rds_tcp_connection * tc ,
90
- struct rds_tcp_net * rtn )
103
+ struct rds_tcp_connection * tc )
91
104
{
92
105
rdsdebug ("restoring sock %p callbacks from tc %p\n" , sock , tc );
93
106
write_lock_bh (& sock -> sk -> sk_callback_lock );
94
107
95
108
/* done under the callback_lock to serialize with write_space */
96
- spin_lock (& rtn -> rds_tcp_tc_list_lock );
109
+ spin_lock (& rds_tcp_tc_list_lock );
97
110
list_del_init (& tc -> t_list_item );
98
111
#if IS_ENABLED (CONFIG_IPV6 )
99
- rtn -> rds6_tcp_tc_count -- ;
112
+ rds6_tcp_tc_count -- ;
100
113
#endif
101
114
if (!tc -> t_cpath -> cp_conn -> c_isv6 )
102
- rtn -> rds_tcp_tc_count -- ;
103
- spin_unlock (& rtn -> rds_tcp_tc_list_lock );
115
+ rds_tcp_tc_count -- ;
116
+ spin_unlock (& rds_tcp_tc_list_lock );
104
117
105
118
tc -> t_sock = NULL ;
106
119
@@ -122,7 +135,7 @@ void rds_tcp_restore_callbacks(struct socket *sock,
122
135
* from being called while it isn't set.
123
136
*/
124
137
void rds_tcp_reset_callbacks (struct socket * sock ,
125
- struct rds_conn_path * cp , struct rds_tcp_net * rtn )
138
+ struct rds_conn_path * cp )
126
139
{
127
140
struct rds_tcp_connection * tc = cp -> cp_transport_data ;
128
141
struct socket * osock = tc -> t_sock ;
@@ -183,37 +196,36 @@ void rds_tcp_reset_callbacks(struct socket *sock,
183
196
}
184
197
tc -> t_tinc_hdr_rem = sizeof (struct rds_header );
185
198
tc -> t_tinc_data_rem = 0 ;
186
- rds_tcp_restore_callbacks (osock , tc , rtn );
199
+ rds_tcp_restore_callbacks (osock , tc );
187
200
release_sock (osock -> sk );
188
201
sock_release (osock );
189
202
newsock :
190
203
rds_send_path_reset (cp );
191
204
lock_sock (sock -> sk );
192
- rds_tcp_set_callbacks (sock , cp , rtn );
205
+ rds_tcp_set_callbacks (sock , cp );
193
206
release_sock (sock -> sk );
194
207
}
195
208
196
209
/* Add tc to rds_tcp_tc_list and set tc->t_sock. See comments
197
210
* above rds_tcp_reset_callbacks for notes about synchronization
198
211
* with data path
199
212
*/
200
- void rds_tcp_set_callbacks (struct socket * sock , struct rds_conn_path * cp ,
201
- struct rds_tcp_net * rtn )
213
+ void rds_tcp_set_callbacks (struct socket * sock , struct rds_conn_path * cp )
202
214
{
203
215
struct rds_tcp_connection * tc = cp -> cp_transport_data ;
204
216
205
217
rdsdebug ("setting sock %p callbacks to tc %p\n" , sock , tc );
206
218
write_lock_bh (& sock -> sk -> sk_callback_lock );
207
219
208
220
/* done under the callback_lock to serialize with write_space */
209
- spin_lock (& rtn -> rds_tcp_tc_list_lock );
210
- list_add_tail (& tc -> t_list_item , & rtn -> rds_tcp_tc_list );
221
+ spin_lock (& rds_tcp_tc_list_lock );
222
+ list_add_tail (& tc -> t_list_item , & rds_tcp_tc_list );
211
223
if (!tc -> t_cpath -> cp_conn -> c_isv6 )
212
- rtn -> rds_tcp_tc_count ++ ;
224
+ rds_tcp_tc_count ++ ;
213
225
#if IS_ENABLED (CONFIG_IPV6 )
214
- rtn -> rds6_tcp_tc_count ++ ;
226
+ rds6_tcp_tc_count ++ ;
215
227
#endif
216
- spin_unlock (& rtn -> rds_tcp_tc_list_lock );
228
+ spin_unlock (& rds_tcp_tc_list_lock );
217
229
218
230
/* accepted sockets need our listen data ready undone */
219
231
if (sock -> sk -> sk_data_ready == rds_tcp_listen_data_ready )
@@ -243,17 +255,14 @@ static void rds_tcp_tc_info(struct socket *sock, unsigned int len,
243
255
{
244
256
struct rds_info_tcp_socket tsinfo ;
245
257
struct rds_tcp_connection * tc ;
246
- struct rds_tcp_net * rtn ;
247
258
unsigned long flags ;
248
259
249
- rtn = net_generic (sock_net (sock -> sk ), rds_tcp_netid );
250
-
251
- spin_lock_irqsave (& rtn -> rds_tcp_tc_list_lock , flags );
260
+ spin_lock_irqsave (& rds_tcp_tc_list_lock , flags );
252
261
253
- if (len / sizeof (tsinfo ) < rtn -> rds_tcp_tc_count )
262
+ if (len / sizeof (tsinfo ) < rds_tcp_tc_count )
254
263
goto out ;
255
264
256
- list_for_each_entry (tc , & rtn -> rds_tcp_tc_list , t_list_item ) {
265
+ list_for_each_entry (tc , & rds_tcp_tc_list , t_list_item ) {
257
266
struct inet_sock * inet = inet_sk (tc -> t_sock -> sk );
258
267
259
268
if (tc -> t_cpath -> cp_conn -> c_isv6 )
@@ -274,10 +283,10 @@ static void rds_tcp_tc_info(struct socket *sock, unsigned int len,
274
283
}
275
284
276
285
out :
277
- lens -> nr = rtn -> rds_tcp_tc_count ;
286
+ lens -> nr = rds_tcp_tc_count ;
278
287
lens -> each = sizeof (tsinfo );
279
288
280
- spin_unlock_irqrestore (& rtn -> rds_tcp_tc_list_lock , flags );
289
+ spin_unlock_irqrestore (& rds_tcp_tc_list_lock , flags );
281
290
}
282
291
283
292
#if IS_ENABLED (CONFIG_IPV6 )
@@ -291,17 +300,14 @@ static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
291
300
{
292
301
struct rds6_info_tcp_socket tsinfo6 ;
293
302
struct rds_tcp_connection * tc ;
294
- struct rds_tcp_net * rtn ;
295
303
unsigned long flags ;
296
304
297
- rtn = net_generic ( sock_net ( sock -> sk ), rds_tcp_netid );
305
+ spin_lock_irqsave ( & rds_tcp_tc_list_lock , flags );
298
306
299
- spin_lock_irqsave (& rtn -> rds_tcp_tc_list_lock , flags );
300
-
301
- if (len / sizeof (tsinfo6 ) < rtn -> rds6_tcp_tc_count )
307
+ if (len / sizeof (tsinfo6 ) < rds6_tcp_tc_count )
302
308
goto out ;
303
309
304
- list_for_each_entry (tc , & rtn -> rds_tcp_tc_list , t_list_item ) {
310
+ list_for_each_entry (tc , & rds_tcp_tc_list , t_list_item ) {
305
311
struct sock * sk = tc -> t_sock -> sk ;
306
312
struct inet_sock * inet = inet_sk (sk );
307
313
@@ -320,10 +326,10 @@ static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
320
326
}
321
327
322
328
out :
323
- lens -> nr = rtn -> rds6_tcp_tc_count ;
329
+ lens -> nr = rds6_tcp_tc_count ;
324
330
lens -> each = sizeof (tsinfo6 );
325
331
326
- spin_unlock_irqrestore (& rtn -> rds_tcp_tc_list_lock , flags );
332
+ spin_unlock_irqrestore (& rds_tcp_tc_list_lock , flags );
327
333
}
328
334
#endif
329
335
@@ -365,11 +371,8 @@ int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
365
371
static int rds_tcp_conn_alloc (struct rds_connection * conn , gfp_t gfp )
366
372
{
367
373
struct rds_tcp_connection * tc ;
368
- struct rds_tcp_net * rtn ;
369
374
int i ;
370
375
371
- rtn = net_generic (rds_conn_net (conn ), rds_tcp_netid );
372
-
373
376
for (i = 0 ; i < RDS_MPATH_WORKERS ; i ++ ) {
374
377
tc = kmem_cache_alloc (rds_tcp_conn_slab , gfp );
375
378
if (!tc )
@@ -389,12 +392,9 @@ static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp)
389
392
conn -> c_path [i ].cp_transport_data = tc ;
390
393
tc -> t_cpath = & conn -> c_path [i ];
391
394
392
- /* Once assigned, will never change until TCP conn destroyed. */
393
- tc -> t_rtn = rtn ;
394
-
395
- spin_lock_irq (& rtn -> rds_tcp_conn_lock );
396
- list_add_tail (& tc -> t_tcp_node , & rtn -> rds_tcp_conn_list );
397
- spin_unlock_irq (& rtn -> rds_tcp_conn_lock );
395
+ spin_lock_irq (& rds_tcp_conn_lock );
396
+ list_add_tail (& tc -> t_tcp_node , & rds_tcp_conn_list );
397
+ spin_unlock_irq (& rds_tcp_conn_lock );
398
398
rdsdebug ("rds_conn_path [%d] tc %p\n" , i ,
399
399
conn -> c_path [i ].cp_transport_data );
400
400
}
@@ -409,11 +409,10 @@ static void rds_tcp_conn_free(void *arg)
409
409
410
410
cancel_work_sync (& tc -> t_fan_out_w );
411
411
412
- spin_lock_irqsave (& tc -> t_rtn -> rds_tcp_conn_lock , flags );
412
+ spin_lock_irqsave (& rds_tcp_conn_lock , flags );
413
413
list_del (& tc -> t_tcp_node );
414
- spin_unlock_irqrestore (& tc -> t_rtn -> rds_tcp_conn_lock , flags );
414
+ spin_unlock_irqrestore (& rds_tcp_conn_lock , flags );
415
415
416
- tc -> t_rtn = NULL ;
417
416
tc -> t_stats = NULL ;
418
417
kmem_cache_free (rds_tcp_conn_slab , tc );
419
418
}
@@ -429,18 +428,18 @@ static bool list_has_conn(struct list_head *list, struct rds_connection *conn)
429
428
return false;
430
429
}
431
430
432
- static void rds_tcp_destroy_conns (struct rds_tcp_net * rtn )
431
+ static void rds_tcp_destroy_conns (void )
433
432
{
434
433
struct rds_tcp_connection * tc , * _tc ;
435
434
LIST_HEAD (tmp_list );
436
435
437
436
/* avoid calling conn_destroy with irqs off */
438
- spin_lock_irq (& rtn -> rds_tcp_conn_lock );
439
- list_for_each_entry_safe (tc , _tc , & rtn -> rds_tcp_conn_list , t_tcp_node ) {
437
+ spin_lock_irq (& rds_tcp_conn_lock );
438
+ list_for_each_entry_safe (tc , _tc , & rds_tcp_conn_list , t_tcp_node ) {
440
439
if (!list_has_conn (& tmp_list , tc -> t_cpath -> cp_conn ))
441
440
list_move_tail (& tc -> t_tcp_node , & tmp_list );
442
441
}
443
- spin_unlock_irq (& rtn -> rds_tcp_conn_lock );
442
+ spin_unlock_irq (& rds_tcp_conn_lock );
444
443
445
444
list_for_each_entry_safe (tc , _tc , & tmp_list , t_tcp_node )
446
445
rds_conn_destroy (tc -> t_cpath -> cp_conn , 1 );
@@ -468,6 +467,8 @@ struct rds_transport rds_tcp_transport = {
468
467
.t_conn_count = ATOMIC_INIT (0 ),
469
468
};
470
469
470
+ int rds_tcp_netid ;
471
+
471
472
/* All module specific customizations to the RDS-TCP socket should be done in
472
473
* rds_tcp_tune() and applied after socket creation.
473
474
*/
@@ -575,13 +576,6 @@ static __net_init int rds_tcp_init_net(struct net *net)
575
576
#endif
576
577
}
577
578
INIT_WORK (& rtn -> rds_tcp_accept_w , rds_tcp_accept_worker );
578
-
579
- spin_lock_init (& rtn -> rds_tcp_tc_list_lock );
580
- INIT_LIST_HEAD (& rtn -> rds_tcp_tc_list );
581
-
582
- spin_lock_init (& rtn -> rds_tcp_conn_lock );
583
- INIT_LIST_HEAD (& rtn -> rds_tcp_conn_list );
584
-
585
579
return 0 ;
586
580
587
581
fail :
@@ -622,14 +616,14 @@ static void rds_tcp_kill_sock(struct net *net, struct rds_tcp_net *rtn)
622
616
rds_tcp_listen_stop (lsock , & rtn -> rds_tcp_accept_w );
623
617
if (rtn -> rds_tcp_accepted_sock )
624
618
sock_release (rtn -> rds_tcp_accepted_sock );
625
- spin_lock_irq (& rtn -> rds_tcp_conn_lock );
626
- list_for_each_entry_safe (tc , _tc , & rtn -> rds_tcp_conn_list , t_tcp_node ) {
627
- WARN_ON (!net_eq (net , rds_conn_net (tc -> t_cpath -> cp_conn )));
628
-
619
+ spin_lock_irq (& rds_tcp_conn_lock );
620
+ list_for_each_entry_safe (tc , _tc , & rds_tcp_conn_list , t_tcp_node ) {
621
+ if (!net_eq (net , rds_conn_net (tc -> t_cpath -> cp_conn )))
622
+ continue ;
629
623
if (!list_has_conn (& tmp_list , tc -> t_cpath -> cp_conn ))
630
624
list_move_tail (& tc -> t_tcp_node , & tmp_list );
631
625
}
632
- spin_unlock_irq (& rtn -> rds_tcp_conn_lock );
626
+ spin_unlock_irq (& rds_tcp_conn_lock );
633
627
list_for_each_entry_safe (tc , _tc , & tmp_list , t_tcp_node ) {
634
628
rds_tcp_conn_paths_destroy (tc -> t_cpath -> cp_conn );
635
629
rds_conn_destroy (tc -> t_cpath -> cp_conn , 1 );
@@ -643,8 +637,6 @@ static void __net_exit rds_tcp_exit_net(struct net *net)
643
637
rds_tcp_kill_sock (net , rtn );
644
638
rds_tcp_stats_net_exit (net );
645
639
646
- rds_tcp_destroy_conns (rtn );
647
-
648
640
if (rtn -> rds_tcp_sysctl )
649
641
unregister_net_sysctl_table (rtn -> rds_tcp_sysctl );
650
642
@@ -679,20 +671,17 @@ void *rds_tcp_listen_sock_def_readable(struct net *net)
679
671
static void rds_tcp_sysctl_reset (struct net * net )
680
672
{
681
673
struct rds_tcp_connection * tc , * _tc ;
682
- struct rds_tcp_net * rtn ;
683
-
684
- rtn = net_generic (net , rds_tcp_netid );
685
674
686
- spin_lock_irq (& rtn -> rds_tcp_conn_lock );
687
- list_for_each_entry_safe (tc , _tc , & rtn -> rds_tcp_conn_list , t_tcp_node ) {
688
- if (!tc -> t_sock )
675
+ spin_lock_irq (& rds_tcp_conn_lock );
676
+ list_for_each_entry_safe (tc , _tc , & rds_tcp_conn_list , t_tcp_node ) {
677
+ if (!net_eq (net , rds_conn_net (tc -> t_cpath -> cp_conn )) ||
678
+ !tc -> t_sock )
689
679
continue ;
690
- WARN_ON (!net_eq (net , rds_conn_net (tc -> t_cpath -> cp_conn )));
691
680
692
681
/* reconnect with new parameters */
693
682
rds_conn_path_drop (tc -> t_cpath , DR_USER_RESET , 0 );
694
683
}
695
- spin_unlock_irq (& rtn -> rds_tcp_conn_lock );
684
+ spin_unlock_irq (& rds_tcp_conn_lock );
696
685
}
697
686
698
687
static int rds_tcp_skbuf_handler (const struct ctl_table * ctl , int write ,
@@ -725,11 +714,11 @@ static void __exit rds_tcp_exit(void)
725
714
rds_info_deregister_func (RDS6_INFO_TCP_SOCKETS , rds6_tcp_tc_info );
726
715
#endif
727
716
unregister_pernet_device (& rds_tcp_net_ops );
717
+ rds_tcp_destroy_conns ();
728
718
729
719
/* There should not be any RDS/TCP connections. */
730
720
WARN_ON (atomic_read (& rds_tcp_transport .t_conn_count ));
731
721
732
- rds_trans_unregister (& rds_tcp_transport );
733
722
rds_tcp_recv_exit ();
734
723
kmem_cache_destroy (rds_tcp_conn_slab );
735
724
}
0 commit comments