37
37
#include <linux/in.h>
38
38
#include <linux/ipv6.h>
39
39
#include <linux/poll.h>
40
+ #include <linux/sched/mm.h>
40
41
#include <net/sock.h>
41
42
42
43
#include "rds.h"
43
44
45
+ static bool rds_force_noio ;
46
+ module_param_named (force_noio , rds_force_noio , bool , 0444 );
47
+ MODULE_PARM_DESC (force_noio , "Force the use of GFP_NOIO (Y/N)" );
48
+
44
49
/* this is just used for stats gathering :/ */
45
50
static DEFINE_SPINLOCK (rds_sock_lock );
46
51
static unsigned long rds_sock_count ;
@@ -59,8 +64,12 @@ DECLARE_WAIT_QUEUE_HEAD(rds_poll_waitq);
59
64
static int rds_release (struct socket * sock )
60
65
{
61
66
struct sock * sk = sock -> sk ;
67
+ unsigned int noio_flags ;
62
68
struct rds_sock * rs ;
63
69
70
+ if (rds_force_noio )
71
+ noio_flags = memalloc_noio_save ();
72
+
64
73
if (!sk )
65
74
goto out ;
66
75
@@ -90,6 +99,8 @@ static int rds_release(struct socket *sock)
90
99
sock -> sk = NULL ;
91
100
sock_put (sk );
92
101
out :
102
+ if (rds_force_noio )
103
+ memalloc_noio_restore (noio_flags );
93
104
return 0 ;
94
105
}
95
106
@@ -214,9 +225,13 @@ static __poll_t rds_poll(struct file *file, struct socket *sock,
214
225
{
215
226
struct sock * sk = sock -> sk ;
216
227
struct rds_sock * rs = rds_sk_to_rs (sk );
228
+ unsigned int noio_flags ;
217
229
__poll_t mask = 0 ;
218
230
unsigned long flags ;
219
231
232
+ if (rds_force_noio )
233
+ noio_flags = memalloc_noio_save ();
234
+
220
235
poll_wait (file , sk_sleep (sk ), wait );
221
236
222
237
if (rs -> rs_seen_congestion )
@@ -249,6 +264,8 @@ static __poll_t rds_poll(struct file *file, struct socket *sock,
249
264
if (mask )
250
265
rs -> rs_seen_congestion = 0 ;
251
266
267
+ if (rds_force_noio )
268
+ memalloc_noio_restore (noio_flags );
252
269
return mask ;
253
270
}
254
271
@@ -293,9 +310,13 @@ static int rds_ioctl(struct socket *sock, unsigned int cmd, unsigned long arg)
293
310
static int rds_cancel_sent_to (struct rds_sock * rs , sockptr_t optval , int len )
294
311
{
295
312
struct sockaddr_in6 sin6 ;
313
+ unsigned int noio_flags ;
296
314
struct sockaddr_in sin ;
297
315
int ret = 0 ;
298
316
317
+ if (rds_force_noio )
318
+ noio_flags = memalloc_noio_save ();
319
+
299
320
/* racing with another thread binding seems ok here */
300
321
if (ipv6_addr_any (& rs -> rs_bound_addr )) {
301
322
ret = - ENOTCONN ; /* XXX not a great errno */
@@ -324,6 +345,8 @@ static int rds_cancel_sent_to(struct rds_sock *rs, sockptr_t optval, int len)
324
345
325
346
rds_send_drop_to (rs , & sin6 );
326
347
out :
348
+ if (rds_force_noio )
349
+ memalloc_noio_restore (noio_flags );
327
350
return ret ;
328
351
}
329
352
@@ -485,8 +508,12 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
485
508
{
486
509
struct rds_sock * rs = rds_sk_to_rs (sock -> sk );
487
510
int ret = - ENOPROTOOPT , len ;
511
+ unsigned int noio_flags ;
488
512
int trans ;
489
513
514
+ if (rds_force_noio )
515
+ noio_flags = memalloc_noio_save ();
516
+
490
517
if (level != SOL_RDS )
491
518
goto out ;
492
519
@@ -529,6 +556,8 @@ static int rds_getsockopt(struct socket *sock, int level, int optname,
529
556
}
530
557
531
558
out :
559
+ if (rds_force_noio )
560
+ memalloc_noio_restore (noio_flags );
532
561
return ret ;
533
562
534
563
}
@@ -538,12 +567,16 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
538
567
{
539
568
struct sock * sk = sock -> sk ;
540
569
struct sockaddr_in * sin ;
570
+ unsigned int noio_flags ;
541
571
struct rds_sock * rs = rds_sk_to_rs (sk );
542
572
int ret = 0 ;
543
573
544
574
if (addr_len < offsetofend (struct sockaddr , sa_family ))
545
575
return - EINVAL ;
546
576
577
+ if (rds_force_noio )
578
+ noio_flags = memalloc_noio_save ();
579
+
547
580
lock_sock (sk );
548
581
549
582
switch (uaddr -> sa_family ) {
@@ -626,6 +659,8 @@ static int rds_connect(struct socket *sock, struct sockaddr *uaddr,
626
659
}
627
660
628
661
release_sock (sk );
662
+ if (rds_force_noio )
663
+ memalloc_noio_restore (noio_flags );
629
664
return ret ;
630
665
}
631
666
@@ -697,16 +732,28 @@ static int __rds_create(struct socket *sock, struct sock *sk, int protocol)
697
732
static int rds_create (struct net * net , struct socket * sock , int protocol ,
698
733
int kern )
699
734
{
735
+ unsigned int noio_flags ;
700
736
struct sock * sk ;
737
+ int ret ;
701
738
702
739
if (sock -> type != SOCK_SEQPACKET || protocol )
703
740
return - ESOCKTNOSUPPORT ;
704
741
742
+ if (rds_force_noio )
743
+ noio_flags = memalloc_noio_save ();
744
+
705
745
sk = sk_alloc (net , AF_RDS , GFP_KERNEL , & rds_proto , kern );
706
- if (!sk )
707
- return - ENOMEM ;
746
+ if (!sk ) {
747
+ ret = - ENOMEM ;
748
+ goto out ;
749
+ }
708
750
709
- return __rds_create (sock , sk , protocol );
751
+ ret = __rds_create (sock , sk , protocol );
752
+ out :
753
+ if (rds_force_noio )
754
+ memalloc_noio_restore (noio_flags );
755
+
756
+ return ret ;
710
757
}
711
758
712
759
void rds_sock_addref (struct rds_sock * rs )
@@ -895,8 +942,12 @@ u32 rds_gen_num;
895
942
896
943
static int __init rds_init (void )
897
944
{
945
+ unsigned int noio_flags ;
898
946
int ret ;
899
947
948
+ if (rds_force_noio )
949
+ noio_flags = memalloc_noio_save ();
950
+
900
951
net_get_random_once (& rds_gen_num , sizeof (rds_gen_num ));
901
952
902
953
ret = rds_bind_lock_init ();
@@ -947,6 +998,8 @@ static int __init rds_init(void)
947
998
out_bind :
948
999
rds_bind_lock_destroy ();
949
1000
out :
1001
+ if (rds_force_noio )
1002
+ memalloc_noio_restore (noio_flags );
950
1003
return ret ;
951
1004
}
952
1005
module_init (rds_init );
0 commit comments