Skip to content

Commit 51db23d

Browse files
Greg Jumpervijay-suman
authored andcommitted
Revert "net/rds: Use per-namespace connection hash tables"
This reverts commit 0dba7a6ca0a3c33b092b3970053ef10b14cb6656. Orabug: 35811116 Signed-off-by: Greg Jumper <[email protected]> Reviewed-by: Sharath Srinivasan <[email protected]>
1 parent f3695f3 commit 51db23d

File tree

4 files changed

+52
-101
lines changed

4 files changed

+52
-101
lines changed

net/rds/af_rds.c

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,8 @@ static int rds_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
559559
&reset.src.s_addr);
560560

561561
mutex_lock(&conn_reset_zero_dest);
562-
rds_conn_laddr_list(rs->rs_rns, &src6, &s_addr_conns);
562+
rds_conn_laddr_list(sock_net(rds_rs_to_sk(rs)),
563+
&src6, &s_addr_conns);
563564
if (list_empty(&s_addr_conns)) {
564565
mutex_unlock(&conn_reset_zero_dest);
565566
goto done;
@@ -573,7 +574,7 @@ static int rds_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
573574
}
574575

575576
ipv6_addr_set_v4mapped(reset.dst.s_addr, &dst6);
576-
conn = rds_conn_find(rs->rs_rns, &src6, &dst6,
577+
conn = rds_conn_find(sock_net(rds_rs_to_sk(rs)), &src6, &dst6,
577578
rs->rs_transport, reset.tos,
578579
rs->rs_bound_scope_id);
579580

@@ -610,7 +611,8 @@ static int rds6_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
610611
&reset.src);
611612

612613
mutex_lock(&conn_reset_zero_dest);
613-
rds_conn_laddr_list(rs->rs_rns, &reset.src, &s_addr_conns);
614+
rds_conn_laddr_list(sock_net(rds_rs_to_sk(rs)),
615+
&reset.src, &s_addr_conns);
614616
if (list_empty(&s_addr_conns)) {
615617
mutex_unlock(&conn_reset_zero_dest);
616618
goto done;
@@ -623,9 +625,9 @@ static int rds6_user_reset(struct rds_sock *rs, sockptr_t optval, int optlen)
623625
goto done;
624626
}
625627

626-
conn = rds_conn_find(rs->rs_rns, &reset.src, &reset.dst,
627-
rs->rs_transport, reset.tos,
628-
rs->rs_bound_scope_id);
628+
conn = rds_conn_find(sock_net(rds_rs_to_sk(rs)),
629+
&reset.src, &reset.dst, rs->rs_transport,
630+
reset.tos, rs->rs_bound_scope_id);
629631

630632
if (conn) {
631633
bool is_tcp = conn->c_trans->t_type == RDS_TRANS_TCP;

net/rds/connection.c

Lines changed: 37 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,18 @@ static bool rds_wq_strictly_ordered;
5050
module_param(rds_wq_strictly_ordered, bool, 0644);
5151

5252
/* 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];
5355
static struct hlist_head rds_conn_faddr_hash[RDS_CONN_FADDR_HASH_ENTRIES];
5456
static struct kmem_cache *rds_conn_slab;
5557

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
5759
* of each element.
5860
*/
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)++)
6365

6466
static void rds_conn_ha_changed_task(struct work_struct *work);
6567
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,
9698
return hash;
9799
}
98100

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,
101102
const struct in6_addr *faddr,
102103
u8 tos)
103104
{
104105
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];
106107
}
107108

108109
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)
117118
} while (0)
118119

119120
/* 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,
121123
const struct in6_addr *laddr,
122124
const struct in6_addr *faddr,
123125
struct rds_transport *trans,
@@ -130,6 +132,7 @@ static struct rds_connection *rds_conn_lookup(struct hlist_head *head,
130132
if (ipv6_addr_equal(&conn->c_faddr, faddr) &&
131133
ipv6_addr_equal(&conn->c_laddr, laddr) &&
132134
conn->c_tos == tos && conn->c_trans == trans &&
135+
net == rds_conn_net(conn) &&
133136
conn->c_dev_if == dev_if) {
134137
ret = conn;
135138
break;
@@ -139,17 +142,18 @@ static struct rds_connection *rds_conn_lookup(struct hlist_head *head,
139142
return ret;
140143
}
141144

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,
143146
struct list_head *laddr_conns)
144147
{
145148
struct rds_connection *conn;
146149
struct hlist_head *head;
147150

148151
rcu_read_lock();
149152

150-
for_each_conn_hash_bucket(rns, head) {
153+
for_each_conn_hash_bucket(head) {
151154
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))
153157
list_add(&conn->c_laddr_node, laddr_conns);
154158
}
155159

@@ -239,20 +243,16 @@ static struct rds_connection *__rds_conn_create(struct net *net,
239243
int dev_if)
240244
{
241245
struct rds_connection *conn, *parent = NULL;
242-
struct hlist_head *head;
246+
struct hlist_head *head = rds_conn_bucket(laddr, faddr, tos);
243247
struct hlist_head *faddr_head = rds_conn_faddr_bucket(faddr);
244248
struct rds_transport *loop_trans;
245-
struct rds_net *rns;
246249
char *reason = NULL;
247250
unsigned long flags;
248251
int ret, i;
249252
int npaths;
250253

251-
rns = rds_ns(net);
252-
head = rds_conn_bucket(rns, laddr, faddr, tos);
253-
254254
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);
256256
if (conn &&
257257
conn->c_loopback &&
258258
conn->c_trans != &rds_loop_transport &&
@@ -397,7 +397,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
397397
* init and return our conn. If we lost, we rollback and return the
398398
* other one.
399399
*/
400-
spin_lock_irqsave(&rns->rns_conn_lock, flags);
400+
spin_lock_irqsave(&rds_conn_lock, flags);
401401
if (parent) {
402402
/* Creating passive conn */
403403
if (parent->c_passive) {
@@ -417,7 +417,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
417417
/* Creating normal conn */
418418
struct rds_connection *found;
419419

420-
found = rds_conn_lookup(head, laddr, faddr, trans, tos,
420+
found = rds_conn_lookup(net, head, laddr, faddr, trans, tos,
421421
dev_if);
422422
if (found) {
423423
struct rds_conn_path *cp;
@@ -442,7 +442,7 @@ static struct rds_connection *__rds_conn_create(struct net *net,
442442
atomic_inc(&conn->c_trans->t_conn_count);
443443
}
444444
}
445-
spin_unlock_irqrestore(&rns->rns_conn_lock, flags);
445+
spin_unlock_irqrestore(&rds_conn_lock, flags);
446446

447447
out:
448448
if (reason)
@@ -472,17 +472,16 @@ struct rds_connection *rds_conn_create_outgoing(struct net *net,
472472
}
473473
EXPORT_SYMBOL_GPL(rds_conn_create_outgoing);
474474

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,
477476
struct in6_addr *faddr,
478477
struct rds_transport *trans, u8 tos,
479478
int dev_if)
480479
{
481480
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);
483482

484483
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);
486485
rcu_read_unlock();
487486

488487
return conn;
@@ -725,25 +724,20 @@ static void rds_conn_path_destroy(struct rds_conn_path *cp, int shutdown)
725724
void rds_conn_destroy(struct rds_connection *conn, int shutdown)
726725
{
727726
int npaths = (conn->c_trans->t_mp_capable ? RDS_MPATH_WORKERS : 1);
728-
struct rds_net *rns;
729-
spinlock_t *lock; /* protect connection */
730727
int i;
731728

732729
trace_rds_conn_destroy(NULL, conn, NULL, NULL, 0);
733730

734-
rns = conn->c_rns;
735-
lock = &rns->rns_conn_lock;
736-
737731
conn->c_destroy_in_prog = 1;
738732
smp_mb();
739733
cancel_work_sync(&conn->c_ha_changed.work);
740734
cancel_delayed_work_sync(&conn->c_dr_sock_cancel_w);
741735

742736
/* Ensure conn will not be scheduled for reconnect */
743-
spin_lock_irq(lock);
737+
spin_lock_irq(&rds_conn_lock);
744738
hlist_del_init_rcu(&conn->c_hash_node);
745739
hlist_del_init_rcu(&conn->c_faddr_node);
746-
spin_unlock_irq(lock);
740+
spin_unlock_irq(&rds_conn_lock);
747741
synchronize_rcu();
748742

749743
/* shut the connection down */
@@ -764,7 +758,6 @@ void rds_conn_destroy(struct rds_connection *conn, int shutdown)
764758

765759
atomic_dec(&conn->c_trans->t_conn_count);
766760

767-
rds_conn_net_set(conn, NULL);
768761
kfree(conn->c_path);
769762
kmem_cache_free(rds_conn_slab, conn);
770763
}
@@ -789,10 +782,9 @@ static void rds_conn_message_info_cmn(struct socket *sock, unsigned int len,
789782
struct rds_info_lengths *lens,
790783
int want_send, bool isv6)
791784
{
792-
struct rds_connection *conn;
793-
struct rds_net *rns;
794785
struct hlist_head *head;
795786
struct list_head *list;
787+
struct rds_connection *conn;
796788
struct rds_message *rm;
797789
unsigned int total = 0;
798790
unsigned long flags;
@@ -803,11 +795,9 @@ static void rds_conn_message_info_cmn(struct socket *sock, unsigned int len,
803795
else
804796
len /= sizeof(struct rds_info_message);
805797

806-
rns = rds_ns(sock_net(sock->sk));
807-
808798
rcu_read_lock();
809799

810-
for_each_conn_hash_bucket(rns, head) {
800+
for_each_conn_hash_bucket(head) {
811801
hlist_for_each_entry_rcu(conn, head, c_hash_node) {
812802
struct rds_conn_path *cp;
813803
int npaths;
@@ -908,18 +898,15 @@ void rds_for_each_conn_info(struct socket *sock, unsigned int len,
908898
u64 *buffer,
909899
size_t item_len)
910900
{
911-
struct rds_connection *conn;
912-
struct rds_net *rns;
913901
struct hlist_head *head;
914-
915-
rns = rds_ns(sock_net(sock->sk));
902+
struct rds_connection *conn;
916903

917904
rcu_read_lock();
918905

919906
lens->nr = 0;
920907
lens->each = item_len;
921908

922-
for_each_conn_hash_bucket(rns, head) {
909+
for_each_conn_hash_bucket(head) {
923910
hlist_for_each_entry_rcu(conn, head, c_hash_node) {
924911

925912
/* XXX no c_lock usage.. */
@@ -948,18 +935,15 @@ static void rds_walk_conn_path_info(struct socket *sock, unsigned int len,
948935
u64 *buffer,
949936
size_t item_len)
950937
{
951-
struct rds_connection *conn;
952-
struct rds_net *rns;
953938
struct hlist_head *head;
954-
955-
rns = rds_sk_to_rs(sock->sk)->rs_rns;
939+
struct rds_connection *conn;
956940

957941
rcu_read_lock();
958942

959943
lens->nr = 0;
960944
lens->each = item_len;
961945

962-
for_each_conn_hash_bucket(rns, head) {
946+
for_each_conn_hash_bucket(head) {
963947
hlist_for_each_entry_rcu(conn, head, c_hash_node) {
964948
struct rds_conn_path *cp;
965949

@@ -1193,8 +1177,13 @@ int rds_conn_init(void)
11931177

11941178
void rds_conn_exit(void)
11951179
{
1180+
struct hlist_head *head;
1181+
11961182
rds_loop_exit();
11971183

1184+
for_each_conn_hash_bucket(head)
1185+
WARN_ON(!hlist_empty(head));
1186+
11981187
kmem_cache_destroy(rds_conn_slab);
11991188

12001189
rds_info_deregister_func(RDS_INFO_CONNECTIONS, rds_conn_info);
@@ -1211,29 +1200,6 @@ void rds_conn_exit(void)
12111200
#endif
12121201
}
12131202

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-
12371203
static char *conn_drop_reasons[] = {
12381204
[DR_DEFAULT] = "unknown reason (default_state)",
12391205
[DR_USER_RESET] = "user reset",

0 commit comments

Comments
 (0)