From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by smtp.subspace.kernel.org (Postfix) with ESMTP id 11A123FE656 for ; Tue, 7 Jul 2026 12:12:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=217.140.110.172 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783426330; cv=none; b=CiZcsbf2XhADtLq1bjwSa0N95IaIXUqYIVyDS30pVdXRELxIVd0YzU0udwI8khsmCC80Z5tGjZun78nTlT5SLMjFXZztqCh05kXN8IZ/PqCOFMwsjkAu1BgGeNEL8gIFdnBtnBEqV2nr1ZuaFEhwkP/8r+iJ0hFlIVmPbqhlwd8= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1783426330; c=relaxed/simple; bh=poxfCcDCcSPlWq8ZXKhYROLqj29INPweL+jWzNypFRo=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=rB+M3LNQbTb7zc9mDZ4QdXlCv2oZdnNOZiWSWfhF9+035Y8NfBDV2rAgSFLkUF5NARAtnXYOEwau4MyyBZYZQcNPULAmc3D/txrXz/3dYtUsUGxpFg2vsdmR0ow1iOMxW7q+MdWEVJ0d7k1pdR8SIihnYrRS7CPEhdaO9tzQtQU= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com; spf=pass smtp.mailfrom=arm.com; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b=UeijZayO; arc=none smtp.client-ip=217.140.110.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=arm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=arm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=arm.com header.i=@arm.com header.b="UeijZayO" Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1FD812379; Tue, 7 Jul 2026 05:12:04 -0700 (PDT) Received: from cesw-amp-gbt-1s-m12830-01.blr.arm.com (cesw-amp-gbt-1s-m12830-01.blr.arm.com [10.164.195.33]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id 33D823F7B4; Tue, 7 Jul 2026 05:12:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=arm.com; s=foss; t=1783426328; bh=poxfCcDCcSPlWq8ZXKhYROLqj29INPweL+jWzNypFRo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=UeijZayOl4RX6iWdhmgfKB3RJYGE+jJj7uwMGXeD4JnJB3n+G89+nlxckRhgxKpD1 TZrb46rms+a4+/A/PDD17AADhs9YnpBEXgyPZ4scZ3j664tiAVIV207rzc4qDASYqK PHE/pHQ0hD0jTlJIzekXCQrFiVD9Zrc3mfkrDw1Q= From: Dev Jain To: akpm@linux-foundation.org, david@kernel.org, ljs@kernel.org, muchun.song@linux.dev, osalvador@suse.de Cc: Dev Jain , riel@surriel.com, liam@infradead.org, vbabka@kernel.org, harry@kernel.org, jannh@google.com, lance.yang@linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, ryan.roberts@arm.com, anshuman.khandual@arm.com Subject: [PATCH 5/5] mm/rmap: add anon folio unmap dispatcher function Date: Tue, 7 Jul 2026 12:11:23 +0000 Message-ID: <20260707121128.373192-6-dev.jain@arm.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260707121128.373192-1-dev.jain@arm.com> References: <20260707121128.373192-1-dev.jain@arm.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Add ttu_anon_folio() as the common entry point for anonymous folio unmapping. It dispatches to the lazyfree or swapbacked helper as appropriate, and centralizes restoration of cleared PTEs on failure. No functional change intended. Signed-off-by: Dev Jain --- mm/rmap.c | 59 +++++++++++++++++++++++++++++++++---------------------- 1 file changed, 36 insertions(+), 23 deletions(-) diff --git a/mm/rmap.c b/mm/rmap.c index ade78df5be2bd..f021ecd51a4a2 100644 --- a/mm/rmap.c +++ b/mm/rmap.c @@ -2171,6 +2171,40 @@ static inline bool ttu_anon_swapbacked_folio(struct vm_area_struct *vma, struct return true; } +static inline bool ttu_anon_folio(struct vm_area_struct *vma, struct folio *folio, + struct page *subpage, unsigned long address, pte_t *ptep, + pte_t pteval, unsigned long nr_pages) +{ + struct mm_struct *mm = vma->vm_mm; + bool ret; + + /* + * Store the swap location in the pte. + * See handle_pte_fault() ... + */ + if (unlikely(folio_test_swapbacked(folio) != + folio_test_swapcache(folio))) { + WARN_ON_ONCE(1); + return false; + } + + /* MADV_FREE page check */ + if (!folio_test_swapbacked(folio)) { + ret = ttu_anon_lazyfree_folio(vma, folio); + if (ret) + add_mm_counter(mm, MM_ANONPAGES, -nr_pages); + } else { + /* nr_pages > 1 not supported yet */ + ret = ttu_anon_swapbacked_folio(vma, folio, subpage, address, + ptep, pteval); + } + + if (!ret) + set_ptes(mm, address, ptep, pteval, nr_pages); + + return ret; +} + /* * @arg: enum ttu_flags will be passed to this argument */ @@ -2351,31 +2385,10 @@ static bool try_to_unmap_one(struct folio *folio, struct vm_area_struct *vma, */ dec_mm_counter(mm, mm_counter(folio)); } else if (folio_test_anon(folio)) { - /* - * Store the swap location in the pte. - * See handle_pte_fault() ... - */ - if (unlikely(folio_test_swapbacked(folio) != - folio_test_swapcache(folio))) { - WARN_ON_ONCE(1); + if (!ttu_anon_folio(vma, folio, subpage, address, + pvmw.pte, pteval, nr_pages)) goto walk_abort; - } - /* MADV_FREE page check */ - if (!folio_test_swapbacked(folio)) { - if (!ttu_anon_lazyfree_folio(vma, folio)) { - set_ptes(mm, address, pvmw.pte, pteval, nr_pages); - goto walk_abort; - } - add_mm_counter(mm, MM_ANONPAGES, -nr_pages); - goto finish_unmap; - } - - if (!ttu_anon_swapbacked_folio(vma, folio, subpage, address, - pvmw.pte, pteval)) { - set_pte_at(mm, address, pvmw.pte, pteval); - goto walk_abort; - } goto finish_unmap; } else { /* -- 2.43.0