aboutsummaryrefslogtreecommitdiff
path: root/fs/dlm
diff options
context:
space:
mode:
authorBenjamin Coddington <[email protected]>2022-12-16 07:45:27 -0500
committerJakub Kicinski <[email protected]>2022-12-19 17:28:49 -0800
commit98123866fcf3fe95a0c1b198ef122dfdbd351916 (patch)
treebe2cbfb90c15868dfd2f3b29216109733055299b /fs/dlm
parentfb87bd47516d9a26b6d549231aa743b20fd4a569 (diff)
Treewide: Stop corrupting socket's task_frag
Since moving to memalloc_nofs_save/restore, SUNRPC has stopped setting the GFP_NOIO flag on sk_allocation which the networking system uses to decide when it is safe to use current->task_frag. The results of this are unexpected corruption in task_frag when SUNRPC is involved in memory reclaim. The corruption can be seen in crashes, but the root cause is often difficult to ascertain as a crashing machine's stack trace will have no evidence of being near NFS or SUNRPC code. I believe this problem to be much more pervasive than reports to the community may indicate. Fix this by having kernel users of sockets that may corrupt task_frag due to reclaim set sk_use_task_frag = false. Preemptively correcting this situation for users that still set sk_allocation allows them to convert to memalloc_nofs_save/restore without the same unexpected corruptions that are sure to follow, unlikely to show up in testing, and difficult to bisect. CC: Philipp Reisner <[email protected]> CC: Lars Ellenberg <[email protected]> CC: "Christoph Böhmwalder" <[email protected]> CC: Jens Axboe <[email protected]> CC: Josef Bacik <[email protected]> CC: Keith Busch <[email protected]> CC: Christoph Hellwig <[email protected]> CC: Sagi Grimberg <[email protected]> CC: Lee Duncan <[email protected]> CC: Chris Leech <[email protected]> CC: Mike Christie <[email protected]> CC: "James E.J. Bottomley" <[email protected]> CC: "Martin K. Petersen" <[email protected]> CC: Valentina Manea <[email protected]> CC: Shuah Khan <[email protected]> CC: Greg Kroah-Hartman <[email protected]> CC: David Howells <[email protected]> CC: Marc Dionne <[email protected]> CC: Steve French <[email protected]> CC: Christine Caulfield <[email protected]> CC: David Teigland <[email protected]> CC: Mark Fasheh <[email protected]> CC: Joel Becker <[email protected]> CC: Joseph Qi <[email protected]> CC: Eric Van Hensbergen <[email protected]> CC: Latchesar Ionkov <[email protected]> CC: Dominique Martinet <[email protected]> CC: Ilya Dryomov <[email protected]> CC: Xiubo Li <[email protected]> CC: Chuck Lever <[email protected]> CC: Jeff Layton <[email protected]> CC: Trond Myklebust <[email protected]> CC: Anna Schumaker <[email protected]> CC: Steffen Klassert <[email protected]> CC: Herbert Xu <[email protected]> Suggested-by: Guillaume Nault <[email protected]> Signed-off-by: Benjamin Coddington <[email protected]> Reviewed-by: Guillaume Nault <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]>
Diffstat (limited to 'fs/dlm')
-rw-r--r--fs/dlm/lowcomms.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/fs/dlm/lowcomms.c b/fs/dlm/lowcomms.c
index 8b80ca0cd65f..4450721ec83c 100644
--- a/fs/dlm/lowcomms.c
+++ b/fs/dlm/lowcomms.c
@@ -645,6 +645,7 @@ static void add_sock(struct socket *sock, struct connection *con)
if (dlm_config.ci_protocol == DLM_PROTO_SCTP)
sk->sk_state_change = lowcomms_state_change;
sk->sk_allocation = GFP_NOFS;
+ sk->sk_use_task_frag = false;
sk->sk_error_report = lowcomms_error_report;
release_sock(sk);
}
@@ -1769,6 +1770,7 @@ static int dlm_listen_for_all(void)
listen_con.sock = sock;
sock->sk->sk_allocation = GFP_NOFS;
+ sock->sk->sk_use_task_frag = false;
sock->sk->sk_data_ready = lowcomms_listen_data_ready;
release_sock(sock->sk);