Skip to content

Commit e1f4e4b

Browse files
Greg Jumpervijay-suman
authored andcommitted
Revert "net/rds: Use per-namespace connection lists in "rds_tcp""
This reverts commit 1a84744a61c905ec9e0740c0880e6456dfd90953. Orabug: 35811116 Signed-off-by: Greg Jumper <[email protected]> Reviewed-by: Sharath Srinivasan <[email protected]>
1 parent b5757da commit e1f4e4b

File tree

4 files changed

+70
-102
lines changed

4 files changed

+70
-102
lines changed

net/rds/tcp.c

Lines changed: 62 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,22 @@
4242

4343
#include "trace.h"
4444

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+
4561
static struct kmem_cache *rds_tcp_conn_slab;
4662

4763
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,
5167
static int rds_tcp_min_sndbuf = SOCK_MIN_SNDBUF;
5268
static int rds_tcp_min_rcvbuf = SOCK_MIN_RCVBUF;
5369

54-
int rds_tcp_netid;
55-
5670
static struct ctl_table rds_tcp_sysctl_table[] = {
5771
#define RDS_TCP_SNDBUF 0
5872
{
@@ -86,21 +100,20 @@ u32 rds_tcp_snd_una(struct rds_tcp_connection *tc)
86100
}
87101

88102
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)
91104
{
92105
rdsdebug("restoring sock %p callbacks from tc %p\n", sock, tc);
93106
write_lock_bh(&sock->sk->sk_callback_lock);
94107

95108
/* 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);
97110
list_del_init(&tc->t_list_item);
98111
#if IS_ENABLED(CONFIG_IPV6)
99-
rtn->rds6_tcp_tc_count--;
112+
rds6_tcp_tc_count--;
100113
#endif
101114
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);
104117

105118
tc->t_sock = NULL;
106119

@@ -122,7 +135,7 @@ void rds_tcp_restore_callbacks(struct socket *sock,
122135
* from being called while it isn't set.
123136
*/
124137
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)
126139
{
127140
struct rds_tcp_connection *tc = cp->cp_transport_data;
128141
struct socket *osock = tc->t_sock;
@@ -183,37 +196,36 @@ void rds_tcp_reset_callbacks(struct socket *sock,
183196
}
184197
tc->t_tinc_hdr_rem = sizeof(struct rds_header);
185198
tc->t_tinc_data_rem = 0;
186-
rds_tcp_restore_callbacks(osock, tc, rtn);
199+
rds_tcp_restore_callbacks(osock, tc);
187200
release_sock(osock->sk);
188201
sock_release(osock);
189202
newsock:
190203
rds_send_path_reset(cp);
191204
lock_sock(sock->sk);
192-
rds_tcp_set_callbacks(sock, cp, rtn);
205+
rds_tcp_set_callbacks(sock, cp);
193206
release_sock(sock->sk);
194207
}
195208

196209
/* Add tc to rds_tcp_tc_list and set tc->t_sock. See comments
197210
* above rds_tcp_reset_callbacks for notes about synchronization
198211
* with data path
199212
*/
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)
202214
{
203215
struct rds_tcp_connection *tc = cp->cp_transport_data;
204216

205217
rdsdebug("setting sock %p callbacks to tc %p\n", sock, tc);
206218
write_lock_bh(&sock->sk->sk_callback_lock);
207219

208220
/* 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);
211223
if (!tc->t_cpath->cp_conn->c_isv6)
212-
rtn->rds_tcp_tc_count++;
224+
rds_tcp_tc_count++;
213225
#if IS_ENABLED(CONFIG_IPV6)
214-
rtn->rds6_tcp_tc_count++;
226+
rds6_tcp_tc_count++;
215227
#endif
216-
spin_unlock(&rtn->rds_tcp_tc_list_lock);
228+
spin_unlock(&rds_tcp_tc_list_lock);
217229

218230
/* accepted sockets need our listen data ready undone */
219231
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,
243255
{
244256
struct rds_info_tcp_socket tsinfo;
245257
struct rds_tcp_connection *tc;
246-
struct rds_tcp_net *rtn;
247258
unsigned long flags;
248259

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);
252261

253-
if (len / sizeof(tsinfo) < rtn->rds_tcp_tc_count)
262+
if (len / sizeof(tsinfo) < rds_tcp_tc_count)
254263
goto out;
255264

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) {
257266
struct inet_sock *inet = inet_sk(tc->t_sock->sk);
258267

259268
if (tc->t_cpath->cp_conn->c_isv6)
@@ -274,10 +283,10 @@ static void rds_tcp_tc_info(struct socket *sock, unsigned int len,
274283
}
275284

276285
out:
277-
lens->nr = rtn->rds_tcp_tc_count;
286+
lens->nr = rds_tcp_tc_count;
278287
lens->each = sizeof(tsinfo);
279288

280-
spin_unlock_irqrestore(&rtn->rds_tcp_tc_list_lock, flags);
289+
spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags);
281290
}
282291

283292
#if IS_ENABLED(CONFIG_IPV6)
@@ -291,17 +300,14 @@ static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
291300
{
292301
struct rds6_info_tcp_socket tsinfo6;
293302
struct rds_tcp_connection *tc;
294-
struct rds_tcp_net *rtn;
295303
unsigned long flags;
296304

297-
rtn = net_generic(sock_net(sock->sk), rds_tcp_netid);
305+
spin_lock_irqsave(&rds_tcp_tc_list_lock, flags);
298306

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)
302308
goto out;
303309

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) {
305311
struct sock *sk = tc->t_sock->sk;
306312
struct inet_sock *inet = inet_sk(sk);
307313

@@ -320,10 +326,10 @@ static void rds6_tcp_tc_info(struct socket *sock, unsigned int len,
320326
}
321327

322328
out:
323-
lens->nr = rtn->rds6_tcp_tc_count;
329+
lens->nr = rds6_tcp_tc_count;
324330
lens->each = sizeof(tsinfo6);
325331

326-
spin_unlock_irqrestore(&rtn->rds_tcp_tc_list_lock, flags);
332+
spin_unlock_irqrestore(&rds_tcp_tc_list_lock, flags);
327333
}
328334
#endif
329335

@@ -365,11 +371,8 @@ int rds_tcp_laddr_check(struct net *net, const struct in6_addr *addr,
365371
static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp)
366372
{
367373
struct rds_tcp_connection *tc;
368-
struct rds_tcp_net *rtn;
369374
int i;
370375

371-
rtn = net_generic(rds_conn_net(conn), rds_tcp_netid);
372-
373376
for (i = 0; i < RDS_MPATH_WORKERS; i++) {
374377
tc = kmem_cache_alloc(rds_tcp_conn_slab, gfp);
375378
if (!tc)
@@ -389,12 +392,9 @@ static int rds_tcp_conn_alloc(struct rds_connection *conn, gfp_t gfp)
389392
conn->c_path[i].cp_transport_data = tc;
390393
tc->t_cpath = &conn->c_path[i];
391394

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);
398398
rdsdebug("rds_conn_path [%d] tc %p\n", i,
399399
conn->c_path[i].cp_transport_data);
400400
}
@@ -409,11 +409,10 @@ static void rds_tcp_conn_free(void *arg)
409409

410410
cancel_work_sync(&tc->t_fan_out_w);
411411

412-
spin_lock_irqsave(&tc->t_rtn->rds_tcp_conn_lock, flags);
412+
spin_lock_irqsave(&rds_tcp_conn_lock, flags);
413413
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);
415415

416-
tc->t_rtn = NULL;
417416
tc->t_stats = NULL;
418417
kmem_cache_free(rds_tcp_conn_slab, tc);
419418
}
@@ -429,18 +428,18 @@ static bool list_has_conn(struct list_head *list, struct rds_connection *conn)
429428
return false;
430429
}
431430

432-
static void rds_tcp_destroy_conns(struct rds_tcp_net *rtn)
431+
static void rds_tcp_destroy_conns(void)
433432
{
434433
struct rds_tcp_connection *tc, *_tc;
435434
LIST_HEAD(tmp_list);
436435

437436
/* 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) {
440439
if (!list_has_conn(&tmp_list, tc->t_cpath->cp_conn))
441440
list_move_tail(&tc->t_tcp_node, &tmp_list);
442441
}
443-
spin_unlock_irq(&rtn->rds_tcp_conn_lock);
442+
spin_unlock_irq(&rds_tcp_conn_lock);
444443

445444
list_for_each_entry_safe(tc, _tc, &tmp_list, t_tcp_node)
446445
rds_conn_destroy(tc->t_cpath->cp_conn, 1);
@@ -468,6 +467,8 @@ struct rds_transport rds_tcp_transport = {
468467
.t_conn_count = ATOMIC_INIT(0),
469468
};
470469

470+
int rds_tcp_netid;
471+
471472
/* All module specific customizations to the RDS-TCP socket should be done in
472473
* rds_tcp_tune() and applied after socket creation.
473474
*/
@@ -575,13 +576,6 @@ static __net_init int rds_tcp_init_net(struct net *net)
575576
#endif
576577
}
577578
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-
585579
return 0;
586580

587581
fail:
@@ -622,14 +616,14 @@ static void rds_tcp_kill_sock(struct net *net, struct rds_tcp_net *rtn)
622616
rds_tcp_listen_stop(lsock, &rtn->rds_tcp_accept_w);
623617
if (rtn->rds_tcp_accepted_sock)
624618
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;
629623
if (!list_has_conn(&tmp_list, tc->t_cpath->cp_conn))
630624
list_move_tail(&tc->t_tcp_node, &tmp_list);
631625
}
632-
spin_unlock_irq(&rtn->rds_tcp_conn_lock);
626+
spin_unlock_irq(&rds_tcp_conn_lock);
633627
list_for_each_entry_safe(tc, _tc, &tmp_list, t_tcp_node) {
634628
rds_tcp_conn_paths_destroy(tc->t_cpath->cp_conn);
635629
rds_conn_destroy(tc->t_cpath->cp_conn, 1);
@@ -643,8 +637,6 @@ static void __net_exit rds_tcp_exit_net(struct net *net)
643637
rds_tcp_kill_sock(net, rtn);
644638
rds_tcp_stats_net_exit(net);
645639

646-
rds_tcp_destroy_conns(rtn);
647-
648640
if (rtn->rds_tcp_sysctl)
649641
unregister_net_sysctl_table(rtn->rds_tcp_sysctl);
650642

@@ -679,20 +671,17 @@ void *rds_tcp_listen_sock_def_readable(struct net *net)
679671
static void rds_tcp_sysctl_reset(struct net *net)
680672
{
681673
struct rds_tcp_connection *tc, *_tc;
682-
struct rds_tcp_net *rtn;
683-
684-
rtn = net_generic(net, rds_tcp_netid);
685674

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)
689679
continue;
690-
WARN_ON(!net_eq(net, rds_conn_net(tc->t_cpath->cp_conn)));
691680

692681
/* reconnect with new parameters */
693682
rds_conn_path_drop(tc->t_cpath, DR_USER_RESET, 0);
694683
}
695-
spin_unlock_irq(&rtn->rds_tcp_conn_lock);
684+
spin_unlock_irq(&rds_tcp_conn_lock);
696685
}
697686

698687
static int rds_tcp_skbuf_handler(const struct ctl_table *ctl, int write,
@@ -725,11 +714,11 @@ static void __exit rds_tcp_exit(void)
725714
rds_info_deregister_func(RDS6_INFO_TCP_SOCKETS, rds6_tcp_tc_info);
726715
#endif
727716
unregister_pernet_device(&rds_tcp_net_ops);
717+
rds_tcp_destroy_conns();
728718

729719
/* There should not be any RDS/TCP connections. */
730720
WARN_ON(atomic_read(&rds_tcp_transport.t_conn_count));
731721

732-
rds_trans_unregister(&rds_tcp_transport);
733722
rds_tcp_recv_exit();
734723
kmem_cache_destroy(rds_tcp_conn_slab);
735724
}

net/rds/tcp.h

Lines changed: 3 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,22 +18,6 @@ struct rds_tcp_net {
1818

1919
int sndbuf_size;
2020
int rcvbuf_size;
21-
22-
/* only for info exporting */
23-
spinlock_t rds_tcp_tc_list_lock;
24-
struct list_head rds_tcp_tc_list;
25-
26-
/* rds_tcp_tc_count counts only IPv4 connections.
27-
* rds6_tcp_tc_count counts both IPv4 and IPv6 connections.
28-
*/
29-
unsigned int rds_tcp_tc_count;
30-
#if IS_ENABLED(CONFIG_IPV6)
31-
unsigned int rds6_tcp_tc_count;
32-
#endif
33-
34-
/* Track rds_tcp_connection structs so they can be cleaned up */
35-
spinlock_t rds_tcp_conn_lock;
36-
struct list_head rds_tcp_conn_list;
3721
};
3822

3923
struct rds_tcp_incoming {
@@ -86,13 +70,10 @@ struct rds_tcp_connection {
8670
/* tcp.c */
8771
extern int rds_tcp_netid;
8872
void rds_tcp_tune(struct socket *sock);
89-
void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp,
90-
struct rds_tcp_net *rtn);
91-
void rds_tcp_reset_callbacks(struct socket *sock, struct rds_conn_path *cp,
92-
struct rds_tcp_net *rtn);
73+
void rds_tcp_set_callbacks(struct socket *sock, struct rds_conn_path *cp);
74+
void rds_tcp_reset_callbacks(struct socket *sock, struct rds_conn_path *cp);
9375
void rds_tcp_restore_callbacks(struct socket *sock,
94-
struct rds_tcp_connection *tc,
95-
struct rds_tcp_net *rtn);
76+
struct rds_tcp_connection *tc);
9677
u32 rds_tcp_write_seq(struct rds_tcp_connection *tc);
9778
u32 rds_tcp_snd_una(struct rds_tcp_connection *tc);
9879
u64 rds_tcp_map_seq(struct rds_tcp_connection *tc, u32 seq);

0 commit comments

Comments
 (0)