From mboxrd@z Thu Jan 1 00:00:00 1970 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 55AD3CD8C8B for ; Tue, 10 Oct 2023 14:30:22 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id E46848D00B4; Tue, 10 Oct 2023 10:30:21 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id DCF138D0002; Tue, 10 Oct 2023 10:30:21 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id C703E8D00B4; Tue, 10 Oct 2023 10:30:21 -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 B4E0B8D0002 for ; Tue, 10 Oct 2023 10:30:21 -0400 (EDT) Received: from smtpin01.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay06.hostedemail.com (Postfix) with ESMTP id 87C61B4A5B for ; Tue, 10 Oct 2023 14:30:21 +0000 (UTC) X-FDA: 81329787042.01.9DE1C0E Received: from out-198.mta0.migadu.com (out-198.mta0.migadu.com [91.218.175.198]) by imf23.hostedemail.com (Postfix) with ESMTP id 47397140007 for ; Tue, 10 Oct 2023 14:29:00 +0000 (UTC) Authentication-Results: imf23.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=LGQ17jWA; spf=pass (imf23.hostedemail.com: domain of naoya.horiguchi@linux.dev designates 91.218.175.198 as permitted sender) smtp.mailfrom=naoya.horiguchi@linux.dev; dmarc=pass (policy=none) header.from=linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1696948141; 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=8iM6qPUOV4SzLi4G7vOLG6YfwWxmIMlrGIRntMRiEaw=; b=aGJjxkMolLdj+9vSeh4uxAJXSKMlqZFg7xEvDN3BmM7Sg8B/fawS6Mbo7dI9+JDf5YprJI nCAO3rzol6OActkEt9QMxaIbx6yVAk+lHPCcEeBTA0mp7tp6pKd48IJGTtlrURc9c/MF5e v/5z4jA6oOqBA3h2VdHpxO60YBD5pUc= ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1696948141; a=rsa-sha256; cv=none; b=Zw19NDxB+3hGR5TXyAkMHRZ0jOl27dnEvaiToYHUgSQfVYDMOa4uKD9qS7OhF6gzL1K19r BuQR6U/JJkLd/4XzjGOAh6p8PvjD6Xid3L2QW9ahPqgQ8QiOqi9aWQgILch81HL9+LgdKX ZT7AveV8kFxXFSKm1pm4tkUsJx+LxI4= ARC-Authentication-Results: i=1; imf23.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b=LGQ17jWA; spf=pass (imf23.hostedemail.com: domain of naoya.horiguchi@linux.dev designates 91.218.175.198 as permitted sender) smtp.mailfrom=naoya.horiguchi@linux.dev; dmarc=pass (policy=none) header.from=linux.dev X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1696948139; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=8iM6qPUOV4SzLi4G7vOLG6YfwWxmIMlrGIRntMRiEaw=; b=LGQ17jWAmO3AzMTEsiisqBbOeFYutV+KmHjON926qys/pAgpt4siIMYDJofdhHOETudxF3 D4Y7Fa+Xzgy6CTNCoSSFTQWg1Owoi4swnyZrRm/n404f16vqJBzEonrBhPIQKvt0miTdvg JaSCNdpTWTvdYNouWp5c6jdVh0y3xac= From: Naoya Horiguchi To: linux-mm@kvack.org Cc: Andrew Morton , Matthew Wilcox , David Hildenbrand , "Kirill A. Shutemov" , Mike Kravetz , Miaohe Lin , Vlastimil Babka , Muchun Song , Naoya Horiguchi , linux-kernel@vger.kernel.org Subject: [PATCH v1 4/5] mm, kpageflags: fix invalid output for PageSlab Date: Tue, 10 Oct 2023 23:28:00 +0900 Message-Id: <20231010142801.3780917-5-naoya.horiguchi@linux.dev> In-Reply-To: <20231010142801.3780917-1-naoya.horiguchi@linux.dev> References: <20231010142801.3780917-1-naoya.horiguchi@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Rspamd-Queue-Id: 47397140007 X-Rspam-User: X-Stat-Signature: 7dzoyhc4io6pm9htmru4b8syjkcq5d7o X-Rspamd-Server: rspam03 X-HE-Tag: 1696948140-228843 X-HE-Meta: U2FsdGVkX1/GNOCixeqk1t40qV7Jdq2G8TD4JCOsXyWef6tRR1b5mdkkmRehWfMWqIOdE7pNz1X+zEUps5fjAADQcbvK7Ly6RhM8GTzPB8Dtap5AhQ3v9PGAPjw8oVhJonB3Nh84mDbDU01gQKQuW9jgNqcXC2FN29yjyFPCCZ7fnfA/hS8gV7P30qFUYagwjQ5UlBcYjIw7Agc/LZxt4W3+CizJK6MPh1QEuxgKj4GRhoQk5HuDx0DHq1ZVOgZpnbWISEFqPOhU6Ofz6xDNfG7sDGfZOmfEmQgpVOAzKXTTthDQIP7HOBphoYjDJ0A8YbCYe/baXJ3p4ajPZ4jMHoJq7ahuzS+m2uoqOX9eDt7NompE+b4h1+IqiX4yeSSCrak/k0u1sX5VUMos6ezUGsYb3hymriSYxOSDJXZWzMB9bvr7fd2lfTmbCsfaYPAfT1tiWqtWhSeeLAGVd7QMnIHKaFVbWlAHOzcfBdC+e4YVkjvDkCc8Nc1U9/1WIfMpZEHc4+uEt1xITrIT7u3eDgB8cnm3AykuT2NJIjEeLvBx6Z0pJUyuO/SziYazdUAchWPhB2spQXc342Q6hBO/ujcaSOl3yIiW3h45Nq3LW6wS7U+kiouKrNTcBGvj0CgLAONC7YSpLCT3XgNvwURnKgWQRIjJ36PvdmWVD08PhyWvA8Tv9/zDj/wIi4xNPA9OY22pe6WGPuQFa+IwA9q7aWtMSoMF54ZP5iSoyid0pc7Angg7GSiOwkLsJ/FjzMSUIf89MD1vo8X0GHO5LloGEzBHxn2R5DrxmXBKnZ4TusXyYoIxQPktpnA2b0XdTKs01+5sG+yiDfmGIBqBL7wS+VlyaUB4CZwtvz3S5CDE6IgixceGN/sDL/lRF3cnq28rMxDv9ZYuLgDErL/GHLaKGD9tGQJoY8ZVMK+WqVFx1LMty7av0Mx14nOm0BMZW7J0DtKt3V9SiUJMptI9cgc bwtQXXoI HBwDbbyjW1UnSXCEV6UmZZ3BrH2+ZIVfQLvSorg5fZlvegH/pC19xx0W5tvqgFYwGkDVZo7VzOmcTLgzsFUlOuMowg3AJcdXcCFM1xuHeTjC2eY4= 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: From: Naoya Horiguchi The flag field of slab tail pages is used for internal purpose and there's no point in exposing such info to userspace. Here's the output of `page-types -r -b slab` command now: flags page-count MB symbolic-flags long-symbolic-flags 0x0000000000000080 5304 20 _______S_____________________________________ slab 0x0000000000008080 1488 5 _______S_______H_____________________________ slab,compound_head 0x0000000000010081 365 1 L______S________T____________________________ locked,slab,compound_tail 0x0000000000010080 4142 16 _______S________T____________________________ slab,compound_tail 0x0000000000010180 649 2 _______SW_______T____________________________ slab,writeback,compound_tail 0x0000000000010181 474 1 L______SW_______T____________________________ locked,slab,writeback,compound_tail 0x0000000000201080 192 0 _______S____a________x_______________________ slab,anonymous,ksm 0x0000000000001080 427 1 _______S____a________________________________ slab,anonymous 0x0000000000409080 237 0 _______S____a__H______t______________________ slab,anonymous,compound_head,thp 0x0000000000411081 78 0 L______S____a___T_____t______________________ locked,slab,anonymous,compound_tail,thp 0x0000000000609080 77 0 _______S____a__H_____xt______________________ slab,anonymous,compound_head,ksm,thp 0x0000000000611081 32 0 L______S____a___T____xt______________________ locked,slab,anonymous,compound_tail,ksm,thp 0x0000000000411080 698 2 _______S____a___T_____t______________________ slab,anonymous,compound_tail,thp 0x0000000000611080 142 0 _______S____a___T____xt______________________ slab,anonymous,compound_tail,ksm,thp 0x0000000000611180 32 0 _______SW___a___T____xt______________________ slab,writeback,anonymous,compound_tail,ksm,thp 0x0000000000411181 95 0 L______SW___a___T_____t______________________ locked,slab,writeback,anonymous,compound_tail,thp 0x0000000000411180 64 0 _______SW___a___T_____t______________________ slab,writeback,anonymous,compound_tail,thp 0x0000000000611181 13 0 L______SW___a___T____xt______________________ locked,slab,writeback,anonymous,compound_tail,ksm,thp In this output, "locked" and "writeback" flags are completely pointless because these are encoded in folio->_flags_1 via folio_set_order() and those pages are actually not locked nor written back. As for "anonymous" and "ksm" flags, these are encoded in folio->mapping and the actual value is like 0xdead000000000003. I'm not sure how this value is set, but according to the comment in include/linux/page-flags.h: > * For slab pages, since slab reuses the bits in struct page to store its > * internal states, the page->mapping does not exist as such, nor do these > * flags below. So in order to avoid testing non-existent bits, please > * make sure that PageSlab(page) actually evaluates to false before calling > * the following functions (e.g., PageAnon). See mm/slab.h. , so we don't have to check PageAnon and PageKsm for slab pages. So return immediately when finding slab tail pages. Note that KPF_HWPOISON is special and it can be helpful to make it visible in /prock/kpageflag even on compound tail pages. After this patch, `page-types -r -b slab` command shows the following simpler output (without any invalid flags). 0x0000000000000080 5659 22 _______S_____________________________________ slab 0x0000000000008080 1644 6 _______S_______H_____________________________ slab,compound_head 0x0000000000010080 6196 24 _______S________T____________________________ slab,compound_tail Signed-off-by: Naoya Horiguchi --- fs/proc/page.c | 44 ++++++++++++++++++++++---------------------- 1 file changed, 22 insertions(+), 22 deletions(-) diff --git a/fs/proc/page.c b/fs/proc/page.c index 9b6ded8a2c90..899b96a26fbd 100644 --- a/fs/proc/page.c +++ b/fs/proc/page.c @@ -122,18 +122,18 @@ u64 stable_page_flags(struct page *page) k = page->flags; u = 0; - /* - * pseudo flags for the well known (anonymous) memory mapped pages - * - * Note that page->_mapcount is overloaded in SLAB, so the - * simple test in page_mapped() is not enough. - */ - if (!PageSlab(page) && page_mapped(page)) - u |= 1 << KPF_MMAP; - if (PageAnon(page)) - u |= 1 << KPF_ANON; - if (PageKsm(page)) - u |= 1 << KPF_KSM; +#ifdef CONFIG_MEMORY_FAILURE + u |= kpf_copy_bit(k, KPF_HWPOISON, PG_hwpoison); +#endif + + if (PageSlab(page)) { + u |= 1 << KPF_SLAB; + if (PageHead(page)) + u |= 1 << KPF_COMPOUND_HEAD; + if (PageTail(page)) + u |= 1 << KPF_COMPOUND_TAIL; + return u; + } if (PageHuge(page)) { u |= 1 << KPF_HUGE; @@ -173,9 +173,18 @@ u64 stable_page_flags(struct page *page) } else if (is_zero_pfn(page_to_pfn(page))) u |= 1 << KPF_ZERO_PAGE; + /* + * pseudo flags for the well known (anonymous) memory mapped pages + */ + if (page_mapped(page)) + u |= 1 << KPF_MMAP; + if (PageAnon(page)) + u |= 1 << KPF_ANON; + if (PageKsm(page)) + u |= 1 << KPF_KSM; /* - * Caveats on high order pages: PG_buddy and PG_slab will only be set + * Caveats on high order pages: PG_buddy will only be set * on the head page. */ if (PageBuddy(page)) @@ -192,11 +201,6 @@ u64 stable_page_flags(struct page *page) u |= 1 << KPF_IDLE; u |= kpf_copy_bit(k, KPF_LOCKED, PG_locked); - - u |= kpf_copy_bit(k, KPF_SLAB, PG_slab); - if (PageTail(page) && PageSlab(page)) - u |= 1 << KPF_SLAB; - u |= kpf_copy_bit(k, KPF_ERROR, PG_error); u |= kpf_copy_bit(k, KPF_DIRTY, PG_dirty); u |= kpf_copy_bit(k, KPF_UPTODATE, PG_uptodate); @@ -214,10 +218,6 @@ u64 stable_page_flags(struct page *page) u |= kpf_copy_bit(k, KPF_UNEVICTABLE, PG_unevictable); u |= kpf_copy_bit(k, KPF_MLOCKED, PG_mlocked); -#ifdef CONFIG_MEMORY_FAILURE - u |= kpf_copy_bit(k, KPF_HWPOISON, PG_hwpoison); -#endif - #ifdef CONFIG_ARCH_USES_PG_UNCACHED u |= kpf_copy_bit(k, KPF_UNCACHED, PG_uncached); #endif -- 2.25.1