From patchwork Fri Mar 22 11:41:36 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Barry Song <21cnbao@gmail.com> X-Patchwork-Id: 13600000 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 96C2CC54E71 for ; Fri, 22 Mar 2024 11:47:55 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 2138A6B0082; Fri, 22 Mar 2024 07:47:55 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1C3826B0088; Fri, 22 Mar 2024 07:47:55 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 066446B0089; Fri, 22 Mar 2024 07:47:55 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id EAAD46B0082 for ; Fri, 22 Mar 2024 07:47:54 -0400 (EDT) Received: from smtpin27.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay10.hostedemail.com (Postfix) with ESMTP id C08FFC0880 for ; Fri, 22 Mar 2024 11:47:54 +0000 (UTC) X-FDA: 81924500868.27.6B1631C Received: from mail-oi1-f172.google.com (mail-oi1-f172.google.com [209.85.167.172]) by imf13.hostedemail.com (Postfix) with ESMTP id F368F2001F for ; Fri, 22 Mar 2024 11:47:52 +0000 (UTC) Authentication-Results: imf13.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="iR/pWCYK"; spf=pass (imf13.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.167.172 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1711108073; 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-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=Er48O4Qnw/EUunMAmDlsUPIFAnK22vDNUKWOK0xsOIM=; b=ir3LQGQBcTtDPsITpuh3APIJJNZ1sRe0FW/xvjU3GtE0x2fCrNX9GCe1dssHn7Rs1OPrW1 dWlQbDPtjfGlbuaU3iX7ByTcy1nIeF8svHsJLInGU15x+9V5oEmqWqP9guGp77az1ZjCGg TMvKOjBkIcnTkDhv8vKpgYFmQcsdiXs= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1711108073; a=rsa-sha256; cv=none; b=PEKHbjdSfRnLePW7qMBTsrZY774WwcSWCpdSnRpWDA8br2gShMRoXKlv05aAqjaf3+waRO Cx4PkUT2uWlImnHN/vgY2m4Lx5Z8yYTn5APSBQV2mxHwjUwUmseAhTswhQqvDB9YHmqnLB cIaDO+gc2u7SkQsLUBhjIZaTO8JGBHQ= ARC-Authentication-Results: i=1; imf13.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b="iR/pWCYK"; spf=pass (imf13.hostedemail.com: domain of 21cnbao@gmail.com designates 209.85.167.172 as permitted sender) smtp.mailfrom=21cnbao@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-oi1-f172.google.com with SMTP id 5614622812f47-3c3775ce48fso1252556b6e.2 for ; Fri, 22 Mar 2024 04:47:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711108072; x=1711712872; darn=kvack.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Er48O4Qnw/EUunMAmDlsUPIFAnK22vDNUKWOK0xsOIM=; b=iR/pWCYKQi1T1knnnTsvwwEanQ+nSzkQlNQoSAr1uguwW+fSYiQGyHTgyZvZVi2WL6 mKxq5DyJbw1KaZJLunaWggTD3idXQG8WXNFyV+G+NFPsUAsSysbgU/uEgpS6MN6FGN9R Zr3j5ACocfySlozhekYb+CIPLFz9IHT4edWMoBY7xQug6X4JtqEHNWXSNLEQHr7swsfn FP6tebZBQKbBMi3bPFkRJ9ud6rlUZ8dwDoMAmZCAtBfCLhZWTWBWQ7lOHZsjpofmbftt 47CZ6YxL0kSNKGB5Qyu0/BOJl30DkN1+pTRrNvCSsAeFZKgrWLe6j2f+2Zdu/wsE0Rkr f81g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711108072; x=1711712872; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=Er48O4Qnw/EUunMAmDlsUPIFAnK22vDNUKWOK0xsOIM=; b=MSx5CbFpLx0zpOVoxCVfWiOKEDLnV0Fu3r2VQXQPb1ig7sIPeE5t/H/6PacWVHBl4h 9qVBpoEsxWg81z1REZapG6HOMxHH4M3pNYqzeBpKd+ManBBqCUDzU2bltRKc+mbXZxrn mxZmhGa1KOA4kfweVeylccPNUL/2RmELAxz16PdDxDMu3/UWo6502em/QdPhBXYvorq9 qJNR/R0Hp161ekz961++dj8u9X73QBFgua6DDIlQfYuYHUcxLcl+rd+HJJbcBVdlSeFT MrqIMTa7UHFgSs7qsZovE6kS4/kJJMCbcYKYxZhwLG7cRpR24uL7Fk3/tL0xywXs3Yx/ Dmjw== X-Forwarded-Encrypted: i=1; AJvYcCU0Aw25KkvClbibhn8lmtcMa7YEpmhRispz4spMeUcSLi/XBhoQYe1R1kmYI78t3HQWOA/zLmoGpKaiBBdjfJ3u1Fc= X-Gm-Message-State: AOJu0YzJWRlUe6u6U4zHoX1NwqFcgMLgdRGof/y0xf5FCKLydmvu1DoB Jjuy7XqtavFfOGKS51acGvPnNFuTBlfDd0pTxswas06ZIE58ZDtjaZhtVJW/Sg4= X-Google-Smtp-Source: AGHT+IHT3XyeYHRIL8a0Z8tJiZ3oQR87871x0QA0EhqpJu9zrww0j75nZ+STSZ1bMkgrc8y/tSaOxA== X-Received: by 2002:a05:6a21:3384:b0:1a3:648e:dacf with SMTP id yy4-20020a056a21338400b001a3648edacfmr2854498pzb.35.1711107724129; Fri, 22 Mar 2024 04:42:04 -0700 (PDT) Received: from localhost.localdomain ([2407:7000:8942:5500:aaa1:59ff:fe57:eb97]) by smtp.gmail.com with ESMTPSA id p14-20020a170902e74e00b001d92a58330csm1700209plf.145.2024.03.22.04.41.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 22 Mar 2024 04:42:03 -0700 (PDT) From: Barry Song <21cnbao@gmail.com> To: catalin.marinas@arm.com, will@kernel.org, akpm@linux-foundation.org, hughd@google.com, linux-mm@kvack.org, linux-arm-kernel@lists.infradead.org Cc: chrisl@kernel.org, mark.rutland@arm.com, ryan.roberts@arm.com, steven.price@arm.com, david@redhat.com, willy@infradead.org, Barry Song , Kemeng Shi , Anshuman Khandual , Peter Collingbourne , Yosry Ahmed , Peter Xu , Lorenzo Stoakes , "Mike Rapoport (IBM)" , "Aneesh Kumar K.V" , Rick Edgecombe Subject: [PATCH 1/1] arm64: mm: swap: support THP_SWAP on hardware with MTE Date: Sat, 23 Mar 2024 00:41:36 +1300 Message-Id: <20240322114136.61386-2-21cnbao@gmail.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240322114136.61386-1-21cnbao@gmail.com> References: <20240322114136.61386-1-21cnbao@gmail.com> MIME-Version: 1.0 X-Rspamd-Queue-Id: F368F2001F X-Rspam-User: X-Stat-Signature: kfmnuk6kd3apy543rxzs3k84ccm39kh9 X-Rspamd-Server: rspam03 X-HE-Tag: 1711108072-33680 X-HE-Meta: U2FsdGVkX1/axNlVXt7VRB/4Bopfvbc8Ed2tW/za785dK1O/zoZsYLAP9cg9vtJV00aUog4hj2hpAGZlAPUFKlhLGVrXgAlADt7TAbtLdSU5naw1FK33quRYf+wKm9wvCPNY0IhEXyLmEnwGuvWZCIByXykHxjW4ElpOi4cCGOFzKYfMFfuROhZklzFa9L8jFWn5cIBK7z5hfxqbIeXfbcmyIV5zaaKgdbPKMcpdcJsvF7XB1mXxNfIZcqVkgdCvz0aB3iq0pcTSkxD0nr6+ET4jdzPuRRuU9PCVS3mvv9LiA58N/N+Rryh/Xx9FD35W/2CPFetERq1ezivkB8vDXeMwThk3pVnzV4K7JSLscAfm6vqgChlZSpmlwJCMQg9Os76B7GiE3R5dD6RC81NO9bXU36hmrd6xSLCTbqmWOJTyJV25FvmL96YZ4U2Q2HvRN277TsYbIYd6c0rXhGRyUjPdzqha5uzvHyYNb5CvZjfYnHcd6Lb9EBN8jaAQfKuM0xh8TcA9DK02LcfN0SRYIO5WNo1zXtdOSLFfwDdnjdYwFRL+XP5+KuC+5ebWhl7nX2u/jwSAKtUrX6FRnccOOeVXILQrygbyNIEJzdJyyWxInGzgm7wBI7ARMeVmRQtK9gofKcgMo0BpWK9u6HGuZ54vzmWJ0ALhvnGa7O1yk/+zoj/WKuEHaoJcozCS6pd/RdP6GJ3V7ZAbkQgqk4CP2gen5+YjInJ3pfNswVVLh3rLKb5DI7eEzBuhE3IY7qX9OKLB9VKnx8N7MjCwctGtsU9yattEb6qvv/5ZMt4I1gB4t7EbT9/R/ibZ8k6i1kL5JVykw1p9fQpCSnghnv/SKAC58wJG5roAurGFt+vF4IFTPrgmJB55B7Oqrw0gnWWeJ0LYho7I9+stVfXLNrW5x12IF+0kbWA8W1nJMCQhPaS1LwlLQ4/ue178S4V96WfeUtmztuP8KHXNAkGEeSp 0bQS0TYn Nlua+kK2n6avARfW724apy4quXLeO7N9bEnxrW1z8yfpVN5h7PudKuW3QVQM6I2FBy9mpUjfay36GlzJZmholUFmRfrWbjSabMlKMvC14yrPWHLJHn1WQ0y431DRdcFO7l0b4330yc4hsfu7QuuxCV7PVF7p7w9KVj35sYn+RaJTjVHLD7KQ3u+xUEdZfFDb2PnOy99W8s/yX7NoKxJp6UW/JSNIyYzZ76AVNnwoBPRm+/5bTmeobblp2RHZ3cqY4U1dGpRQ0PCQCR/EvwycKqMhoAG+8Ad8RtdJjtyDg8tFQZ6F9oHGq76Q0eJCZccc7s1yXHgpDpeR3D/t1/UnqQC9K+wmnxoNXeL8icivCyqS2YrioHdGabKUzLr4oaSy4Jo+BLNQCsHlAIXn08Z3JXF7jfAxRQz4mLyU72FdIOwranG0PTAGI8KX3vEQY1Pe2yvT0VwZ9QzpgwydYL3F62N2wiWeylFgb64vEqa+ldWBRpz0wRMd7vIU3bGMmfOUEcd4h1lN7rcF9mmXNriIyN+8kWgMO8RYGm8LuUBjGKGF+z6n42zE4kfdhFx7cVVU6ehG28030Hq5LGRErKQiNVWA0znUP80h46z7ni6dHHkdr3g4l0Z+XwJDwBGryclr8KpI5Qzj4eojE9EDFHxSw8KGgixxIG+8cvhP6UDagdJoddlW4dODu5gkpk6IoPTSDhbxYxa7B3THvWIpCjqOn40v4DuVOoVuidJsX6xzoqonzdk1h7LRul0Nu9dMcI6QlCHkOQyrDtpmKpB9lO7l60FNBceKjnSSAYpRfhNJAPiKS09r/r4Fp0IM4sDMFzHOTo5wNLgbLR3LMDR7nzsrdwwnuJeKehmpaMNmkIpd707ILiJ/t31F5eab8AvtCJM/0JbP0Hk5K6JnBKxM= 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: List-Subscribe: List-Unsubscribe: From: Barry Song Commit d0637c505f8a1 ("arm64: enable THP_SWAP for arm64") brings up THP_SWAP on ARM64, but it doesn't enable THP_SWP on hardware with MTE as the MTE code works with the assumption tags save/restore is always handling a folio with only one page. The limitation should be removed as more and more ARM64 SoCs have this feature. Co-existence of MTE and THP_SWAP becomes more and more important. This patch makes MTE tags saving support large folios, then we don't need to split large folios into base pages for swapping out on ARM64 SoCs with MTE any more. arch_prepare_to_swap() should take folio rather than page as parameter because we support THP swap-out as a whole. It saves tags for all pages in a large folio. As now we are restoring tags based-on folio, in arch_swap_restore(), we may increase some extra loops and early-exitings while refaulting a large folio which is still in swapcache in do_swap_page(). In case a large folio has nr pages, do_swap_page() will only set the PTE of the particular page which is causing the page fault. Thus do_swap_page() runs nr times, and each time, arch_swap_restore() will loop nr times for those subpages in the folio. So right now the algorithmic complexity becomes O(nr^2). Once we support mapping large folios in do_swap_page(), extra loops and early-exitings will decrease while not being completely removed as a large folio might get partially tagged in corner cases such as, 1. a large folio in swapcache can be partially unmapped, thus, MTE tags for the unmapped pages will be invalidated; 2. users might use mprotect() to set MTEs on a part of a large folio. arch_thp_swp_supported() is dropped since ARM64 MTE was the only one who needed it. Cc: Catalin Marinas Cc: Will Deacon Cc: Ryan Roberts Cc: Mark Rutland Cc: David Hildenbrand Cc: Kemeng Shi Cc: "Matthew Wilcox (Oracle)" Cc: Anshuman Khandual Cc: Peter Collingbourne Cc: Steven Price Cc: Yosry Ahmed Cc: Peter Xu Cc: Lorenzo Stoakes Cc: "Mike Rapoport (IBM)" Cc: Hugh Dickins CC: "Aneesh Kumar K.V" Cc: Rick Edgecombe Signed-off-by: Barry Song Reviewed-by: Steven Price Acked-by: Chris Li Reviewed-by: Ryan Roberts Acked-by: Catalin Marinas --- arch/arm64/include/asm/pgtable.h | 19 ++------------ arch/arm64/mm/mteswap.c | 45 ++++++++++++++++++++++++++++++++ include/linux/huge_mm.h | 12 --------- include/linux/pgtable.h | 2 +- mm/internal.h | 14 ++++++++++ mm/memory.c | 2 +- mm/page_io.c | 2 +- mm/shmem.c | 2 +- mm/swap_slots.c | 2 +- mm/swapfile.c | 2 +- 10 files changed, 67 insertions(+), 35 deletions(-) diff --git a/arch/arm64/include/asm/pgtable.h b/arch/arm64/include/asm/pgtable.h index afdd56d26ad7..259325e6b7e8 100644 --- a/arch/arm64/include/asm/pgtable.h +++ b/arch/arm64/include/asm/pgtable.h @@ -49,12 +49,6 @@ __flush_tlb_range(vma, addr, end, PUD_SIZE, false, 1) #endif /* CONFIG_TRANSPARENT_HUGEPAGE */ -static inline bool arch_thp_swp_supported(void) -{ - return !system_supports_mte(); -} -#define arch_thp_swp_supported arch_thp_swp_supported - /* * Outside of a few very special situations (e.g. hibernation), we always * use broadcast TLB invalidation instructions, therefore a spurious page @@ -1280,12 +1274,7 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma, #ifdef CONFIG_ARM64_MTE #define __HAVE_ARCH_PREPARE_TO_SWAP -static inline int arch_prepare_to_swap(struct page *page) -{ - if (system_supports_mte()) - return mte_save_tags(page); - return 0; -} +extern int arch_prepare_to_swap(struct folio *folio); #define __HAVE_ARCH_SWAP_INVALIDATE static inline void arch_swap_invalidate_page(int type, pgoff_t offset) @@ -1301,11 +1290,7 @@ static inline void arch_swap_invalidate_area(int type) } #define __HAVE_ARCH_SWAP_RESTORE -static inline void arch_swap_restore(swp_entry_t entry, struct folio *folio) -{ - if (system_supports_mte()) - mte_restore_tags(entry, &folio->page); -} +extern void arch_swap_restore(swp_entry_t entry, struct folio *folio); #endif /* CONFIG_ARM64_MTE */ diff --git a/arch/arm64/mm/mteswap.c b/arch/arm64/mm/mteswap.c index a31833e3ddc5..63e8d72f202a 100644 --- a/arch/arm64/mm/mteswap.c +++ b/arch/arm64/mm/mteswap.c @@ -68,6 +68,13 @@ void mte_invalidate_tags(int type, pgoff_t offset) mte_free_tag_storage(tags); } +static inline void __mte_invalidate_tags(struct page *page) +{ + swp_entry_t entry = page_swap_entry(page); + + mte_invalidate_tags(swp_type(entry), swp_offset(entry)); +} + void mte_invalidate_tags_area(int type) { swp_entry_t entry = swp_entry(type, 0); @@ -83,3 +90,41 @@ void mte_invalidate_tags_area(int type) } xa_unlock(&mte_pages); } + +int arch_prepare_to_swap(struct folio *folio) +{ + long i, nr; + int err; + + if (!system_supports_mte()) + return 0; + + nr = folio_nr_pages(folio); + + for (i = 0; i < nr; i++) { + err = mte_save_tags(folio_page(folio, i)); + if (err) + goto out; + } + return 0; + +out: + while (i--) + __mte_invalidate_tags(folio_page(folio, i)); + return err; +} + +void arch_swap_restore(swp_entry_t entry, struct folio *folio) +{ + long i, nr; + + if (!system_supports_mte()) + return; + + nr = folio_nr_pages(folio); + + for (i = 0; i < nr; i++) { + mte_restore_tags(entry, folio_page(folio, i)); + entry.val++; + } +} diff --git a/include/linux/huge_mm.h b/include/linux/huge_mm.h index de0c89105076..e04b93c43965 100644 --- a/include/linux/huge_mm.h +++ b/include/linux/huge_mm.h @@ -535,16 +535,4 @@ static inline int split_folio_to_order(struct folio *folio, int new_order) #define split_folio_to_list(f, l) split_folio_to_list_to_order(f, l, 0) #define split_folio(f) split_folio_to_order(f, 0) -/* - * archs that select ARCH_WANTS_THP_SWAP but don't support THP_SWP due to - * limitations in the implementation like arm64 MTE can override this to - * false - */ -#ifndef arch_thp_swp_supported -static inline bool arch_thp_swp_supported(void) -{ - return true; -} -#endif - #endif /* _LINUX_HUGE_MM_H */ diff --git a/include/linux/pgtable.h b/include/linux/pgtable.h index 85fc7554cd52..b10a7dd615bd 100644 --- a/include/linux/pgtable.h +++ b/include/linux/pgtable.h @@ -1052,7 +1052,7 @@ static inline int arch_unmap_one(struct mm_struct *mm, * prototypes must be defined in the arch-specific asm/pgtable.h file. */ #ifndef __HAVE_ARCH_PREPARE_TO_SWAP -static inline int arch_prepare_to_swap(struct page *page) +static inline int arch_prepare_to_swap(struct folio *folio) { return 0; } diff --git a/mm/internal.h b/mm/internal.h index 7e486f2c502c..2551e93dd885 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -76,6 +76,20 @@ static inline int folio_nr_pages_mapped(struct folio *folio) return atomic_read(&folio->_nr_pages_mapped) & FOLIO_PAGES_MAPPED; } +/* + * Retrieve the first entry of a folio based on a provided entry within the + * folio. We cannot rely on folio->swap as there is no guarantee that it has + * been initialized. Used for calling arch_swap_restore() + */ +static inline swp_entry_t folio_swap(swp_entry_t entry, struct folio *folio) +{ + swp_entry_t swap = { + .val = ALIGN_DOWN(entry.val, folio_nr_pages(folio)), + }; + + return swap; +} + static inline void *folio_raw_mapping(struct folio *folio) { unsigned long mapping = (unsigned long)folio->mapping; diff --git a/mm/memory.c b/mm/memory.c index f2bc6dd15eb8..b7cab8be8632 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -4188,7 +4188,7 @@ vm_fault_t do_swap_page(struct vm_fault *vmf) * when reading from swap. This metadata may be indexed by swap entry * so this must be called before swap_free(). */ - arch_swap_restore(entry, folio); + arch_swap_restore(folio_swap(entry, folio), folio); /* * Remove the swap entry and conditionally try to free up the swapcache. diff --git a/mm/page_io.c b/mm/page_io.c index ae2b49055e43..a9a7c236aecc 100644 --- a/mm/page_io.c +++ b/mm/page_io.c @@ -189,7 +189,7 @@ int swap_writepage(struct page *page, struct writeback_control *wbc) * Arch code may have to preserve more data than just the page * contents, e.g. memory tags. */ - ret = arch_prepare_to_swap(&folio->page); + ret = arch_prepare_to_swap(folio); if (ret) { folio_mark_dirty(folio); folio_unlock(folio); diff --git a/mm/shmem.c b/mm/shmem.c index 0aad0d9a621b..44c1519ba881 100644 --- a/mm/shmem.c +++ b/mm/shmem.c @@ -1913,7 +1913,7 @@ static int shmem_swapin_folio(struct inode *inode, pgoff_t index, * Some architectures may have to restore extra metadata to the * folio after reading from swap. */ - arch_swap_restore(swap, folio); + arch_swap_restore(folio_swap(swap, folio), folio); if (shmem_should_replace_folio(folio, gfp)) { error = shmem_replace_folio(&folio, gfp, info, index); diff --git a/mm/swap_slots.c b/mm/swap_slots.c index 90973ce7881d..53abeaf1371d 100644 --- a/mm/swap_slots.c +++ b/mm/swap_slots.c @@ -310,7 +310,7 @@ swp_entry_t folio_alloc_swap(struct folio *folio) entry.val = 0; if (folio_test_large(folio)) { - if (IS_ENABLED(CONFIG_THP_SWAP) && arch_thp_swp_supported()) + if (IS_ENABLED(CONFIG_THP_SWAP)) get_swap_pages(1, &entry, folio_nr_pages(folio)); goto out; } diff --git a/mm/swapfile.c b/mm/swapfile.c index 4919423cce76..5e6d2304a2a4 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -1806,7 +1806,7 @@ static int unuse_pte(struct vm_area_struct *vma, pmd_t *pmd, * when reading from swap. This metadata may be indexed by swap entry * so this must be called before swap_free(). */ - arch_swap_restore(entry, folio); + arch_swap_restore(folio_swap(entry, folio), folio); dec_mm_counter(vma->vm_mm, MM_SWAPENTS); inc_mm_counter(vma->vm_mm, MM_ANONPAGES);