@@ -164,6 +164,10 @@ char *rds_str_array(char **array, size_t elements, size_t index)
164
164
}
165
165
EXPORT_SYMBOL (rds_str_array );
166
166
167
+ /* this is just used for stats gathering :/ */
168
+ static DEFINE_SPINLOCK (rds_sock_lock );
169
+ static unsigned long rds_sock_count ;
170
+ static LIST_HEAD (rds_sock_list );
167
171
struct wait_queue_head rds_poll_waitq [RDS_NMBR_WAITQ ];
168
172
169
173
/* kmem cache slab for struct rds_buf_info */
@@ -214,10 +218,10 @@ static int rds_release(struct socket *sock)
214
218
rhashtable_free_and_destroy (& rs -> rs_buf_info_tbl , rds_buf_info_free ,
215
219
NULL );
216
220
217
- mutex_lock ( & rs -> rs_rns -> rns_sock_lock );
221
+ spin_lock_bh ( & rds_sock_lock );
218
222
list_del_init (& rs -> rs_item );
219
- rs -> rs_rns -> rns_sock_count -- ;
220
- mutex_unlock ( & rs -> rs_rns -> rns_sock_lock );
223
+ rds_sock_count -- ;
224
+ spin_unlock_bh ( & rds_sock_lock );
221
225
222
226
rds_trans_put (rs -> rs_transport );
223
227
@@ -397,10 +401,8 @@ static unsigned int rds_poll(struct file *file, struct socket *sock,
397
401
static int rds_ioctl (struct socket * sock , unsigned int cmd , unsigned long arg )
398
402
{
399
403
struct rds_sock * rs = rds_sk_to_rs (sock -> sk );
400
- struct mutex * sock_lock ;
401
404
rds_tos_t tos ;
402
405
403
- sock_lock = & rs -> rs_rns -> rns_sock_lock ;
404
406
switch (cmd ) {
405
407
case SIOCRDSSETTOS :
406
408
if (get_user (tos , (rds_tos_t __user * )arg ))
@@ -410,21 +412,21 @@ static int rds_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
410
412
rs -> rs_transport -> t_type == RDS_TRANS_TCP )
411
413
tos = 0 ;
412
414
413
- mutex_lock ( sock_lock );
415
+ spin_lock_bh ( & rds_sock_lock );
414
416
if (rs -> rs_tos || rs -> rs_conn ) {
415
- mutex_unlock ( sock_lock );
417
+ spin_unlock_bh ( & rds_sock_lock );
416
418
return - EINVAL ;
417
419
}
418
420
rs -> rs_tos = tos ;
419
- mutex_unlock (sock_lock );
420
- break ;
421
- case SIOCRDSGETTOS :
422
- mutex_lock (sock_lock );
423
- tos = rs -> rs_tos ;
424
- mutex_unlock (sock_lock );
425
- if (put_user (tos , (rds_tos_t __user * )arg ))
426
- return - EFAULT ;
421
+ spin_unlock_bh (& rds_sock_lock );
427
422
break ;
423
+ case SIOCRDSGETTOS :
424
+ spin_lock_bh (& rds_sock_lock );
425
+ tos = rs -> rs_tos ;
426
+ spin_unlock_bh (& rds_sock_lock );
427
+ if (put_user (tos , (rds_tos_t __user * )arg ))
428
+ return - EFAULT ;
429
+ break ;
428
430
default :
429
431
return - ENOIOCTLCMD ;
430
432
}
@@ -1055,7 +1057,6 @@ static void rds_sock_destruct(struct sock *sk)
1055
1057
static int __rds_create (struct socket * sock , struct sock * sk , int protocol )
1056
1058
{
1057
1059
struct rds_sock * rs ;
1058
- struct net * net ;
1059
1060
int ret ;
1060
1061
1061
1062
sock_init_data (sock , sk );
@@ -1078,8 +1079,6 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
1078
1079
rs -> rs_conn_path = NULL ;
1079
1080
rs -> rs_rx_traces = 0 ;
1080
1081
rs -> rs_pid = current -> pid ;
1081
- net = sock_net (sk );
1082
- rs -> rs_rns = rds_ns (net );
1083
1082
1084
1083
spin_lock_init (& rs -> rs_snd_lock );
1085
1084
ret = rhashtable_init (& rs -> rs_buf_info_tbl , & rs_buf_info_params );
@@ -1094,10 +1093,10 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
1094
1093
& rs -> rs_bound_addr );
1095
1094
}
1096
1095
1097
- mutex_lock ( & rs -> rs_rns -> rns_sock_lock );
1098
- list_add_tail (& rs -> rs_item , & rs -> rs_rns -> rns_sock_list );
1099
- rs -> rs_rns -> rns_sock_count ++ ;
1100
- mutex_unlock ( & rs -> rs_rns -> rns_sock_lock );
1096
+ spin_lock_bh ( & rds_sock_lock );
1097
+ list_add_tail (& rs -> rs_item , & rds_sock_list );
1098
+ rds_sock_count ++ ;
1099
+ spin_unlock_bh ( & rds_sock_lock );
1101
1100
1102
1101
return 0 ;
1103
1102
}
@@ -1173,17 +1172,15 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len,
1173
1172
struct rds_info_iterator * iter ,
1174
1173
struct rds_info_lengths * lens )
1175
1174
{
1176
- struct rds_net * rns ;
1177
1175
struct rds_sock * rs ;
1178
1176
struct rds_incoming * inc ;
1179
1177
unsigned int total = 0 ;
1180
1178
1181
1179
len /= sizeof (struct rds_info_message );
1182
1180
1183
- rns = rds_ns (sock_net (sock -> sk ));
1184
- mutex_lock (& rns -> rns_sock_lock );
1181
+ spin_lock_bh (& rds_sock_lock );
1185
1182
1186
- list_for_each_entry (rs , & rns -> rns_sock_list , rs_item ) {
1183
+ list_for_each_entry (rs , & rds_sock_list , rs_item ) {
1187
1184
(void )rds_rs_to_sk (rs );
1188
1185
read_lock (& rs -> rs_recv_lock );
1189
1186
@@ -1200,7 +1197,7 @@ static void rds_sock_inc_info(struct socket *sock, unsigned int len,
1200
1197
read_unlock (& rs -> rs_recv_lock );
1201
1198
}
1202
1199
1203
- mutex_unlock ( & rns -> rns_sock_lock );
1200
+ spin_unlock_bh ( & rds_sock_lock );
1204
1201
1205
1202
lens -> nr = total ;
1206
1203
lens -> each = sizeof (struct rds_info_message );
@@ -1211,17 +1208,15 @@ static void rds6_sock_inc_info(struct socket *sock, unsigned int len,
1211
1208
struct rds_info_iterator * iter ,
1212
1209
struct rds_info_lengths * lens )
1213
1210
{
1214
- struct rds_net * rns ;
1215
1211
struct rds_sock * rs ;
1216
1212
struct rds_incoming * inc ;
1217
1213
unsigned int total = 0 ;
1218
1214
1219
1215
len /= sizeof (struct rds6_info_message );
1220
1216
1221
- rns = rds_ns (sock_net (sock -> sk ));
1222
- mutex_lock (& rns -> rns_sock_lock );
1217
+ spin_lock_bh (& rds_sock_lock );
1223
1218
1224
- list_for_each_entry (rs , & rns -> rns_sock_list , rs_item ) {
1219
+ list_for_each_entry (rs , & rds_sock_list , rs_item ) {
1225
1220
read_lock (& rs -> rs_recv_lock );
1226
1221
1227
1222
/* XXX too lazy to maintain counts.. */
@@ -1235,7 +1230,7 @@ static void rds6_sock_inc_info(struct socket *sock, unsigned int len,
1235
1230
read_unlock (& rs -> rs_recv_lock );
1236
1231
}
1237
1232
1238
- mutex_unlock ( & rns -> rns_sock_lock );
1233
+ spin_unlock_bh ( & rds_sock_lock );
1239
1234
1240
1235
lens -> nr = total ;
1241
1236
lens -> each = sizeof (struct rds6_info_message );
@@ -1254,26 +1249,16 @@ static void rds_sock_info(struct socket *sock, unsigned int len,
1254
1249
struct rds_info_lengths * lens )
1255
1250
{
1256
1251
struct rds_info_socket sinfo ;
1257
- struct rds_net * rns ;
1258
- u32 sock_count ;
1259
1252
struct rds_sock * rs ;
1260
1253
1261
1254
len /= sizeof (struct rds_info_socket );
1262
1255
1263
- rns = rds_ns (sock_net (sock -> sk ));
1264
- mutex_lock (& rns -> rns_sock_lock );
1256
+ spin_lock_bh (& rds_sock_lock );
1265
1257
1266
- if (len < rns -> rns_sock_count ) {
1267
- sock_count = rns -> rns_sock_count ;
1258
+ if (len < rds_sock_count )
1268
1259
goto out ;
1269
- } else {
1270
- sock_count = 0 ;
1271
- }
1272
1260
1273
- list_for_each_entry (rs , & rns -> rns_sock_list , rs_item ) {
1274
- if (!ipv6_addr_any (& rs -> rs_bound_addr ) &&
1275
- !ipv6_addr_v4mapped (& rs -> rs_bound_addr ))
1276
- continue ;
1261
+ list_for_each_entry (rs , & rds_sock_list , rs_item ) {
1277
1262
sinfo .sndbuf = rds_sk_sndbuf (rs );
1278
1263
sinfo .rcvbuf = rds_sk_rcvbuf (rs );
1279
1264
sinfo .bound_addr = rs -> rs_bound_addr_v4 ;
@@ -1288,14 +1273,13 @@ static void rds_sock_info(struct socket *sock, unsigned int len,
1288
1273
sinfo .cong = -1 ;
1289
1274
1290
1275
rds_info_copy (iter , & sinfo , sizeof (sinfo ));
1291
- sock_count ++ ;
1292
1276
}
1293
1277
1294
1278
out :
1295
- lens -> nr = sock_count ;
1279
+ lens -> nr = rds_sock_count ;
1296
1280
lens -> each = sizeof (struct rds_info_socket );
1297
1281
1298
- mutex_unlock ( & rns -> rns_sock_lock );
1282
+ spin_unlock_bh ( & rds_sock_lock );
1299
1283
}
1300
1284
1301
1285
#if IS_ENABLED (CONFIG_IPV6 )
@@ -1304,18 +1288,16 @@ static void rds6_sock_info(struct socket *sock, unsigned int len,
1304
1288
struct rds_info_lengths * lens )
1305
1289
{
1306
1290
struct rds6_info_socket sinfo6 ;
1307
- struct rds_net * rns ;
1308
1291
struct rds_sock * rs ;
1309
1292
1310
1293
len /= sizeof (struct rds6_info_socket );
1311
1294
1312
- rns = rds_ns (sock_net (sock -> sk ));
1313
- mutex_lock (& rns -> rns_sock_lock );
1295
+ spin_lock_bh (& rds_sock_lock );
1314
1296
1315
- if (len < rns -> rns_sock_count )
1297
+ if (len < rds_sock_count )
1316
1298
goto out ;
1317
1299
1318
- list_for_each_entry (rs , & rns -> rns_sock_list , rs_item ) {
1300
+ list_for_each_entry (rs , & rds_sock_list , rs_item ) {
1319
1301
sinfo6 .sndbuf = rds_sk_sndbuf (rs );
1320
1302
sinfo6 .rcvbuf = rds_sk_rcvbuf (rs );
1321
1303
sinfo6 .bound_addr = rs -> rs_bound_addr ;
@@ -1333,10 +1315,10 @@ static void rds6_sock_info(struct socket *sock, unsigned int len,
1333
1315
}
1334
1316
1335
1317
out :
1336
- lens -> nr = rns -> rns_sock_count ;
1318
+ lens -> nr = rds_sock_count ;
1337
1319
lens -> each = sizeof (struct rds6_info_socket );
1338
- mutex_unlock (& rns -> rns_sock_lock );
1339
1320
1321
+ spin_unlock_bh (& rds_sock_lock );
1340
1322
}
1341
1323
#endif
1342
1324
@@ -1446,7 +1428,6 @@ static void __exit rds_exit(void)
1446
1428
rds_cong_monitor_free ();
1447
1429
sock_unregister (rds_family_ops .family );
1448
1430
proto_unregister (& rds_proto );
1449
- rds_unreg_pernet ();
1450
1431
rds_conn_exit ();
1451
1432
rds_cong_exit ();
1452
1433
rds_sysctl_exit ();
@@ -1477,18 +1458,16 @@ static int __init rds_init(void)
1477
1458
rds_rs_buf_info_slab = kmem_cache_create ("rds_rs_buf_info" ,
1478
1459
sizeof (struct rs_buf_info ),
1479
1460
0 , SLAB_HWCACHE_ALIGN , NULL );
1480
- if (!rds_rs_buf_info_slab )
1481
- return - ENOMEM ;
1482
-
1483
- ret = rds_reg_pernet ();
1484
- if (ret )
1485
- goto out_slab ;
1461
+ if (!rds_rs_buf_info_slab ) {
1462
+ ret = - ENOMEM ;
1463
+ goto out ;
1464
+ }
1486
1465
1487
1466
rds_bind_lock_init ();
1488
1467
1489
1468
ret = rds_conn_init ();
1490
1469
if (ret )
1491
- goto out_net ;
1470
+ goto out_slab ;
1492
1471
ret = rds_threads_init ();
1493
1472
if (ret )
1494
1473
goto out_conn ;
@@ -1532,12 +1511,8 @@ static int __init rds_init(void)
1532
1511
out_conn :
1533
1512
rds_conn_exit ();
1534
1513
rds_page_exit ();
1535
- out_net :
1536
- rds_unreg_pernet ();
1537
-
1538
1514
out_slab :
1539
1515
kmem_cache_destroy (rds_rs_buf_info_slab );
1540
-
1541
1516
out :
1542
1517
return ret ;
1543
1518
}
0 commit comments