linux-mm.kvack.org archive mirror
 help / color / mirror / Atom feed
From: Yafang Shao <laoar.shao@gmail.com>
To: andriy.shevchenko@linux.intel.com, david@redhat.com,
	vbabka@suse.cz, linmiaohe@huawei.com, cl@linux.com,
	penberg@kernel.org, rientjes@google.com, iamjoonsoo.kim@lge.com,
	akpm@linux-foundation.org, pmladek@suse.com, rostedt@goodmis.org,
	sergey.senozhatsky@gmail.com, linux@rasmusvillemoes.dk
Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org,
	Yafang Shao <laoar.shao@gmail.com>, Joe Perches <joe@perches.com>
Subject: [PATCH v2 3/3] vsprintf: dump full information of page flags in pGp
Date: Mon,  1 Feb 2021 19:56:10 +0800	[thread overview]
Message-ID: <20210201115610.87808-4-laoar.shao@gmail.com> (raw)
In-Reply-To: <20210201115610.87808-1-laoar.shao@gmail.com>

Currently the pGp only shows the names of page flags, rather than
the full information including section, node, zone, last cpupid and
kasan tag. While it is not easy to parse these information manually
because there're so many flavors. Let's interpret them in pGp as well.

- Before the patch,
[ 6343.396602] Slab 0x000000004382e02b objects=33 used=3 fp=0x000000009ae06ffc flags=0x17ffffc0010200(slab|head)

- After the patch,
[ 6871.296131] Slab 0x00000000c0e19a37 objects=33 used=3 fp=0x00000000c4902159 flags=0x17ffffc0010200(Node 0,Zone 2,Lastcpupid 0x1fffff,slab|head)

The Documentation and test cases are also updated.

Cc: David Hildenbrand <david@redhat.com>
Cc: Joe Perches <joe@perches.com>
Cc: Miaohe Lin <linmiaohe@huawei.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
---
 Documentation/core-api/printk-formats.rst |  2 +-
 lib/test_printf.c                         | 65 ++++++++++++++++++-----
 lib/vsprintf.c                            | 58 +++++++++++++++++++-
 3 files changed, 109 insertions(+), 16 deletions(-)

diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst
index 6d26c5c6ac48..1374cdd04f0f 100644
--- a/Documentation/core-api/printk-formats.rst
+++ b/Documentation/core-api/printk-formats.rst
@@ -538,7 +538,7 @@ Flags bitfields such as page flags, gfp_flags
 
 ::
 
-	%pGp	referenced|uptodate|lru|active|private
+	%pGp	Node 0,Zone 2,referenced|uptodate|lru|active|private
 	%pGg	GFP_USER|GFP_DMA32|GFP_NOWARN
 	%pGv	read|exec|mayread|maywrite|mayexec|denywrite
 
diff --git a/lib/test_printf.c b/lib/test_printf.c
index 7ac87f18a10f..4c5e064cbe2e 100644
--- a/lib/test_printf.c
+++ b/lib/test_printf.c
@@ -569,6 +569,48 @@ netdev_features(void)
 {
 }
 
+static void __init
+page_flags_test(int section, int node, int zone, int last_cpupid,
+		int kasan_tag, int flags, const char *name, char *cmp_buf)
+{
+	unsigned long page_flags = 0;
+	unsigned long size = 0;
+
+#ifdef SECTION_IN_PAGE_FLAGS
+	page_flags |= (sec & SECTIONS_MASK) << SECTIONS_PGSHIFT;
+	snprintf(cmp_buf, BUF_SIZE, "Section %#x,", sec);
+	size = strlen(cmp_buf);
+#endif
+
+	page_flags |= (node & NODES_MASK) << NODES_PGSHIFT;
+	snprintf(cmp_buf + size, BUF_SIZE - size, "Node %d", node);
+	size = strlen(cmp_buf);
+
+	page_flags |= (zone & ZONES_MASK) << ZONES_PGSHIFT;
+	snprintf(cmp_buf + size, BUF_SIZE - size, ",Zone %d", zone);
+	size = strlen(cmp_buf);
+
+#ifndef LAST_CPUPID_NOT_IN_PAGE_FLAGS
+	page_flags |= (last_cpupid & LAST_CPUPID_MASK) << LAST_CPUPID_PGSHIFT;
+	snprintf(cmp_buf + size, BUF_SIZE - size, ",Lastcpupid %#x", last_cpupid);
+	size = strlen(cmp_buf);
+#endif
+
+#if defined(CONFIG_KASAN_SW_TAGS) || defined(CONFIG_KASAN_HW_TAGS)
+	page_flags |= (tag & KASAN_TAG_MASK) << KASAN_TAG_PGSHIFT;
+	snprintf(cmp_buf + size, BUF_SIZE - size, ",Kasantag %#x", tag);
+	size = strlen(cmp_buf);
+#endif
+
+	test(cmp_buf, "%pGp", &page_flags);
+
+	if (flags) {
+		page_flags |= flags;
+		snprintf(cmp_buf + size, BUF_SIZE - size, ",%s", name);
+		test(cmp_buf, "%pGp", &page_flags);
+	}
+}
+
 static void __init
 flags(void)
 {
@@ -576,17 +618,16 @@ flags(void)
 	gfp_t gfp;
 	char *cmp_buffer;
 
-	flags = 0;
-	test("", "%pGp", &flags);
-
-	/* Page flags should filter the zone id */
-	flags = 1UL << NR_PAGEFLAGS;
-	test("", "%pGp", &flags);
-
-	flags |= 1UL << PG_uptodate | 1UL << PG_dirty | 1UL << PG_lru
-		| 1UL << PG_active | 1UL << PG_swapbacked;
-	test("uptodate|dirty|lru|active|swapbacked", "%pGp", &flags);
+	cmp_buffer = kmalloc(BUF_SIZE, GFP_KERNEL);
+	if (!cmp_buffer)
+		return;
 
+	page_flags_test(0, 0, 0, 0, 0, 0, NULL, cmp_buffer);
+	page_flags_test(1, 1, 1, 0x1ffff, 1,
+			(1UL << PG_uptodate | 1UL << PG_dirty | 1UL << PG_lru
+			 | 1UL << PG_active | 1UL << PG_swapbacked),
+			"uptodate|dirty|lru|active|swapbacked",
+			cmp_buffer);
 
 	flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC
 			| VM_DENYWRITE;
@@ -601,10 +642,6 @@ flags(void)
 	gfp = __GFP_ATOMIC;
 	test("__GFP_ATOMIC", "%pGg", &gfp);
 
-	cmp_buffer = kmalloc(BUF_SIZE, GFP_KERNEL);
-	if (!cmp_buffer)
-		return;
-
 	/* Any flags not translated by the table should remain numeric */
 	gfp = ~__GFP_BITS_MASK;
 	snprintf(cmp_buffer, BUF_SIZE, "%#lx", (unsigned long) gfp);
diff --git a/lib/vsprintf.c b/lib/vsprintf.c
index 14c9a6af1b23..5c2b02ad60f1 100644
--- a/lib/vsprintf.c
+++ b/lib/vsprintf.c
@@ -1916,6 +1916,62 @@ char *format_flags(char *buf, char *end, unsigned long flags,
 	return buf;
 }
 
+struct page_flags_layout {
+	int width;
+	int shift;
+	int mask;
+	const struct printf_spec *spec;
+	const char *name;
+};
+
+static const struct page_flags_layout pfl[] = {
+	{SECTIONS_WIDTH, SECTIONS_PGSHIFT, SECTIONS_MASK,
+	 &default_dec_spec, "Section "},
+	{NODES_WIDTH, NODES_PGSHIFT, NODES_MASK,
+	 &default_dec_spec, "Node "},
+	{ZONES_WIDTH, ZONES_PGSHIFT, ZONES_MASK,
+	 &default_dec_spec, "Zone "},
+	{LAST_CPUPID_WIDTH, LAST_CPUPID_PGSHIFT, LAST_CPUPID_MASK,
+	 &default_flag_spec, "Lastcpupid "},
+	{KASAN_TAG_WIDTH, KASAN_TAG_PGSHIFT, KASAN_TAG_MASK,
+	 &default_flag_spec, "Kasantag "},
+};
+
+static
+char *format_page_flags(char *buf, char *end, unsigned long page_flags)
+{
+	unsigned long flags = page_flags & ((1UL << NR_PAGEFLAGS) - 1);
+	int size = ARRAY_SIZE(pfl);
+	bool separator = false;
+	int i;
+
+	for (i = 0; i < size; i++) {
+		if (pfl[i].width == 0)
+			continue;
+
+		if (separator) {
+			if (buf < end)
+				*buf = ',';
+			buf++;
+		}
+
+
+		buf = string(buf, end, pfl[i].name, *pfl[i].spec);
+
+		buf = number(buf, end, (page_flags >> pfl[i].shift) & pfl[i].mask,
+			     *pfl[i].spec);
+		separator = true;
+	}
+
+	if (flags) {
+		if (buf < end)
+			*buf = ',';
+		buf++;
+	}
+
+	return buf;
+}
+
 static noinline_for_stack
 char *flags_string(char *buf, char *end, void *flags_ptr,
 		   struct printf_spec spec, const char *fmt)
@@ -1929,7 +1985,7 @@ char *flags_string(char *buf, char *end, void *flags_ptr,
 	switch (fmt[1]) {
 	case 'p':
 		flags = *(unsigned long *)flags_ptr;
-		/* Remove zone id */
+		buf = format_page_flags(buf, end, flags);
 		flags &= (1UL << NR_PAGEFLAGS) - 1;
 		names = pageflag_names;
 		break;
-- 
2.17.1



  parent reply	other threads:[~2021-02-01 11:57 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-02-01 11:56 [PATCH v2 0/3] mm, vsprintf: dump full information of page flags in pGp Yafang Shao
2021-02-01 11:56 ` [PATCH v2 1/3] mm, slub: use pGp to print page flags Yafang Shao
2021-02-01 11:56 ` [PATCH v2 2/3] mm, slub: don't combine pr_err with INFO Yafang Shao
2021-02-01 11:56 ` Yafang Shao [this message]
2021-02-01 13:05   ` [PATCH v2 3/3] vsprintf: dump full information of page flags in pGp Joe Perches
2021-02-01 13:27     ` Yafang Shao
2021-02-01 13:23   ` David Hildenbrand
2021-02-01 13:32     ` David Hildenbrand
2021-02-01 13:34     ` Andy Shevchenko
2021-02-01 13:52       ` Yafang Shao
2021-02-01 16:03         ` Andy Shevchenko
2021-02-01 13:27   ` Andy Shevchenko
2021-02-01 13:49     ` Yafang Shao
2021-02-01 16:16       ` Andy Shevchenko
2021-02-01 16:20         ` Andy Shevchenko
2021-02-02 13:25         ` Yafang Shao
2021-02-01 14:15   ` Matthew Wilcox
2021-02-01 14:44     ` Yafang Shao
2021-02-01 18:51     ` Joe Perches
2021-02-01 18:59       ` Matthew Wilcox

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=20210201115610.87808-4-laoar.shao@gmail.com \
    --to=laoar.shao@gmail.com \
    --cc=akpm@linux-foundation.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=cl@linux.com \
    --cc=david@redhat.com \
    --cc=iamjoonsoo.kim@lge.com \
    --cc=joe@perches.com \
    --cc=linmiaohe@huawei.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=linux@rasmusvillemoes.dk \
    --cc=penberg@kernel.org \
    --cc=pmladek@suse.com \
    --cc=rientjes@google.com \
    --cc=rostedt@goodmis.org \
    --cc=sergey.senozhatsky@gmail.com \
    --cc=vbabka@suse.cz \
    /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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).