From patchwork Mon Feb 10 21:21:39 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13968628 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 1CB14C02198 for ; Mon, 10 Feb 2025 21:21:53 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id F27DA280031; Mon, 10 Feb 2025 16:21:51 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id E6163280007; Mon, 10 Feb 2025 16:21:51 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id D2BC0280031; Mon, 10 Feb 2025 16:21:51 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id A9840280007 for ; Mon, 10 Feb 2025 16:21:51 -0500 (EST) Received: from smtpin02.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 5ADA54730D for ; Mon, 10 Feb 2025 21:21:51 +0000 (UTC) X-FDA: 83105307222.02.AEC5CE3 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf20.hostedemail.com (Postfix) with ESMTP id B795B1C000B for ; Mon, 10 Feb 2025 21:21:49 +0000 (UTC) Authentication-Results: imf20.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=hneJpaSk; spf=none (imf20.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739222509; 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=EvE1G6G0N+hlj0P4WFgMk7lvRC8yOW1eRJczpp6IPLw=; b=4uYUa90BOthDTnsDN2FzIuck74Zd+kvUvTw4N5FDmXejamGCX22vpc5rDdv0xh3GfeXRip wsE1MxH4c2nEkt9C8OfYHJJVmfkPV9nBRWqc0hHiixcz6+WbUZPIYXvrP2UH6pWvcY1dZI ccwMz2VI1JAzx7QlrO55WXARPQU8j24= ARC-Authentication-Results: i=1; imf20.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=hneJpaSk; spf=none (imf20.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739222509; a=rsa-sha256; cv=none; b=25EQAKLiIXyKhg3M2+3Hjc5EeHpREnjrubizhk1WOxqR7ORq3TR9pOEWUjHmIQyQ+iUveo e+yoOFeIAujwOprUmhPA4F9EvoZy1wKpLAyizK5cCk9gl72wXSDRIdpxV8PE8njqvjVEx2 kS4IhJrQ1zndi8QIk+OPydwyv3VSZwE= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=EvE1G6G0N+hlj0P4WFgMk7lvRC8yOW1eRJczpp6IPLw=; b=hneJpaSkje1gE3BmYU7XmE57YP 45qNvECcBJYO6UPKtJWLaUrMG4mKEN/gikVhdzSwWuVGH6vGz6C3/hUFmUyIlMO+0cNl/D5wQF5f4 VeFzt+/9Fmt6K0HCYIukUnJOD+xOQ3VOcrr6nTLR6CDrFWjZuzUSPnh2Kc70cE6B0CI8fCENI9iTu IQSrmCdilnaNCm8JvlXRTwGPtcBzC6ELQhqFz6EZinTq9/qh/CXB7Jiy3KoGGpETgUtrVQRR3gQdq vq4ARsaOWQeMICdgDiCQ6rXgGszGhzk6JOmr3SmWeSv+CsP7Nzqz7y1itAZoJNEx4C7eHfUZfOQ8j 1ke6HaZQ==; Received: from willy by casper.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1thbDt-0000000GnC2-0PjK; Mon, 10 Feb 2025 21:21:45 +0000 From: "Matthew Wilcox (Oracle)" To: linux-mm@kvack.org Cc: "Matthew Wilcox (Oracle)" , David Hildenbrand Subject: [RFC PATCH 1/3] mm: Constify folio_mapping() and swapcache_mapping() Date: Mon, 10 Feb 2025 21:21:39 +0000 Message-ID: <20250210212142.4002210-2-willy@infradead.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250210212142.4002210-1-willy@infradead.org> References: <20250210212142.4002210-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Queue-Id: B795B1C000B X-Stat-Signature: wwfmpu5cob8ofa6cbimggfeg8bn977fh X-Rspamd-Server: rspam03 X-HE-Tag: 1739222509-820739 X-HE-Meta: U2FsdGVkX18IO+YBoKIWVuvYhsM9iZHktXgnBu1CrbTDTrz+y8OnLKzpgs/hJlYT5J9Auf0JvgeGpHS0ICrAtBy7d/IarJboAfC4I5VXJgXb91fEa0l3Ub2Y/aM+7Yts5/XF9NmA46BhfXdDa11FD/laB8JZyeIeBQoZpuhk0dZlMnfmXkDJeSi45D0k3V/TFAZb4anNRRw1VtWIAq2oBE7/84JAZNVSKHSRb5i6cOggBnR9IGQBv3qU/hAYK7tXRaJaQqfeoMH/k4kOhjl4bfC+5TMTh41kl3AHs1wbtU9qsc7r3BVIJ7e1rpUXHDAvSPoTa167f8S/iOmzcevysaSQH+AFK9boXgezBhzXC0MtcmDOTZkaNZLDyZmSJZOdlP5PyC+f6lZZ+fm3JhtD3BEBlUpXPzaExJ2Eu6MZNg/XNVNK/IVCaNrUlEJJ8LU2mGJp56sHl+dzU8NHatK6XnoFAcJwrORfN1cTvNaDyF1BNYJCI2xNPxYe6g8ydcV20R44LSaBVmOE4FVuGxQWUfOymmloDjKyNuK8P7dK6iy66XiPzlj2zmXkmh/3PM6KMpDfUxzysQSTvvUi7xgX8jM/C8xwkJs+GO9p+AMr0/VIHrjtjjbh6GQaVTB8kFwPqfkQeQJEx8R1MMqAmXK/m960XrxQ0EhPEjWtHukUGFIX30tZ8m3N8TEAqDMMJiZcIwwOAUaz4U/rqfbeRmW6AvPp31aoyHVCdkDlRWNHXJ6o0GYCTkgmT8Uf4/LPllJr4BawitaGvVPjlT0nIeUFqI8RnzVhdKg2ieVQA1dcaq8OvKeAew1e0QLy4r3LHOhGGnzv1QgaJm8J3Pmi2muNhXkmVKMqYjq2QubIjN/RpZIDZ/P85T4FVQex4+L/HZdlSb7M8N47tTIuKppa9DHT0nGZHQNcS7ZMcydUw25imevVF9Ny4tXl5apyVtZS9K5HtM6eoZ1m7ZmFRkXoEfA KJQp9FO0 9LXVEYW4PFOaofv3rW0eg6qGq8QfFrtq5CnZy57+PvyjoQez/CmVVFkErpWQ3HuBWQkDm73lJxSeWJTK/WMmLrjIEoYj7OtwiXJ+B7ePIMHMUUDCcXlAXOlX0yUZVoAWqsPIOohp5stq2a2AEVMM+OIX4WYPIrjk0cM/eIakiR3TSHunz92/2obRclLFplmxFHwX+CYjHTDbJrVOAf4eHe2DGom1cqywixISaWw8CNQyZzy74Im+sTtWHsPl0PUsdENPyl7o3V9KI5ZH+LVN3vlZZw8W0L1IS5mIy 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: Neither of these functions modify their argument; make it const so the compiler knows this and can optimise accordingly. Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: David Hildenbrand Reviewed-by: Shivank Garg --- include/linux/pagemap.h | 4 ++-- mm/debug.c | 2 +- mm/swapfile.c | 2 +- mm/util.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/include/linux/pagemap.h b/include/linux/pagemap.h index 47bfc6b1b632..8a9b2d201706 100644 --- a/include/linux/pagemap.h +++ b/include/linux/pagemap.h @@ -532,8 +532,8 @@ static inline void filemap_nr_thps_dec(struct address_space *mapping) #endif } -struct address_space *folio_mapping(struct folio *); -struct address_space *swapcache_mapping(struct folio *); +struct address_space *folio_mapping(const struct folio *); +struct address_space *swapcache_mapping(const struct folio *); /** * folio_file_mapping - Find the mapping this folio belongs to. diff --git a/mm/debug.c b/mm/debug.c index 8d2acf432385..fa3d9686034c 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -67,7 +67,7 @@ static const char *page_type_name(unsigned int page_type) return page_type_names[i]; } -static void __dump_folio(struct folio *folio, struct page *page, +static void __dump_folio(const struct folio *folio, struct page *page, unsigned long pfn, unsigned long idx) { struct address_space *mapping = folio_mapping(folio); diff --git a/mm/swapfile.c b/mm/swapfile.c index 6e867c16ea93..ccaed8c2f761 100644 --- a/mm/swapfile.c +++ b/mm/swapfile.c @@ -3658,7 +3658,7 @@ struct swap_info_struct *swp_swap_info(swp_entry_t entry) /* * out-of-line methods to avoid include hell. */ -struct address_space *swapcache_mapping(struct folio *folio) +struct address_space *swapcache_mapping(const struct folio *folio) { return swp_swap_info(folio->swap)->swap_file->f_mapping; } diff --git a/mm/util.c b/mm/util.c index b6b9684a1438..682ecdb1b1c2 100644 --- a/mm/util.c +++ b/mm/util.c @@ -845,7 +845,7 @@ struct anon_vma *folio_anon_vma(const struct folio *folio) * You can call this for folios which aren't in the swap cache or page * cache and it will return NULL. */ -struct address_space *folio_mapping(struct folio *folio) +struct address_space *folio_mapping(const struct folio *folio) { struct address_space *mapping; From patchwork Mon Feb 10 21:21:40 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13968630 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 434CDC02198 for ; Mon, 10 Feb 2025 21:23:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C6A09280034; Mon, 10 Feb 2025 16:23:07 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id C1AA8280016; Mon, 10 Feb 2025 16:23:07 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AB96A280034; Mon, 10 Feb 2025 16:23:07 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id 89733280016 for ; Mon, 10 Feb 2025 16:23:07 -0500 (EST) Received: from smtpin18.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 2D400B0BFB for ; Mon, 10 Feb 2025 21:21:54 +0000 (UTC) X-FDA: 83105307348.18.908C58E Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf06.hostedemail.com (Postfix) with ESMTP id 6B2F5180002 for ; Mon, 10 Feb 2025 21:21:52 +0000 (UTC) Authentication-Results: imf06.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=CKTYo9UW; spf=none (imf06.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739222512; 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=pk+3514E1nZek8MCAYQjTVBEsflbSP2sJQOa8nDkjSk=; b=AgYMwWfATCsDAF22Hej3EPPk2MPTugoEQhA6jrs35PWc4Ox2/o4pAyaoyI1+/oMlNOVuYa dxI9v9OyDgB0OaOnHGwp6c4qtIuecluCo43dLyKFyyyNWm7nSQAfPFbmLcYyWOzMk3AIrV aMUEo0nyNQeuMJx6/k6LxJEZIAABXbc= ARC-Authentication-Results: i=1; imf06.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b=CKTYo9UW; spf=none (imf06.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739222512; a=rsa-sha256; cv=none; b=xPd5XTZjhNLstRtMn9ss9cd15rAq9LKrRJQBdNnprWXro6uWLlvAQuv8zf2yXVGuQrcKa3 IWe5X47ZmbxJ1nLpOq5Ac4lRIRTIFm8CC0nkJUtIxdmaDOqP6adhQHJmRwi8dlkPzCPawQ Wv24HlIBRxGAM+kIjC02o5AmsfjDE6M= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=pk+3514E1nZek8MCAYQjTVBEsflbSP2sJQOa8nDkjSk=; b=CKTYo9UWfp0CRIavea0O8f08Ek eA6HxGp9p8CHNPdIEa+XFiEku6ngWEPzYcAziPjFr1G2jpuDykc1I2RDMeU37kvolDPsiFmdW9T2Y SyfwwDLM/6ZX5UvWD4WXYLGhr7XFdKDY575RkEttj3/OZslb+xeXVcF6Wq67fJrC1ijxr+PdGsBo/ lzhcQE/cB+HxMP4twJ3OME5sDyd5veV5GZGLannsLmxHqNTCkPQGyo9pdIY8KulsCMhBvBgwSMZ8v Erit/EIqd44FzYCrD8Z7WP0gioPvnKwKnllTcNEAeCcy3eRxFYT4uojXSuoljqFrgPZjc7NEvl04p lrpcClVQ==; Received: from willy by casper.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1thbDt-0000000GnC6-0lEo; Mon, 10 Feb 2025 21:21:45 +0000 From: "Matthew Wilcox (Oracle)" To: linux-mm@kvack.org Cc: "Matthew Wilcox (Oracle)" , David Hildenbrand Subject: [RFC PATCH 2/3] mm: Create snapshot_page() Date: Mon, 10 Feb 2025 21:21:40 +0000 Message-ID: <20250210212142.4002210-3-willy@infradead.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250210212142.4002210-1-willy@infradead.org> References: <20250210212142.4002210-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam08 X-Rspamd-Queue-Id: 6B2F5180002 X-Stat-Signature: ukfox7jxpts57yn8ar55qcipycrxjdjk X-HE-Tag: 1739222512-267076 X-HE-Meta: U2FsdGVkX18k959kAURwyQHNV/KvU8k6Qlr4f3/6AGFjJpmcBfkyRpCDN8dlAI0xvTY4nbqCXEPQGUcOEfH1XNf+Zf1xRi/SEVe8mfjw1YNH7uo+Y5eDkOwldPs7YwCusQC4vclUsiDzzfhlvRABVVRs26axVSTG0Ltg0LJhb4Q2apAMDpwxi1yaz2Cserw49s7PQZYVJO2otl4P8YwsopJ+FWmGeTR/zFONKjoJNxq3jETD/UvppuxA+xN9d5wAsK4+TUuf+ljI7x/vrcyASXym6JY+VlOdvM4ZYZibitklMwbibGa3yT004ljohccEWrPGERZ56itraKrYSDwmOH+P6ooiQXFRJCc+S2+QdGZtAQPGu6ZVuxMeKwUuW17vvmLARg6grokizGOgoZfGE7ig5PMbkSkynKiA01zlQK9JR/u5yTLQXXED5T/NgqQRnOaXfSlynelDTd/WWYKQz9QT773RQFR0sOkcWafHEyGxCdr3mCKLrTzPeLDZ0Qw+X5PGWhY1Qvu2+ObItIVNH0l3dOFEQahE21dXESRGDBhwoYfB9NVeZVVarZlFexwYJgdwXbC9EmyPPnvk3YE+MEtjC4wjWzh9cM+Dh6CIRfqf6D6D1oyJ6JAVpsudIPSFVlhMCdt6BG/aAZBwRXzBjj9NyMZaQwjUFrC7OB3GozQqdjcO4Ki6Uhd+kkJQ3gJHnjvw4hMlZCE/gqExOLWt/f1L5hSqpmlrkAF14lqWD3o2NpDCfdUWgd3mvR00rbnvHOi1wKZ2QtQ92hZuOWG60o/xWeJhdOxMu6LboQOxp9xQlxXeS2KTZkSCOs6+fIwDrKHnVB0nSwS8Zh7B5ykH9Dr2hDKt6KR8VFgQw3K1fucHYPehvKNEhco7Yq/XAfme1y2lh6IqkbcvAF/tHEckiWIBR4QwRnefB6quLX+05kHM2ACMvR9kobK9LAuhLILmkHtDksISLwXIvNuHJ3x wFbDj1PG aQhHPoNTHa/FcaM13eV4kchuKDlkkvFY53MHDfKEnWjZLTIzLCrhWvP/YZqgDcwLeJmciA+x1Ha7glk366frieDZFZfBRy2R5ILie1D9zCrPwbq6Mh77mVK0gEUxKVVZGD0OAT9YnEpEvQRZoMjijAN2m4ouVKBxnpyv4ZKO/SPXhrWk0o3TEu1kagSSCuYdPjsk/1AA0pTlNt9iK1SCUk1nzPhJf8bQPfxUV8j//+ezcVwCAJyPPWme0+IYjnRISOSOphHv74LxvgUXfQNphkOGjp1rP2Gvl3Pds 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: Move the guts of __dump_page() into a new function called snapshot_page(). With that done, __dump_page() becomes trivial so inline it into dump_page(). Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: Shivank Garg --- mm/debug.c | 53 +++++++++------------------------------------------ mm/internal.h | 2 ++ mm/util.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 61 insertions(+), 44 deletions(-) diff --git a/mm/debug.c b/mm/debug.c index fa3d9686034c..1ea5dacb1524 100644 --- a/mm/debug.c +++ b/mm/debug.c @@ -120,54 +120,19 @@ static void __dump_folio(const struct folio *folio, struct page *page, 2 * sizeof(struct page), false); } -static void __dump_page(const struct page *page) -{ - struct folio *foliop, folio; - struct page precise; - unsigned long head; - unsigned long pfn = page_to_pfn(page); - unsigned long idx, nr_pages = 1; - int loops = 5; - -again: - memcpy(&precise, page, sizeof(*page)); - head = precise.compound_head; - if ((head & 1) == 0) { - foliop = (struct folio *)&precise; - idx = 0; - if (!folio_test_large(foliop)) - goto dump; - foliop = (struct folio *)page; - } else { - foliop = (struct folio *)(head - 1); - idx = folio_page_idx(foliop, page); - } - - if (idx < MAX_FOLIO_NR_PAGES) { - memcpy(&folio, foliop, 2 * sizeof(struct page)); - nr_pages = folio_nr_pages(&folio); - foliop = &folio; - } - - if (idx > nr_pages) { - if (loops-- > 0) - goto again; - pr_warn("page does not match folio\n"); - precise.compound_head &= ~1UL; - foliop = (struct folio *)&precise; - idx = 0; - } - -dump: - __dump_folio(foliop, &precise, pfn, idx); -} - void dump_page(const struct page *page, const char *reason) { + struct folio stack_folio; + struct page stack_page; + const struct folio *folio; + unsigned long idx; + if (PagePoisoned(page)) pr_warn("page:%p is uninitialized and poisoned", page); - else - __dump_page(page); + else { + folio = snapshot_page(&stack_folio, &stack_page, &idx, page); + __dump_folio(folio, &stack_page, page_to_pfn(page), idx); + } if (reason) pr_warn("page dumped because: %s\n", reason); dump_page_owner(page); diff --git a/mm/internal.h b/mm/internal.h index 109ef30fee11..8fdfea104068 100644 --- a/mm/internal.h +++ b/mm/internal.h @@ -856,6 +856,8 @@ static inline bool free_area_empty(struct free_area *area, int migratetype) /* mm/util.c */ struct anon_vma *folio_anon_vma(const struct folio *folio); +const struct folio *snapshot_page(struct folio *foliop, struct page *precise, + unsigned long *idxp, const struct page *unstable); #ifdef CONFIG_MMU void unmap_mapping_folio(struct folio *folio); diff --git a/mm/util.c b/mm/util.c index 682ecdb1b1c2..9f9cf3933eb1 100644 --- a/mm/util.c +++ b/mm/util.c @@ -1239,3 +1239,53 @@ void flush_dcache_folio(struct folio *folio) } EXPORT_SYMBOL(flush_dcache_folio); #endif + +/* + * If you have an unstable reference to a page, use this to get a + * somewhat-consistent (potentially outdated) snapshot. The consistency + * is limited to the page being contained in the folio. You need to pass in + * a scratch folio and scratch page, probably allocated on the stack. + * You get back a pointer to the scratch folio you passed in, marked + * as const to remind you not to modify this. + */ +const struct folio *snapshot_page(struct folio *foliop, struct page *precise, + unsigned long *idxp, const struct page *unstable) +{ + struct folio *folio; + unsigned long head; + unsigned long idx, nr_pages = 1; + int loops = 5; + +again: + memcpy(precise, unstable, sizeof(struct page)); + head = precise->compound_head; + /* Open-coded !PageTail because page_is_fake_head() doesn't work here */ + if ((head & 1) == 0) { + folio = (struct folio *)precise; + *idxp = 0; + /* Not a tail, not a head, we have a single page */ + if (!folio_test_large(folio)) + goto out; + folio = (struct folio *)unstable; + } else { + folio = (struct folio *)(head - 1); + *idxp = folio_page_idx(folio, unstable); + } + + if (idx < MAX_FOLIO_NR_PAGES || folio_test_hugetlb(folio)) { + memcpy(foliop, folio, sizeof(struct folio)); + nr_pages = folio_nr_pages(foliop); + folio = foliop; + } + + if (idx > nr_pages) { + if (loops-- > 0) + goto again; + pr_warn("page does not match folio\n"); + precise->compound_head &= ~1UL; + folio = (struct folio *)precise; + *idxp = 0; + } +out: + return folio; +} From patchwork Mon Feb 10 21:21:41 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matthew Wilcox X-Patchwork-Id: 13968629 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 1B2F7C02198 for ; Mon, 10 Feb 2025 21:21:58 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9AA6F280033; Mon, 10 Feb 2025 16:21:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 93284280007; Mon, 10 Feb 2025 16:21:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 7FAC1280033; Mon, 10 Feb 2025 16:21:57 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 5FE30280007 for ; Mon, 10 Feb 2025 16:21:57 -0500 (EST) Received: from smtpin13.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 273821A0641 for ; Mon, 10 Feb 2025 21:21:57 +0000 (UTC) X-FDA: 83105307474.13.7003FD8 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf04.hostedemail.com (Postfix) with ESMTP id 7FFD840007 for ; Mon, 10 Feb 2025 21:21:55 +0000 (UTC) Authentication-Results: imf04.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b="j06wopU/"; spf=none (imf04.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1739222515; 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=YQMQMCs6w1+E+581hiZ1NQ3PA5CTu8OYOh82Sp1fR+E=; b=ERH9GWq58IAL2zUR89lL5X4Fe1BT1kuy9UIsUU+Te7ZR2wWQX4PWZjlvXZVvOdd9lqnH9Z jLxMGQbdaR/Be1p4JNn94Yw/uvn3kZlVchRxVafFdQXELGpvlAuKDd5oFjIUbaJ14ZdICG AeBUXNQfcvKxkkf+uOEAdyxPHzkG3pY= ARC-Authentication-Results: i=1; imf04.hostedemail.com; dkim=pass header.d=infradead.org header.s=casper.20170209 header.b="j06wopU/"; spf=none (imf04.hostedemail.com: domain of willy@infradead.org has no SPF policy when checking 90.155.50.34) smtp.mailfrom=willy@infradead.org; dmarc=none ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1739222515; a=rsa-sha256; cv=none; b=KXwiRM5yF7BYkIntBAMU49X4hQu4yF5ZtsaafLzm3abWRs6ubFU3meFd0ap1FrOgikVU3L 4J5daJxPsplg5X6oYJRRSp+ZnqzpiC9iwZnr3YoYqagee7sgy4Hl1OHWTi5xTFsSSxPis9 5nZj+lx7sbZ7SL9ouCd9bWYgTC3Z5yo= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-ID:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=YQMQMCs6w1+E+581hiZ1NQ3PA5CTu8OYOh82Sp1fR+E=; b=j06wopU/tkUZM2XzZ8b1cIXdCp HUM26aOZLwQWRlhJuptTqqjvBqOhyFl2U3tt/nwzJxPL/50GByKwPqWVmKgYYO8udVpfJeBs4LaQF qgFg2yC68jWdXAjzJNvTikLWAOHmiXFCoZkRR5CnLpxU5O0N9tZ0xoUVvqT9FsbK5lVvTyz8bjBmK gwMcWW/uqRgXzithiNIwjnR8ST6hs2ON6RyNmR5OorI7PkBmQbgPpXQrZVMuEnwMnTOU6afK3v0oQ uYPheZcF6TCKvfPPP1mqndqHBtCETkwYD1/646xR78fXv3pNMatIlemCznmp64lAqqbmReXo2vCJe Q74gahIQ==; Received: from willy by casper.infradead.org with local (Exim 4.98 #2 (Red Hat Linux)) id 1thbDt-0000000GnC8-16zI; Mon, 10 Feb 2025 21:21:45 +0000 From: "Matthew Wilcox (Oracle)" To: linux-mm@kvack.org Cc: "Matthew Wilcox (Oracle)" , David Hildenbrand Subject: [RFC PATCH 3/3] proc: Use snapshot_page() in kpageflags Date: Mon, 10 Feb 2025 21:21:41 +0000 Message-ID: <20250210212142.4002210-4-willy@infradead.org> X-Mailer: git-send-email 2.48.1 In-Reply-To: <20250210212142.4002210-1-willy@infradead.org> References: <20250210212142.4002210-1-willy@infradead.org> MIME-Version: 1.0 X-Rspam-User: X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: 7FFD840007 X-Stat-Signature: bg86m793ts6jsk5nksg1cgtmgm34dh5y X-HE-Tag: 1739222515-770675 X-HE-Meta: U2FsdGVkX1+r8A2NHa4WpB3CMqUTV0oLYxctwVEKWVRSj6axLQq90B1w1Bv/AagJg7hJuCMtm8isjGeWynQzAbXKs+kzCWnWuRhA/q4Rh4DpNd75yml2PCnTQzcT3OgcnONR+B5F8joOHWrw54/z79MLaYFZalOYliXxhIgpKDdqVBtUGJvcEXDB97NeIQzIXg7bzJkU27brI37PPWd5Sbk+9Tkno105bMXRb3jTyN79lKndRnp3pcMAo9XUXqGUFt9DOXXih4PkKkqae7/APVRoiYFD5ATQe78uzS2f7/prRZjv5zYil6+S8XlT6PNrTPFL4G74YOXIqFaWEzawfVlr6d6Y0TYahJUH25ZYMaZe6lf2d4XFX6FsdLOopjWP3cBaYehEEL6dP0qTwVIwAVmCHz02GYZbTB+EcYkFPHbxdrLoBTEpcoL8l/RnNN72EeWI/usnrTbNUNrfED/H7PtkyZFSngveelT5CxLqS/lWjvyp9iEdRsbezLBZqaJeiCqECirNyiOkgaC5jnXwbBVmHqGB5HF6ZTmacLblgufwT2ERUdCUtcxbQJyuqdOgUUtZezzODaDKLBOT+fPFAgI4Uq4t/lUzT75AIYby3I82zfHqLeQr2MPx4RAYU3+j6HLvHqwp3CUvoz3jz9zYt2vGpw/VNzAohA3V2V0SHif+2znE6uyOeMIgE4lcV3kOlvWzoyEHLij0p2TkccfyreK1nORjuk1TO40zOf+pkvwewbr6YmetgZn50CmTk8nsKrb2DOPNavfWLWrau9t2V9PPuAjPqzfsxb4P72T9NfBs0Bzx3aBascDvtGz7Jpy0Y4snHIIFOCSUp8YTVDIwUm0OgWVx+8oQMs6HjNGNEap7mG3X6p+EUHq+3Qh3HUx5rvvHYdPqWjG8A+mrYRGLFKCFK+MIS7zLmD+j3fM8wHPUVBIMNBBeWtd7FgSBx/MK/FqnCdjWb5K0KYfSYVk SEYmQsfV I3uqSskl248PKSsMQTK4o01pGd3btXgMhR1RyKyr8PYSnbD7J/6e17Ufc8Vj8ImpI4q6u7f3kwqwAQdq9uWpQxQsKpdv0tH4HwQjaxYsaDm9lpuMOeZ+jQH0L7Su1q3bQHSQJkoi1ykRfgJXKnm6aqIJPIBU0U3bAWJu0cWUUCxN8HKk1KL3jvHgpjaTXCvE19CqTocw9wDqlkFGW/CJD7aG5I/p8lTZhf3rmbQSl+22uI0TjcbHvjTAjnQdX9Rv+eRuzQeSXBB1LBzNUegTAf4bWJ6RDdH+40Feo 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: syzbot has reported a number of oopses caused by reading /proc/kpageflags racing with a folio being split / freed / allocated and thus a page which starts out as a hed page becomes a tail page during the read, which our assertions catch as an error. To solve this problem, snapshot the page like dump_page() does. Link: the syzbot reports Signed-off-by: Matthew Wilcox (Oracle) Reviewed-by: Shivank Garg --- fs/proc/page.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/fs/proc/page.c b/fs/proc/page.c index a55f5acefa97..9ebbb1e963b4 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -17,6 +17,7 @@ #include #include #include "internal.h" +#include "../mm/internal.h" /* snapshot_page() */ #define KPMSIZE sizeof(u64) #define KPMMASK (KPMSIZE - 1) @@ -106,9 +107,12 @@ static inline u64 kpf_copy_bit(u64 kflags, int ubit, int kbit) return ((kflags >> kbit) & 1) << ubit; } -u64 stable_page_flags(const struct page *page) +u64 stable_page_flags(const struct page *unstable) { + struct folio stack_folio; + struct page stack_page; const struct folio *folio; + unsigned long idx; unsigned long k; unsigned long mapping; bool is_anon; @@ -118,9 +122,9 @@ u64 stable_page_flags(const struct page *page) * pseudo flag: KPF_NOPAGE * it differentiates a memory hole from a page with no flags */ - if (!page) + if (!unstable) return 1 << KPF_NOPAGE; - folio = page_folio(page); + folio = snapshot_page(&stack_folio, &stack_page, &idx, unstable); k = folio->flags; mapping = (unsigned long)folio->mapping; @@ -129,7 +133,7 @@ u64 stable_page_flags(const struct page *page) /* * pseudo flags for the well known (anonymous) memory mapped pages */ - if (page_mapped(page)) + if (page_mapped(&stack_page)) u |= 1 << KPF_MMAP; if (is_anon) { u |= 1 << KPF_ANON; @@ -141,7 +145,7 @@ u64 stable_page_flags(const struct page *page) * compound pages: export both head/tail info * they together define a compound page's start/end pos and order */ - if (page == &folio->page) + if (idx == 0) u |= kpf_copy_bit(k, KPF_COMPOUND_HEAD, PG_head); else u |= 1 << KPF_COMPOUND_TAIL; @@ -162,14 +166,14 @@ u64 stable_page_flags(const struct page *page) * Caveats on high order pages: PG_buddy and PG_slab will only be set * on the head page. */ - if (PageBuddy(page)) + if (PageBuddy(unstable)) u |= 1 << KPF_BUDDY; - else if (page_count(page) == 0 && is_free_buddy_page(page)) + else if (folio_ref_count(folio) == 0 && is_free_buddy_page(unstable)) u |= 1 << KPF_BUDDY; - if (PageOffline(page)) + if (folio_test_offline(folio)) u |= 1 << KPF_OFFLINE; - if (PageTable(page)) + if (folio_test_pgtable(folio)) u |= 1 << KPF_PGTABLE; if (folio_test_slab(folio)) u |= 1 << KPF_SLAB; @@ -203,7 +207,7 @@ u64 stable_page_flags(const struct page *page) if (u & (1 << KPF_HUGE)) u |= kpf_copy_bit(k, KPF_HWPOISON, PG_hwpoison); else - u |= kpf_copy_bit(page->flags, KPF_HWPOISON, PG_hwpoison); + u |= kpf_copy_bit(stack_page.flags, KPF_HWPOISON, PG_hwpoison); #endif u |= kpf_copy_bit(k, KPF_RESERVED, PG_reserved);