@@ -44,11 +44,11 @@ struct bind_bucket {
44
44
};
45
45
46
46
#define BIND_HASH_SIZE 8192
47
+ static struct bind_bucket bind_hash_table [BIND_HASH_SIZE ];
47
48
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 )
50
50
{
51
- return rds_ns -> rns_bind_hash_table +
51
+ return bind_hash_table +
52
52
(jhash_3words ((__force u32 )(addr -> s6_addr32 [0 ] ^
53
53
addr -> s6_addr32 [1 ]),
54
54
(__force u32 )(addr -> s6_addr32 [2 ] ^
@@ -99,13 +99,12 @@ static struct rds_sock *rds_bind_lookup(struct bind_bucket *bucket,
99
99
* The rx path can race with rds_release. We notice if rds_release() has
100
100
* marked this socket and don't return a rs ref to the rx path.
101
101
*/
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 ,
104
103
__u32 scope_id )
105
104
{
106
105
struct rds_sock * rs ;
107
106
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 );
109
108
110
109
read_lock_irqsave (& bucket -> lock , flags );
111
110
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,
123
122
}
124
123
125
124
/* 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 )
128
127
{
129
128
unsigned long flags ;
130
129
int ret = - EADDRINUSE ;
@@ -144,7 +143,7 @@ static int rds_add_bound(struct rds_net *rds_ns, struct rds_sock *rs,
144
143
if (rover == 0 )
145
144
rover ++ ;
146
145
147
- bucket = hash_to_bucket (rds_ns , addr , cpu_to_be16 (rover ));
146
+ bucket = hash_to_bucket (addr , cpu_to_be16 (rover ));
148
147
149
148
write_lock_irqsave (& bucket -> lock , flags );
150
149
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,
164
163
return ret ;
165
164
}
166
165
167
- void rds_remove_bound (struct rds_net * rds_ns , struct rds_sock * rs )
166
+ void rds_remove_bound (struct rds_sock * rs )
168
167
{
169
168
unsigned long flags ;
170
169
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 );
172
171
173
172
write_lock_irqsave (& bucket -> lock , flags );
174
173
@@ -191,9 +190,7 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
191
190
struct rds_sock * rs = rds_sk_to_rs (sk );
192
191
struct in6_addr v6addr , * binding_addr ;
193
192
struct rds_transport * trans ;
194
- struct rds_net * rds_ns ;
195
193
__u32 scope_id = 0 ;
196
- struct net * net ;
197
194
int ret = 0 ;
198
195
__be16 port ;
199
196
bool release_trans_on_error ;
@@ -268,20 +265,21 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
268
265
goto out ;
269
266
}
270
267
271
- net = sock_net (sock -> sk );
272
268
/* The transport can be set using SO_RDS_TRANSPORT option before the
273
269
* socket is bound.
274
270
*/
275
271
if (rs -> rs_transport ) {
276
272
trans = rs -> rs_transport ;
277
273
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 ) {
279
276
ret = - ENOPROTOOPT ;
280
277
goto out ;
281
278
}
282
279
release_trans_on_error = false;
283
280
} 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 );
285
283
if (!trans ) {
286
284
ret = - EADDRNOTAVAIL ;
287
285
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)
292
290
release_trans_on_error = true;
293
291
}
294
292
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 );
297
294
if (ret && release_trans_on_error ) {
298
295
rds_trans_put (rs -> rs_transport );
299
296
rs -> rs_transport = NULL ;
@@ -304,33 +301,9 @@ int rds_bind(struct socket *sock, struct sockaddr *uaddr, int addr_len)
304
301
return ret ;
305
302
}
306
303
307
- int rds_bind_tbl_net_init ( struct rds_net * rds_ns )
304
+ void rds_bind_lock_init ( void )
308
305
{
309
- struct bind_bucket * bind_hash_table ;
310
306
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 ;
332
307
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 );
336
309
}
0 commit comments