From: Naoya Horiguchi <naoya.horiguchi@linux.dev>
To: linux-mm@kvack.org
Cc: Andrew Morton <akpm@linux-foundation.org>,
Matthew Wilcox <willy@infradead.org>,
David Hildenbrand <david@redhat.com>,
"Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>,
Mike Kravetz <mike.kravetz@oracle.com>,
Miaohe Lin <linmiaohe@huawei.com>,
Vlastimil Babka <vbabka@suse.cz>,
Muchun Song <songmuchun@bytedance.com>,
Naoya Horiguchi <naoya.horiguchi@nec.com>,
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 [thread overview]
Message-ID: <20231010142801.3780917-5-naoya.horiguchi@linux.dev> (raw)
In-Reply-To: <20231010142801.3780917-1-naoya.horiguchi@linux.dev>
From: Naoya Horiguchi <naoya.horiguchi@nec.com>
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 <naoya.horiguchi@nec.com>
---
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
next prev parent reply other threads:[~2023-10-10 14:30 UTC|newest]
Thread overview: 15+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-10 14:27 [PATCH v1 0/5] mm, kpageflags: support folio and fix output for compound pages Naoya Horiguchi
2023-10-10 14:27 ` [PATCH v1 1/5] include/uapi/linux/kernel-page-flags.h: define KPF_FOLIO Naoya Horiguchi
2023-10-10 14:27 ` [PATCH v1 2/5] mm: kpageflags: distinguish thp and folio Naoya Horiguchi
2023-10-10 14:27 ` [PATCH v1 3/5] mm, kpageflags: separate code path for hugetlb pages Naoya Horiguchi
2023-10-10 14:28 ` Naoya Horiguchi [this message]
2023-10-10 14:28 ` [PATCH v1 5/5] tools/mm/page-types.c: hide compound pages in non-raw mode Naoya Horiguchi
2023-10-12 8:33 ` [PATCH v1 0/5] mm, kpageflags: support folio and fix output for compound pages David Hildenbrand
2023-10-12 15:02 ` Naoya Horiguchi
2023-10-12 15:30 ` David Hildenbrand
2023-10-13 0:54 ` Naoya Horiguchi
2023-10-13 7:46 ` David Hildenbrand
2023-10-13 15:03 ` Matthew Wilcox
2023-10-16 10:13 ` David Hildenbrand
2023-10-16 11:36 ` Ryan Roberts
2023-10-18 5:25 ` Naoya Horiguchi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20231010142801.3780917-5-naoya.horiguchi@linux.dev \
--to=naoya.horiguchi@linux.dev \
--cc=akpm@linux-foundation.org \
--cc=david@redhat.com \
--cc=kirill.shutemov@linux.intel.com \
--cc=linmiaohe@huawei.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=mike.kravetz@oracle.com \
--cc=naoya.horiguchi@nec.com \
--cc=songmuchun@bytedance.com \
--cc=vbabka@suse.cz \
--cc=willy@infradead.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.