mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 12:43:29 +02:00
mm, printk: introduce new format %pGt for page_type
%pGp format is used to display 'flags' field of a struct page. However, some page flags (i.e. PG_buddy, see page-flags.h for more details) are stored in page_type field. To display human-readable output of page_type, introduce %pGt format. It is important to note the meaning of bits are different in page_type. if page_type is 0xffffffff, no flags are set. Setting PG_buddy (0x00000080) flag results in a page_type of 0xffffff7f. Clearing a bit actually means setting a flag. Bits in page_type are inverted when displaying type names. Only values for which page_type_has_type() returns true are considered as page_type, to avoid confusion with mapcount values. if it returns false, only raw values are displayed and not page type names. Link: https://lkml.kernel.org/r/20230130042514.2418-3-42.hyeyoo@gmail.com Signed-off-by: Hyeonggon Yoo <42.hyeyoo@gmail.com> Reviewed-by: Petr Mladek <pmladek@suse.com> [vsprintf part] Cc: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Cc: David Hildenbrand <david@redhat.com> Cc: Joe Perches <joe@perches.com> Cc: John Ogness <john.ogness@linutronix.de> Cc: Matthew Wilcox <willy@infradead.org> Cc: Sergey Senozhatsky <senozhatsky@chromium.org> Cc: Steven Rostedt (Google) <rostedt@goodmis.org> Cc: Vlastimil Babka <vbabka@suse.cz> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
e26fcc02c7
commit
4c85c0be3d
@@ -2052,6 +2052,25 @@ char *format_page_flags(char *buf, char *end, unsigned long flags)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static
|
||||
char *format_page_type(char *buf, char *end, unsigned int page_type)
|
||||
{
|
||||
buf = number(buf, end, page_type, default_flag_spec);
|
||||
|
||||
if (buf < end)
|
||||
*buf = '(';
|
||||
buf++;
|
||||
|
||||
if (page_type_has_type(page_type))
|
||||
buf = format_flags(buf, end, ~page_type, pagetype_names);
|
||||
|
||||
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)
|
||||
@@ -2065,6 +2084,8 @@ char *flags_string(char *buf, char *end, void *flags_ptr,
|
||||
switch (fmt[1]) {
|
||||
case 'p':
|
||||
return format_page_flags(buf, end, *(unsigned long *)flags_ptr);
|
||||
case 't':
|
||||
return format_page_type(buf, end, *(unsigned int *)flags_ptr);
|
||||
case 'v':
|
||||
flags = *(unsigned long *)flags_ptr;
|
||||
names = vmaflag_names;
|
||||
|
Reference in New Issue
Block a user