aboutsummaryrefslogtreecommitdiffstats
path: root/net/sunrpc/xprtsock.c
diff options
context:
space:
mode:
authorTrond Myklebust <trond.myklebust@hammerspace.com>2019-02-18 10:02:29 -0500
committerTrond Myklebust <trond.myklebust@hammerspace.com>2019-02-20 15:14:21 -0500
commita1231fda7e944adf37d8368b2e182041a39ea1ca (patch)
tree82eb1c7fa4acc00f7a6d2ce06dca07ac44666719 /net/sunrpc/xprtsock.c
parente9acf2105fdba95953e786612243a4a3a1d0b166 (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.c10
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
686static void 690static 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);