Received: by 2002:a05:6512:3d0e:0:0:0:0 with SMTP id d14csp13599lfv; Tue, 12 Apr 2022 15:17:21 -0700 (PDT) X-Google-Smtp-Source: ABdhPJxNeXFVGwqatkm4+WTib2Ik2OI9gVmDozv3SIFP3sRUMBCR4r4Jp3UE+F+ZBDLJpHWspEyz X-Received: by 2002:a05:6a00:1a90:b0:4fa:9400:afaf with SMTP id e16-20020a056a001a9000b004fa9400afafmr39450690pfv.82.1649801841475; Tue, 12 Apr 2022 15:17:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1649801841; cv=none; d=google.com; s=arc-20160816; b=mp6NZJwEdIGEBfO1qM8lLvpxLIo9VqBh0BMcvJ9oLY1r0nv+W8opOwPgcK4/ZuUolX jwgLOpuNJUwEsxPJo1IEGfMeLTt18Pf6u6Ed2xCvjFEKqWKGalWxb+6O8ZQJp/hq4skY Q9paRt9n6X3AkmewoCm0x1zqMO7duyjq6cb2UZpVKiXPmVuNSFCu2HBIIieV4kj4lZdD ymqdrw82XCDvCixwfbTLSZdsBhcRYFHw1vKDFGtYsqob7Zz/YwEtNZdyJZ5rME+HUtPp NG+tsfXIyXxHp8hF76l4s1Q3ky7hzW//16FonKxNrNzgWaFA6VmHxqABO893iE8PAf38 H8nA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=7DDhsd/eQLsRW3Ym4tUysdSTtI3q6aM66xit5wN+oJ4=; b=Dq9LNg11VC5gF3EnYkd61aFpalP7asL2ov6uBWjuwCfYY6Xp1eMbxB0Y6T3+MmJB0O whqhqswsJjxq8yb/4VcngeXpuXNs/uRcFC+Wo+Qvjco7IC18ro+Mf51UqnEFHF9x6i+8 kkcur7JeOjPgzvTovKXSk072Ft765ILRucs/e7cgWgQ9YjrAh32XPI9UWN62BFEGPJOL 9P9xSZPv0+CJnTRsvDYvdQobBmreTnog6zwSxHF3IA8dQN6GxLssHvJpDMUJNFrh7qVV PyjfdwZIWaYphcJrBXKR3C5992vVkXzDTw3yX5hte4y0p4N3dcVMmR8EFtDfQPx2T7qj FGvQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=WISlkggc; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id f18-20020a170902ab9200b00153b94147e7si5847897plr.157.2022.04.12.15.17.21 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 12 Apr 2022 15:17:21 -0700 (PDT) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linuxfoundation.org header.s=korg header.b=WISlkggc; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linuxfoundation.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 24BADCFBB5; Tue, 12 Apr 2022 13:59:10 -0700 (PDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1377507AbiDLHuN (ORCPT + 99 others); Tue, 12 Apr 2022 03:50:13 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59386 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1351469AbiDLHUY (ORCPT ); Tue, 12 Apr 2022 03:20:24 -0400 Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 920C628E28; Mon, 11 Apr 2022 23:59:37 -0700 (PDT) Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D11C8615BB; Tue, 12 Apr 2022 06:59:36 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id D8F2EC385A1; Tue, 12 Apr 2022 06:59:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=linuxfoundation.org; s=korg; t=1649746776; bh=hZRak8zB8UWPBxxT//igy3oc37r7YLVaBqEBOxrUdtc=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WISlkggcuVESbQEOT29xZc82Uu2b59fbnzGkC0SbnvpO4Y2hk13ktm4pN7M8/hTA5 hlNUmYH3LjgyRZXmJJqyHtLkpD88IgWUYgHh7ZJhvWmkQOaFX831JAj2rxmjl1Q1Aa DSiStbkDLZc+nBUIia2qkYr0MfUs7tQerX5qogoU= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Trond Myklebust , Sasha Levin Subject: [PATCH 5.16 127/285] NFSv4: Protect the state recovery thread against direct reclaim Date: Tue, 12 Apr 2022 08:29:44 +0200 Message-Id: <20220412062947.331674049@linuxfoundation.org> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20220412062943.670770901@linuxfoundation.org> References: <20220412062943.670770901@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Trond Myklebust [ Upstream commit 3e17898aca293a24dae757a440a50aa63ca29671 ] If memory allocation triggers a direct reclaim from the state recovery thread, then we can deadlock. Use memalloc_nofs_save/restore to ensure that doesn't happen. Signed-off-by: Trond Myklebust Signed-off-by: Sasha Levin --- fs/nfs/nfs4state.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c index 499bef9fe118..94f1876afab2 100644 --- a/fs/nfs/nfs4state.c +++ b/fs/nfs/nfs4state.c @@ -49,6 +49,7 @@ #include #include #include +#include #include @@ -2560,9 +2561,17 @@ static void nfs4_layoutreturn_any_run(struct nfs_client *clp) static void nfs4_state_manager(struct nfs_client *clp) { + unsigned int memflags; int status = 0; const char *section = "", *section_sep = ""; + /* + * State recovery can deadlock if the direct reclaim code tries + * start NFS writeback. So ensure memory allocations are all + * GFP_NOFS. + */ + memflags = memalloc_nofs_save(); + /* Ensure exclusive access to NFSv4 state */ do { trace_nfs4_state_mgr(clp); @@ -2657,6 +2666,7 @@ static void nfs4_state_manager(struct nfs_client *clp) clear_bit(NFS4CLNT_RECLAIM_NOGRACE, &clp->cl_state); } + memalloc_nofs_restore(memflags); nfs4_end_drain_session(clp); nfs4_clear_state_manager_bit(clp); @@ -2674,6 +2684,7 @@ static void nfs4_state_manager(struct nfs_client *clp) return; if (test_and_set_bit(NFS4CLNT_MANAGER_RUNNING, &clp->cl_state) != 0) return; + memflags = memalloc_nofs_save(); } while (refcount_read(&clp->cl_count) > 1 && !signalled()); goto out_drain; @@ -2686,6 +2697,7 @@ static void nfs4_state_manager(struct nfs_client *clp) clp->cl_hostname, -status); ssleep(1); out_drain: + memalloc_nofs_restore(memflags); nfs4_end_drain_session(clp); nfs4_clear_state_manager_bit(clp); } -- 2.35.1