mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
printf: remove %pGt support
Patch series "Increase the number of bits available in page_type". Kent wants more than 16 bits in page_type, so I resurrected this old patch and expanded it a bit. It's a bit more efficient than our current scheme (1 4-byte insn vs 3 insns of 13 bytes total) to test a single page type. This patch (of 4): An upcoming patch will convert page type from being a bitfield to a single byte, so we will not be able to use %pG to print the page type any more. The printing of the symbolic name will be restored in that patch. Link: https://lkml.kernel.org/r/20240821173914.2270383-1-willy@infradead.org Link: https://lkml.kernel.org/r/20240821173914.2270383-2-willy@infradead.org Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org> Acked-by: David Hildenbrand <david@redhat.com> Cc: Hyeonggon Yoo <42.hyeyoo@gmail.com> Cc: Kent Overstreet <kent.overstreet@linux.dev> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
parent
f28bdd1b17
commit
e27ad6560e
@ -576,13 +576,12 @@ The field width is passed by value, the bitmap is passed by reference.
|
|||||||
Helper macros cpumask_pr_args() and nodemask_pr_args() are available to ease
|
Helper macros cpumask_pr_args() and nodemask_pr_args() are available to ease
|
||||||
printing cpumask and nodemask.
|
printing cpumask and nodemask.
|
||||||
|
|
||||||
Flags bitfields such as page flags, page_type, gfp_flags
|
Flags bitfields such as page flags and gfp_flags
|
||||||
--------------------------------------------------------
|
--------------------------------------------------------
|
||||||
|
|
||||||
::
|
::
|
||||||
|
|
||||||
%pGp 0x17ffffc0002036(referenced|uptodate|lru|active|private|node=0|zone=2|lastcpupid=0x1fffff)
|
%pGp 0x17ffffc0002036(referenced|uptodate|lru|active|private|node=0|zone=2|lastcpupid=0x1fffff)
|
||||||
%pGt 0xffffff7f(buddy)
|
|
||||||
%pGg GFP_USER|GFP_DMA32|GFP_NOWARN
|
%pGg GFP_USER|GFP_DMA32|GFP_NOWARN
|
||||||
%pGv read|exec|mayread|maywrite|mayexec|denywrite
|
%pGv read|exec|mayread|maywrite|mayexec|denywrite
|
||||||
|
|
||||||
@ -591,7 +590,6 @@ would construct the value. The type of flags is given by the third
|
|||||||
character. Currently supported are:
|
character. Currently supported are:
|
||||||
|
|
||||||
- p - [p]age flags, expects value of type (``unsigned long *``)
|
- p - [p]age flags, expects value of type (``unsigned long *``)
|
||||||
- t - page [t]ype, expects value of type (``unsigned int *``)
|
|
||||||
- v - [v]ma_flags, expects value of type (``unsigned long *``)
|
- v - [v]ma_flags, expects value of type (``unsigned long *``)
|
||||||
- g - [g]fp_flags, expects value of type (``gfp_t *``)
|
- g - [g]fp_flags, expects value of type (``gfp_t *``)
|
||||||
|
|
||||||
|
@ -130,16 +130,6 @@ IF_HAVE_PG_ARCH_X(arch_3)
|
|||||||
__def_pageflag_names \
|
__def_pageflag_names \
|
||||||
) : "none"
|
) : "none"
|
||||||
|
|
||||||
#define DEF_PAGETYPE_NAME(_name) { PG_##_name, __stringify(_name) }
|
|
||||||
|
|
||||||
#define __def_pagetype_names \
|
|
||||||
DEF_PAGETYPE_NAME(slab), \
|
|
||||||
DEF_PAGETYPE_NAME(hugetlb), \
|
|
||||||
DEF_PAGETYPE_NAME(offline), \
|
|
||||||
DEF_PAGETYPE_NAME(guard), \
|
|
||||||
DEF_PAGETYPE_NAME(table), \
|
|
||||||
DEF_PAGETYPE_NAME(buddy)
|
|
||||||
|
|
||||||
#if defined(CONFIG_X86)
|
#if defined(CONFIG_X86)
|
||||||
#define __VM_ARCH_SPECIFIC_1 {VM_PAT, "pat" }
|
#define __VM_ARCH_SPECIFIC_1 {VM_PAT, "pat" }
|
||||||
#elif defined(CONFIG_PPC)
|
#elif defined(CONFIG_PPC)
|
||||||
|
@ -641,26 +641,12 @@ page_flags_test(int section, int node, int zone, int last_cpupid,
|
|||||||
test(cmp_buf, "%pGp", &flags);
|
test(cmp_buf, "%pGp", &flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init page_type_test(unsigned int page_type, const char *name,
|
|
||||||
char *cmp_buf)
|
|
||||||
{
|
|
||||||
unsigned long size;
|
|
||||||
|
|
||||||
size = scnprintf(cmp_buf, BUF_SIZE, "%#x(", page_type);
|
|
||||||
if (page_type_has_type(page_type))
|
|
||||||
size += scnprintf(cmp_buf + size, BUF_SIZE - size, "%s", name);
|
|
||||||
|
|
||||||
snprintf(cmp_buf + size, BUF_SIZE - size, ")");
|
|
||||||
test(cmp_buf, "%pGt", &page_type);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init
|
static void __init
|
||||||
flags(void)
|
flags(void)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
char *cmp_buffer;
|
char *cmp_buffer;
|
||||||
gfp_t gfp;
|
gfp_t gfp;
|
||||||
unsigned int page_type;
|
|
||||||
|
|
||||||
cmp_buffer = kmalloc(BUF_SIZE, GFP_KERNEL);
|
cmp_buffer = kmalloc(BUF_SIZE, GFP_KERNEL);
|
||||||
if (!cmp_buffer)
|
if (!cmp_buffer)
|
||||||
@ -700,18 +686,6 @@ flags(void)
|
|||||||
gfp |= __GFP_HIGH;
|
gfp |= __GFP_HIGH;
|
||||||
test(cmp_buffer, "%pGg", &gfp);
|
test(cmp_buffer, "%pGg", &gfp);
|
||||||
|
|
||||||
page_type = ~0;
|
|
||||||
page_type_test(page_type, "", cmp_buffer);
|
|
||||||
|
|
||||||
page_type = 10;
|
|
||||||
page_type_test(page_type, "", cmp_buffer);
|
|
||||||
|
|
||||||
page_type = ~PG_buddy;
|
|
||||||
page_type_test(page_type, "buddy", cmp_buffer);
|
|
||||||
|
|
||||||
page_type = ~(PG_table | PG_buddy);
|
|
||||||
page_type_test(page_type, "table|buddy", cmp_buffer);
|
|
||||||
|
|
||||||
kfree(cmp_buffer);
|
kfree(cmp_buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2054,25 +2054,6 @@ char *format_page_flags(char *buf, char *end, unsigned long flags)
|
|||||||
return buf;
|
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
|
static noinline_for_stack
|
||||||
char *flags_string(char *buf, char *end, void *flags_ptr,
|
char *flags_string(char *buf, char *end, void *flags_ptr,
|
||||||
struct printf_spec spec, const char *fmt)
|
struct printf_spec spec, const char *fmt)
|
||||||
@ -2086,8 +2067,6 @@ char *flags_string(char *buf, char *end, void *flags_ptr,
|
|||||||
switch (fmt[1]) {
|
switch (fmt[1]) {
|
||||||
case 'p':
|
case 'p':
|
||||||
return format_page_flags(buf, end, *(unsigned long *)flags_ptr);
|
return format_page_flags(buf, end, *(unsigned long *)flags_ptr);
|
||||||
case 't':
|
|
||||||
return format_page_type(buf, end, *(unsigned int *)flags_ptr);
|
|
||||||
case 'v':
|
case 'v':
|
||||||
flags = *(unsigned long *)flags_ptr;
|
flags = *(unsigned long *)flags_ptr;
|
||||||
names = vmaflag_names;
|
names = vmaflag_names;
|
||||||
|
@ -92,7 +92,7 @@ static void __dump_folio(struct folio *folio, struct page *page,
|
|||||||
pr_warn("%sflags: %pGp%s\n", type, &folio->flags,
|
pr_warn("%sflags: %pGp%s\n", type, &folio->flags,
|
||||||
is_migrate_cma_folio(folio, pfn) ? " CMA" : "");
|
is_migrate_cma_folio(folio, pfn) ? " CMA" : "");
|
||||||
if (page_has_type(&folio->page))
|
if (page_has_type(&folio->page))
|
||||||
pr_warn("page_type: %pGt\n", &folio->page.page_type);
|
pr_warn("page_type: %x\n", folio->page.page_type);
|
||||||
|
|
||||||
print_hex_dump(KERN_WARNING, "raw: ", DUMP_PREFIX_NONE, 32,
|
print_hex_dump(KERN_WARNING, "raw: ", DUMP_PREFIX_NONE, 32,
|
||||||
sizeof(unsigned long), page,
|
sizeof(unsigned long), page,
|
||||||
|
@ -1144,7 +1144,6 @@ static inline void flush_tlb_batched_pending(struct mm_struct *mm)
|
|||||||
#endif /* CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH */
|
#endif /* CONFIG_ARCH_WANT_BATCHED_UNMAP_TLB_FLUSH */
|
||||||
|
|
||||||
extern const struct trace_print_flags pageflag_names[];
|
extern const struct trace_print_flags pageflag_names[];
|
||||||
extern const struct trace_print_flags pagetype_names[];
|
|
||||||
extern const struct trace_print_flags vmaflag_names[];
|
extern const struct trace_print_flags vmaflag_names[];
|
||||||
extern const struct trace_print_flags gfpflag_names[];
|
extern const struct trace_print_flags gfpflag_names[];
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user