diff options
author | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-02-18 10:02:29 -0500 |
---|---|---|
committer | Trond Myklebust <trond.myklebust@hammerspace.com> | 2019-02-20 15:14:21 -0500 |
commit | a1231fda7e944adf37d8368b2e182041a39ea1ca (patch) | |
tree | 82eb1c7fa4acc00f7a6d2ce06dca07ac44666719 /net/sunrpc/xprtsock.c | |
parent | e9acf2105fdba95953e786612243a4a3a1d0b166 (diff) |
SUNRPC: Set memalloc_nofs_save() on all rpciod/xprtiod jobs
Set memalloc_nofs_save() on all the rpciod/xprtiod jobs so that we
ensure memory allocations for asynchronous rpc calls don't ever end
up recursing back to the NFS layer for memory reclaim.
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
Diffstat (limited to 'net/sunrpc/xprtsock.c')
-rw-r--r-- | net/sunrpc/xprtsock.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/net/sunrpc/xprtsock.c b/net/sunrpc/xprtsock.c index 7754aa3e434f..f5d7dcd9e8d9 100644 --- a/net/sunrpc/xprtsock.c +++ b/net/sunrpc/xprtsock.c | |||
@@ -50,6 +50,7 @@ | |||
50 | #include <linux/bvec.h> | 50 | #include <linux/bvec.h> |
51 | #include <linux/highmem.h> | 51 | #include <linux/highmem.h> |
52 | #include <linux/uio.h> | 52 | #include <linux/uio.h> |
53 | #include <linux/sched/mm.h> | ||
53 | 54 | ||
54 | #include <trace/events/sunrpc.h> | 55 | #include <trace/events/sunrpc.h> |
55 | 56 | ||
@@ -680,7 +681,10 @@ static void xs_stream_data_receive_workfn(struct work_struct *work) | |||
680 | { | 681 | { |
681 | struct sock_xprt *transport = | 682 | struct sock_xprt *transport = |
682 | container_of(work, struct sock_xprt, recv_worker); | 683 | container_of(work, struct sock_xprt, recv_worker); |
684 | unsigned int pflags = memalloc_nofs_save(); | ||
685 | |||
683 | xs_stream_data_receive(transport); | 686 | xs_stream_data_receive(transport); |
687 | memalloc_nofs_restore(pflags); | ||
684 | } | 688 | } |
685 | 689 | ||
686 | static void | 690 | static void |
@@ -1378,7 +1382,10 @@ static void xs_udp_data_receive_workfn(struct work_struct *work) | |||
1378 | { | 1382 | { |
1379 | struct sock_xprt *transport = | 1383 | struct sock_xprt *transport = |
1380 | container_of(work, struct sock_xprt, recv_worker); | 1384 | container_of(work, struct sock_xprt, recv_worker); |
1385 | unsigned int pflags = memalloc_nofs_save(); | ||
1386 | |||
1381 | xs_udp_data_receive(transport); | 1387 | xs_udp_data_receive(transport); |
1388 | memalloc_nofs_restore(pflags); | ||
1382 | } | 1389 | } |
1383 | 1390 | ||
1384 | /** | 1391 | /** |
@@ -1869,7 +1876,6 @@ static int xs_local_finish_connecting(struct rpc_xprt *xprt, | |||
1869 | sk->sk_write_space = xs_udp_write_space; | 1876 | sk->sk_write_space = xs_udp_write_space; |
1870 | sock_set_flag(sk, SOCK_FASYNC); | 1877 | sock_set_flag(sk, SOCK_FASYNC); |
1871 | sk->sk_error_report = xs_error_report; | 1878 | sk->sk_error_report = xs_error_report; |
1872 | sk->sk_allocation = GFP_NOIO; | ||
1873 | 1879 | ||
1874 | xprt_clear_connected(xprt); | 1880 | xprt_clear_connected(xprt); |
1875 | 1881 | ||
@@ -2057,7 +2063,6 @@ static void xs_udp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | |||
2057 | sk->sk_data_ready = xs_data_ready; | 2063 | sk->sk_data_ready = xs_data_ready; |
2058 | sk->sk_write_space = xs_udp_write_space; | 2064 | sk->sk_write_space = xs_udp_write_space; |
2059 | sock_set_flag(sk, SOCK_FASYNC); | 2065 | sock_set_flag(sk, SOCK_FASYNC); |
2060 | sk->sk_allocation = GFP_NOIO; | ||
2061 | 2066 | ||
2062 | xprt_set_connected(xprt); | 2067 | xprt_set_connected(xprt); |
2063 | 2068 | ||
@@ -2220,7 +2225,6 @@ static int xs_tcp_finish_connecting(struct rpc_xprt *xprt, struct socket *sock) | |||
2220 | sk->sk_write_space = xs_tcp_write_space; | 2225 | sk->sk_write_space = xs_tcp_write_space; |
2221 | sock_set_flag(sk, SOCK_FASYNC); | 2226 | sock_set_flag(sk, SOCK_FASYNC); |
2222 | sk->sk_error_report = xs_error_report; | 2227 | sk->sk_error_report = xs_error_report; |
2223 | sk->sk_allocation = GFP_NOIO; | ||
2224 | 2228 | ||
2225 | /* socket options */ | 2229 | /* socket options */ |
2226 | sock_reset_flag(sk, SOCK_LINGER); | 2230 | sock_reset_flag(sk, SOCK_LINGER); |