lkml.org 
[lkml]   [2021]   [Jan]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    SubjectRe: [PATCH 3/3] printk: dump full information of page flags in pGp
    From
    Date
    On 1/28/21 3:19 AM, Yafang Shao wrote:
    > 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,
    > [ 6312.639698] ERR: Slab 0x000000006d1133b9 objects=33 used=3 fp=0x000000006d0779d1 flags=0x17ffffc0010200(slab|head)
    >
    > - After the patch,
    > [ 6315.235783] ERR: Slab 0x000000006d1133b9 objects=33 used=3 fp=0x000000006d0779d1 flags=0x17ffffc0010200(Node 0x0,Zone 0x2,Lastcpupid 0x1fffff,slab|head)

    node, zone could be decimal?
    Thanks

    >
    > Cc: David Hildenbrand <david@redhat.com>
    > Signed-off-by: Yafang Shao <laoar.shao@gmail.com>
    > ---
    > lib/vsprintf.c | 42 +++++++++++++++++++++++++++++++++++++++++-
    > 1 file changed, 41 insertions(+), 1 deletion(-)
    >
    > diff --git a/lib/vsprintf.c b/lib/vsprintf.c
    > index 3b53c73580c5..bd809f4f1b82 100644
    > --- a/lib/vsprintf.c
    > +++ b/lib/vsprintf.c
    > @@ -1916,6 +1916,46 @@ char *format_flags(char *buf, char *end, unsigned long flags,
    > return buf;
    > }
    >
    > +struct page_flags_layout {
    > + int width;
    > + int shift;
    > + int mask;
    > + char *name;
    > +};
    > +
    > +struct page_flags_layout pfl[] = {
    > + {SECTIONS_WIDTH, SECTIONS_PGSHIFT, SECTIONS_MASK, "Section "},
    > + {NODES_WIDTH, NODES_PGSHIFT, NODES_MASK, "Node "},
    > + {ZONES_WIDTH, ZONES_PGSHIFT, ZONES_MASK, "Zone "},
    > + {LAST_CPUPID_WIDTH, LAST_CPUPID_PGSHIFT, LAST_CPUPID_MASK, "Lastcpupid "},
    > + {KASAN_TAG_WIDTH, KASAN_TAG_PGSHIFT, KASAN_TAG_MASK, "Kasantag "},
    > +};
    > +
    > +static
    > +char *format_layout(char *buf, char *end, unsigned long flags)
    > +{
    > + int i;
    > +
    > + for (i = 0; i < sizeof(pfl) / sizeof(struct page_flags_layout) && buf < end; i++) {
    > + if (pfl[i].width == 0)
    > + continue;
    > +
    > + buf = string(buf, end, pfl[i].name, default_str_spec);
    > +
    > + if (buf >= end)
    > + break;
    > + buf = number(buf, end, (flags >> pfl[i].shift) & pfl[i].mask,
    > + default_flag_spec);
    > +
    > + if (buf >= end)
    > + break;
    > + *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 +1969,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_layout(buf, end, flags & ~((1UL << NR_PAGEFLAGS) - 1));
    > flags &= (1UL << NR_PAGEFLAGS) - 1;
    > names = pageflag_names;
    > break;
    >

    \
     
     \ /
      Last update: 2021-01-28 11:44    [W:4.129 / U:0.040 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site