From patchwork Tue May 16 06:38:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kefeng Wang X-Patchwork-Id: 13242581 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 55ED8C77B75 for ; Tue, 16 May 2023 06:21:49 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 5C245280009; Tue, 16 May 2023 02:21:42 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 54A8E280008; Tue, 16 May 2023 02:21:42 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2B5E2280009; Tue, 16 May 2023 02:21:42 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0012.hostedemail.com [216.40.44.12]) by kanga.kvack.org (Postfix) with ESMTP id F3AF7280005 for ; Tue, 16 May 2023 02:21:41 -0400 (EDT) Received: from smtpin25.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id AF4181C5EC8 for ; Tue, 16 May 2023 06:21:41 +0000 (UTC) X-FDA: 80795122002.25.4C6373B Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by imf06.hostedemail.com (Postfix) with ESMTP id 4B40F180010 for ; Tue, 16 May 2023 06:21:38 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=none; spf=pass (imf06.hostedemail.com: domain of wangkefeng.wang@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=wangkefeng.wang@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684218100; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=Vvb+Fq9FybwwftpVHRJbU0d8Vr60eDCdMo44I6empNk=; b=lGJVHhq1XLVuu2NaTrIMw+bYQt/A5W88pJ4YonGlgAg/zaQEidnOX2eXC+hmzV2cOZmALL 6joqPKu+klJXWOkpHFCGW1r74cM1rPkS+cRad1rh10SgLLZmMu+f2NFAuRrun/edV25EcZ R99HJjWRbX30duZZaiWjxLwhbKUqsTk= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684218100; a=rsa-sha256; cv=none; b=650t5O0+ghcSrCHwtYd8KNfkYLMFuwGCaGsYy+y4q4/2x18DeXz1ZoyYAwu2PWjpgszOtM LpHV3JRwdGaa5azFrr/gaewnaxwTOKNPGbu9OLpUjgLKC2FgDRCQAtkEjFIzxOTgQZ2Av7 5O35fLjAmlUv/OMQAzFsBoBK1PzTNZY= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=none; spf=pass (imf06.hostedemail.com: domain of wangkefeng.wang@huawei.com designates 45.249.212.187 as permitted sender) smtp.mailfrom=wangkefeng.wang@huawei.com; dmarc=pass (policy=quarantine) header.from=huawei.com Received: from dggpemm500001.china.huawei.com (unknown [172.30.72.56]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4QL5cY0STrzqSHD; Tue, 16 May 2023 14:17:17 +0800 (CST) Received: from localhost.localdomain.localdomain (10.175.113.25) by dggpemm500001.china.huawei.com (7.185.36.107) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 16 May 2023 14:21:35 +0800 From: Kefeng Wang To: Andrew Morton , Mike Rapoport , CC: David Hildenbrand , Oscar Salvador , "Rafael J. Wysocki" , Pavel Machek , Len Brown , Luis Chamberlain , Kees Cook , Iurii Zaikin , , , , , Kefeng Wang Subject: [PATCH v2 10/13] mm: page_alloc: move pm_* function into power Date: Tue, 16 May 2023 14:38:18 +0800 Message-ID: <20230516063821.121844-11-wangkefeng.wang@huawei.com> X-Mailer: git-send-email 2.35.3 In-Reply-To: <20230516063821.121844-1-wangkefeng.wang@huawei.com> References: <20230516063821.121844-1-wangkefeng.wang@huawei.com> MIME-Version: 1.0 X-Originating-IP: [10.175.113.25] X-ClientProxiedBy: dggems705-chm.china.huawei.com (10.3.19.182) To dggpemm500001.china.huawei.com (7.185.36.107) X-CFilter-Loop: Reflected X-Stat-Signature: kbqr3c1npjw6ij43s7xa8ejfcnxx4heo X-Rspamd-Server: rspam03 X-Rspam-User: X-Rspamd-Queue-Id: 4B40F180010 X-HE-Tag: 1684218098-137985 X-HE-Meta: U2FsdGVkX18UCfqqnEYFTTofCNoWdxFuZSjTGomiiM+bXDtB4LAa+1yu7JX7trFmK4ZUxqUrdHButMJVYUL11Jj+zLVk+DIN+HUOQcpnYI2zY8zJNnaCvmfkcG5srRDL0T8X7DrhS92yYbOWXosv4mUCx9Cy4X300z8u5HvC/nX1b/vUQNbSj/6vBaq7DPXrRkRRnmsm2dn0Li0yToLBb/H50JCLyrPd43HJ3kqwNHo8Zi/pZbuQYUsUpTgY/HJvBpM/SWegvznFQJi3dDXosKO/cD3oSRVecnNUm9roc2af4n/5OTRbxUHuWEBSF3sfbNVNsxiMcdpLAAGE5QL/Q2Zvy+t2kX2YGbNRQwCJZhJgqLi8H7K38p25ThQzWwdcX+yK7pl/KQoo/iI2+y1whDG9BHBSwMnrvFVnUq5+eVpnb+p56qUmZ26Yn1qKKiHCQCGfWQ0Sy7mNe4k+92mxDOU872O/lvyiKrA+upviyKqroR4KRvUb9vxeYbIE8jr1o9kC47dErXJaD5hm2LCGw3q/aAigcLBXAdfwz7w+N5t0/NrNT5a7M1iSlK6y7MHoLgSabun65liMfAjVL4ql29H3yBJELBp0GNdUT8UPqNJnPnhY9sRY4ZCGO0dAXnbvqDPA1UAJphSDgMCV2CqC7O3kQ3J9xwhXup4ohnYjXrxbhqqd2zZJSm3JJO7IMKPSAzxlA8NJ1TRmL4sFrl33PQiLNXAtpZuLyH1xSX2XNcbDyBer2u/wVM7QXyMemGq/Elj3VgaYgMFaN8EbI3jFX12onI0O+el5DAfdvRAvRpmtoDNOc0U2mwvUPCP0XpeHC455z1lOQ1HJV0S3Sr2iZNpHiFdwnsxZtGQL9J1J6kK9hkcdSQHo/rQ9lj+Uh9ARzoWjVmDxFXU5QG3WeAYSxLfEAjui8sT6esCDdkaa45FiHy6D9KDgZ7m1reR4pfY60a6Kdd/pLYAhjLWzWer d+COLnq9 ZrV3LTgpIrE6DS1fsl/xmfNfsuLNLPKUgumZZoBnfJIOvhM+Hq7snn9onbXV4Sqf8XRJQHfQAuQlgs8B61W+j6PL1K4KoL5PQdw8OnHaiKwF92mFyRKS71UW7ZTKJuHzFesNJyA7QyPG7qcUxzZL+N+zV81EmLwAg7qlq9jgWkLMvfhD8U6ImbdUX/Ed+Gf+c9S7VK0OK2jFG8VA= X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: pm_restrict_gfp_mask()/pm_restore_gfp_mask() only used in power, let's move them out of page_alloc.c. Adding a general gfp_has_io_fs() function which return true if gfp with both __GFP_IO and __GFP_FS flags, then use it inside of pm_suspended_storage(), also the pm_suspended_storage() is moved into suspend.h. Signed-off-by: Kefeng Wang --- include/linux/gfp.h | 15 ++++----------- include/linux/suspend.h | 6 ++++++ kernel/power/main.c | 27 +++++++++++++++++++++++++++ kernel/power/power.h | 5 +++++ mm/page_alloc.c | 38 -------------------------------------- mm/swapfile.c | 1 + 6 files changed, 43 insertions(+), 49 deletions(-) diff --git a/include/linux/gfp.h b/include/linux/gfp.h index ed8cb537c6a7..665f06675c83 100644 --- a/include/linux/gfp.h +++ b/include/linux/gfp.h @@ -338,19 +338,12 @@ extern gfp_t gfp_allowed_mask; /* Returns true if the gfp_mask allows use of ALLOC_NO_WATERMARK */ bool gfp_pfmemalloc_allowed(gfp_t gfp_mask); -extern void pm_restrict_gfp_mask(void); -extern void pm_restore_gfp_mask(void); - -extern gfp_t vma_thp_gfp_mask(struct vm_area_struct *vma); - -#ifdef CONFIG_PM_SLEEP -extern bool pm_suspended_storage(void); -#else -static inline bool pm_suspended_storage(void) +static inline bool gfp_has_io_fs(gfp_t gfp) { - return false; + return (gfp & (__GFP_IO | __GFP_FS)) == (__GFP_IO | __GFP_FS); } -#endif /* CONFIG_PM_SLEEP */ + +extern gfp_t vma_thp_gfp_mask(struct vm_area_struct *vma); #ifdef CONFIG_CONTIG_ALLOC /* The below functions must be run on a range from a single zone. */ diff --git a/include/linux/suspend.h b/include/linux/suspend.h index 3950a7bf33ae..76923051c03d 100644 --- a/include/linux/suspend.h +++ b/include/linux/suspend.h @@ -502,6 +502,11 @@ extern void pm_report_max_hw_sleep(u64 t); extern bool events_check_enabled; extern suspend_state_t pm_suspend_target_state; +static inline bool pm_suspended_storage(void) +{ + return !gfp_has_io_fs(gfp_allowed_mask); +} + extern bool pm_wakeup_pending(void); extern void pm_system_wakeup(void); extern void pm_system_cancel_wakeup(void); @@ -535,6 +540,7 @@ static inline void ksys_sync_helper(void) {} #define pm_notifier(fn, pri) do { (void)(fn); } while (0) +static inline bool pm_suspended_storage(void) { return false; } static inline bool pm_wakeup_pending(void) { return false; } static inline void pm_system_wakeup(void) {} static inline void pm_wakeup_clear(bool reset) {} diff --git a/kernel/power/main.c b/kernel/power/main.c index 3113ec2f1db4..34fc8359145b 100644 --- a/kernel/power/main.c +++ b/kernel/power/main.c @@ -21,6 +21,33 @@ #include "power.h" #ifdef CONFIG_PM_SLEEP +/* + * The following functions are used by the suspend/hibernate code to temporarily + * change gfp_allowed_mask in order to avoid using I/O during memory allocations + * while devices are suspended. To avoid races with the suspend/hibernate code, + * they should always be called with system_transition_mutex held + * (gfp_allowed_mask also should only be modified with system_transition_mutex + * held, unless the suspend/hibernate code is guaranteed not to run in parallel + * with that modification). + */ +static gfp_t saved_gfp_mask; + +void pm_restore_gfp_mask(void) +{ + WARN_ON(!mutex_is_locked(&system_transition_mutex)); + if (saved_gfp_mask) { + gfp_allowed_mask = saved_gfp_mask; + saved_gfp_mask = 0; + } +} + +void pm_restrict_gfp_mask(void) +{ + WARN_ON(!mutex_is_locked(&system_transition_mutex)); + WARN_ON(saved_gfp_mask); + saved_gfp_mask = gfp_allowed_mask; + gfp_allowed_mask &= ~(__GFP_IO | __GFP_FS); +} unsigned int lock_system_sleep(void) { diff --git a/kernel/power/power.h b/kernel/power/power.h index b83c8d5e188d..ac14d1b463d1 100644 --- a/kernel/power/power.h +++ b/kernel/power/power.h @@ -216,6 +216,11 @@ static inline void suspend_test_finish(const char *label) {} /* kernel/power/main.c */ extern int pm_notifier_call_chain_robust(unsigned long val_up, unsigned long val_down); extern int pm_notifier_call_chain(unsigned long val); +void pm_restrict_gfp_mask(void); +void pm_restore_gfp_mask(void); +#else +static inline void pm_restrict_gfp_mask(void) {} +static inline void pm_restore_gfp_mask(void) {} #endif #ifdef CONFIG_HIGHMEM diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 71bfe72be045..2a95e095bb2a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -227,44 +227,6 @@ static inline void set_pcppage_migratetype(struct page *page, int migratetype) page->index = migratetype; } -#ifdef CONFIG_PM_SLEEP -/* - * The following functions are used by the suspend/hibernate code to temporarily - * change gfp_allowed_mask in order to avoid using I/O during memory allocations - * while devices are suspended. To avoid races with the suspend/hibernate code, - * they should always be called with system_transition_mutex held - * (gfp_allowed_mask also should only be modified with system_transition_mutex - * held, unless the suspend/hibernate code is guaranteed not to run in parallel - * with that modification). - */ - -static gfp_t saved_gfp_mask; - -void pm_restore_gfp_mask(void) -{ - WARN_ON(!mutex_is_locked(&system_transition_mutex)); - if (saved_gfp_mask) { - gfp_allowed_mask = saved_gfp_mask; - saved_gfp_mask = 0; - } -} - -void pm_restrict_gfp_mask(void) -{ - WARN_ON(!mutex_is_locked(&system_transition_mutex)); - WARN_ON(saved_gfp_mask); - saved_gfp_mask = gfp_allowed_mask; - gfp_allowed_mask &= ~(__GFP_IO | __GFP_FS); -} - -bool pm_suspended_storage(void) -{ - if ((gfp_allowed_mask & (__GFP_IO | __GFP_FS)) == (__GFP_IO | __GFP_FS)) - return false; - return true; -} -#endif /* CONFIG_PM_SLEEP */ - #ifdef CONFIG_HUGETLB_PAGE_SIZE_VARIABLE unsigned int pageblock_order __read_mostly; #endif diff --git a/mm/swapfile.c b/mm/swapfile.c index 274bbf797480..c74259001d5e 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -41,6 +41,7 @@ #include #include #include +#include #include #include