Skip to content

Commit 86a8cd3

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

File tree

5 files changed

+25
-71
lines changed

5 files changed

+25
-71
lines changed

net/rds/af_rds.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ static int rds_release(struct socket *sock)
203203
rds_clear_recv_queue(rs);
204204
rds_cong_remove_socket(rs);
205205

206-
rds_remove_bound(rs->rs_rns, rs);
206+
rds_remove_bound(rs);
207207

208208
rds_send_drop_to(rs, NULL);
209209
rds_notify_queue_get(rs, NULL);
@@ -1484,6 +1484,8 @@ static int __init rds_init(void)
14841484
if (ret)
14851485
goto out_slab;
14861486

1487+
rds_bind_lock_init();
1488+
14871489
ret = rds_conn_init();
14881490
if (ret)
14891491
goto out_net;

net/rds/bind.c

Lines changed: 17 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ struct bind_bucket {
4444
};
4545

4646
#define BIND_HASH_SIZE 8192
47+
static struct bind_bucket bind_hash_table[BIND_HASH_SIZE];
4748

48-
static struct bind_bucket *hash_to_bucket(struct rds_net *rds_ns,
49-
struct in6_addr *addr, __be16 port)
49+
static struct bind_bucket *hash_to_bucket(struct in6_addr *addr, __be16 port)
5050
{
51-
return rds_ns->rns_bind_hash_table +
51+
return bind_hash_table +
5252
(jhash_3words((__force u32)(addr->s6_addr32[0] ^
5353
addr->s6_addr32[1]),
5454
(__force u32)(addr->s6_addr32[2] ^
@@ -99,13 +99,12 @@ static struct rds_sock *rds_bind_lookup(struct bind_bucket *bucket,
9999
* The rx path can race with rds_release. We notice if rds_release() has
100100
* marked this socket and don't return a rs ref to the rx path.
101101
*/
102-
struct rds_sock *rds_find_bound(struct rds_net *rds_ns,
103-
struct in6_addr *addr, __be16 port,
102+
struct rds_sock *rds_find_bound(struct in6_addr *addr, __be16 port,
104103
__u32 scope_id)
105104
{
106105
struct rds_sock *rs;
107106
unsigned long flags;
108-
struct bind_bucket *bucket = hash_to_bucket(rds_ns, addr, port);
107+
struct bind_bucket *bucket = hash_to_bucket(addr, port);
109108

110109
read_lock_irqsave(&bucket->lock, flags);
111110
rs = rds_bind_lookup(bucket, addr, port, NULL, scope_id);
@@ -123,8 +122,8 @@ struct rds_sock *rds_find_bound(struct rds_net *rds_ns,
123122
}
124123

125124
/* returns -ve errno or +ve port */
126-
static int rds_add_bound(struct rds_net *rds_ns, struct rds_sock *rs,
127-
struct in6_addr *addr, __be16 *port, __u32 scope_id)
125+
static int rds_add_bound(struct rds_sock *rs, struct in6_addr *addr,
126+
__be16 *port, __u32 scope_id)
128127
{
129128
unsigned long flags;
130129
int ret = -EADDRINUSE;
@@ -144,7 +143,7 @@ static int rds_add_bound(struct rds_net *rds_ns, struct rds_sock *rs,
144143
if (rover == 0)
145144
rover++;
146145

147-
bucket = hash_to_bucket(rds_ns, addr, cpu_to_be16(rover));
146+
bucket = hash_to_bucket(addr, cpu_to_be16(rover));
148147

149148
write_lock_irqsave(&bucket->lock, flags);
150149
rrs = rds_bind_lookup(bucket, addr, cpu_to_be16(rover), rs,
@@ -164,11 +163,11 @@ static int rds_add_bound(struct rds_net *rds_ns, struct rds_sock *rs,
164163
return ret;
165164
}
166165

167-
void rds_remove_bound(struct rds_net *rds_ns, struct rds_sock *rs)
166+
void rds_remove_bound(struct rds_sock *rs)
168167
{
169168
unsigned long flags;
170169
struct bind_bucket *bucket =
171-
hash_to_bucket(rds_ns, &rs->rs_bound_addr, rs->rs_bound_port);
170+
hash_to_bucket(&rs->rs_bound_addr, rs->rs_bound_port);
172171

173172
write_lock_irqsave(&bucket->lock, flags);
174173

@@ -191,9 +190,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
191190
struct rds_sock *rs = rds_sk_to_rs(sk);
192191
struct in6_addr v6addr, *binding_addr;
193192
struct rds_transport *trans;
194-
struct rds_net *rds_ns;
195193
__u32 scope_id = 0;
196-
struct net *net;
197194
int ret = 0;
198195
__be16 port;
199196
bool release_trans_on_error;
@@ -268,20 +265,21 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
268265
goto out;
269266
}
270267

271-
net = sock_net(sock->sk);
272268
/* The transport can be set using SO_RDS_TRANSPORT option before the
273269
* socket is bound.
274270
*/
275271
if (rs->rs_transport) {
276272
trans = rs->rs_transport;
277273
if (!trans->laddr_check ||
278-
trans->laddr_check(net, binding_addr, scope_id) != 0) {
274+
trans->laddr_check(sock_net(sock->sk),
275+
binding_addr, scope_id) != 0) {
279276
ret = -ENOPROTOOPT;
280277
goto out;
281278
}
282279
release_trans_on_error = false;
283280
} else {
284-
trans = rds_trans_get_preferred(net, binding_addr, scope_id);
281+
trans = rds_trans_get_preferred(sock_net(sock->sk),
282+
binding_addr, scope_id);
285283
if (!trans) {
286284
ret = -EADDRNOTAVAIL;
287285
pr_info_ratelimited("RDS: %s could not find a transport for %pI6c, load rds_tcp or rds_rdma?\n",
@@ -292,8 +290,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
292290
release_trans_on_error = true;
293291
}
294292

295-
rds_ns = rs->rs_rns;
296-
ret = rds_add_bound(rds_ns, rs, binding_addr, &port, scope_id);
293+
ret = rds_add_bound(rs, binding_addr, &port, scope_id);
297294
if (ret && release_trans_on_error) {
298295
rds_trans_put(rs->rs_transport);
299296
rs->rs_transport = NULL;
@@ -304,33 +301,9 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
304301
return ret;
305302
}
306303

307-
int rds_bind_tbl_net_init(struct rds_net *rds_ns)
304+
void rds_bind_lock_init(void)
308305
{
309-
struct bind_bucket *bind_hash_table;
310306
int i;
311-
312-
bind_hash_table = kzalloc(sizeof(*bind_hash_table) *
313-
BIND_HASH_SIZE, GFP_KERNEL);
314-
if (!bind_hash_table)
315-
return -ENOMEM;
316-
317-
for (i = 0; i < BIND_HASH_SIZE; i++) {
318-
rwlock_init(&bind_hash_table[i].lock);
319-
INIT_HLIST_HEAD(&bind_hash_table[i].head);
320-
}
321-
rds_ns->rns_bind_hash_table = bind_hash_table;
322-
323-
return 0;
324-
}
325-
326-
void rds_bind_tbl_net_exit(struct rds_net *rds_ns)
327-
{
328-
struct bind_bucket *bind_hash_table;
329-
int i;
330-
331-
bind_hash_table = rds_ns->rns_bind_hash_table;
332307
for (i = 0; i < BIND_HASH_SIZE; i++)
333-
WARN_ON(!hlist_empty(&bind_hash_table[i].head));
334-
kfree(bind_hash_table);
335-
rds_ns->rns_bind_hash_table = NULL;
308+
rwlock_init(&bind_hash_table[i].lock);
336309
}

net/rds/rds.h

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -245,15 +245,11 @@ enum rds_hb_state {
245245
HB_PONG_RCVD,
246246
};
247247

248-
struct bind_bucket;
249-
250248
struct rds_net {
251249
/* The following socket info is used for stats gathering */
252250
struct mutex rns_sock_lock;
253251
u32 rns_sock_count;
254252
struct list_head rns_sock_list;
255-
256-
struct bind_bucket *rns_bind_hash_table;
257253
};
258254

259255
#define IS_CANONICAL(laddr, faddr) (htonl(laddr) < htonl(faddr))
@@ -381,7 +377,6 @@ struct rds_connection {
381377
unsigned int c_proposed_version;
382378
unsigned int c_version;
383379
possible_net_t c_net;
384-
struct rds_net *c_rns;
385380

386381
/* Re-connect stall diagnostics */
387382
unsigned long c_reconnect_start;
@@ -419,15 +414,11 @@ struct net *rds_conn_net(struct rds_connection *conn)
419414
return read_pnet(&conn->c_net);
420415
}
421416

422-
struct rds_net *rds_ns(struct net *);
423-
424417
static inline
425418
void rds_conn_net_set(struct rds_connection *conn, struct net *net)
426419
{
427420
/* Once set, never changed. */
428421
write_pnet(&conn->c_net, net);
429-
430-
conn->c_rns = rds_ns(net);
431422
}
432423

433424
#define RDS_FLAG_CONG_BITMAP 0x01
@@ -1102,12 +1093,10 @@ void debug_sock_put(struct sock *sock);
11021093

11031094
/* bind.c */
11041095
int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len);
1105-
void rds_remove_bound(struct rds_net *rds_ns, struct rds_sock *rs);
1106-
struct rds_sock *rds_find_bound(struct rds_net *rds_ns,
1107-
struct in6_addr *addr, __be16 port,
1096+
void rds_remove_bound(struct rds_sock *rs);
1097+
struct rds_sock *rds_find_bound(struct in6_addr *addr, __be16 port,
11081098
__u32 scope_id);
1109-
int rds_bind_tbl_net_init(struct rds_net *rds_ns);
1110-
void rds_bind_tbl_net_exit(struct rds_net *rds_ns);
1099+
void rds_bind_lock_init(void);
11111100

11121101
/* cong.c */
11131102
int rds_cong_monitor_init(void);
@@ -1540,6 +1529,7 @@ int rds_trans_init(void);
15401529
void rds_trans_exit(void);
15411530

15421531
/* rds_ns.c */
1532+
struct rds_net *rds_ns(struct net *net);
15431533
int rds_reg_pernet(void);
15441534
void rds_unreg_pernet(void);
15451535

net/rds/rds_ns.c

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ EXPORT_SYMBOL(rds_ns);
4747
static __net_init int rds_init_net(struct net *net)
4848
{
4949
struct rds_net *rns;
50-
int ret;
5150

5251
rns = rds_ns(net);
5352

@@ -56,23 +55,13 @@ static __net_init int rds_init_net(struct net *net)
5655
mutex_init(&rns->rns_sock_lock);
5756
INIT_LIST_HEAD(&rns->rns_sock_list);
5857

59-
ret = rds_bind_tbl_net_init(rns);
60-
if (ret)
61-
goto err;
62-
6358
return 0;
64-
65-
err:
66-
mutex_destroy(&rns->rns_sock_lock);
67-
return ret;
6859
}
6960

7061
static void rds_exit_net(struct net *net)
7162
{
7263
struct rds_net *rns = rds_ns(net);
7364

74-
rds_bind_tbl_net_exit(rns);
75-
7665
mutex_destroy(&rns->rns_sock_lock);
7766
}
7867

net/rds/recv.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -455,7 +455,7 @@ void rds_recv_incoming(struct rds_connection *conn, struct in6_addr *saddr,
455455
if (!inc->i_hdr.h_sport)
456456
rds_stats_inc(s_recv_pong);
457457

458-
rs = rds_find_bound(conn->c_rns, daddr, inc->i_hdr.h_dport, conn->c_bound_if);
458+
rs = rds_find_bound(daddr, inc->i_hdr.h_dport, conn->c_bound_if);
459459
if (!rs) {
460460
rds_stats_inc(s_recv_drop_no_sock);
461461
dropreason = "no socket";

0 commit comments

Comments
 (0)