tracing: gfp: Fix the GFP enum values shown for user space tracing tools

Tracing tools like perf and trace-cmd read the /sys/kernel/tracing/events/*/*/format
files to know how to parse the data and also how to print it. For the
"print fmt" portion of that file, if anything uses an enum that is not
exported to the tracing system, user space will not be able to parse it.

The GFP flags use to be defines, and defines get translated in the print
fmt sections. But now they are converted to use enums, which is not.

The mm_page_alloc trace event format use to have:

print fmt: "page=%p pfn=0x%lx order=%d migratetype=%d gfp_flags=%s",
REC->pfn != -1UL ? (((struct page *)vmemmap_base) + (REC->pfn)) : ((void
*)0), REC->pfn != -1UL ? REC->pfn : 0, REC->order, REC->migratetype,
(REC->gfp_flags) ? __print_flags(REC->gfp_flags, "|", {( unsigned
long)(((((((( gfp_t)(0x400u|0x800u)) | (( gfp_t)0x40u) | (( gfp_t)0x80u) |
(( gfp_t)0x100000u)) | (( gfp_t)0x02u)) | (( gfp_t)0x08u) | (( gfp_t)0)) |
(( gfp_t)0x40000u) | (( gfp_t)0x80000u) | (( gfp_t)0x2000u)) & ~((
gfp_t)(0x400u|0x800u))) | (( gfp_t)0x400u)), "GFP_TRANSHUGE"}, {( unsigned
long)((((((( gfp_t)(0x400u|0x800u)) | (( gfp_t)0x40u) | (( gfp_t)0x80u) |
(( gfp_t)0x100000u)) | (( gfp_t)0x02u)) | (( gfp_t)0x08u) | (( gfp_t)0)) ...

Where the GFP values are shown and not their names. But after the GFP
flags were converted to use enums, it has:

print fmt: "page=%p pfn=0x%lx order=%d migratetype=%d gfp_flags=%s",
REC->pfn != -1UL ? (vmemmap + (REC->pfn)) : ((void *)0), REC->pfn != -1UL
? REC->pfn : 0, REC->order, REC->migratetype, (REC->gfp_flags) ?
__print_flags(REC->gfp_flags, "|", {( unsigned long)((((((((
gfp_t)(((((1UL))) << (___GFP_DIRECT_RECLAIM_BIT))|((((1UL))) <<
(___GFP_KSWAPD_RECLAIM_BIT)))) | (( gfp_t)((((1UL))) << (___GFP_IO_BIT)))
| (( gfp_t)((((1UL))) << (___GFP_FS_BIT))) | (( gfp_t)((((1UL))) <<
(___GFP_HARDWALL_BIT)))) | (( gfp_t)((((1UL))) << (___GFP_HIGHMEM_BIT))))
| (( gfp_t)((((1UL))) << (___GFP_MOVABLE_BIT))) | (( gfp_t)0)) | ((
gfp_t)((((1UL))) << (___GFP_COMP_BIT))) ...

Where the enums names like ___GFP_KSWAPD_RECLAIM_BIT are shown and not their
values. User space has no way to convert these names to their values and
the output will fail to parse. What is shown is now:

mm_page_alloc: page=0xffffffff981685f3 pfn=0x1d1ac1 order=0 migratetype=1 gfp_flags=0x140cca

The TRACE_DEFINE_ENUM() macro was created to handle enums in the print fmt
files. This causes them to be replaced at boot up with the numbers, so
that user space tooling can parse it. By using this macro, the output is
back to the human readable:

mm_page_alloc: page=0xffffffff981685f3 pfn=0x122233 order=0 migratetype=1 gfp_flags=GFP_HIGHUSER_MOVABLE|__GFP_COMP

Cc: stable@vger.kernel.org
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Veronika Molnarova <vmolnaro@redhat.com>
Cc: Suren Baghdasaryan <surenb@google.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Link: https://lore.kernel.org/20250116214438.749504792@goodmis.org
Reported-by: Michael Petlan <mpetlan@redhat.com>
Closes: https://lore.kernel.org/all/87be5f7c-1a0-dad-daa0-54e342efaea7@redhat.com/
Fixes: 772dd0342727c ("mm: enumerate all gfp flags")
Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>

Changed files
+63
include
trace
events
+63
include/trace/events/mmflags.h
··· 13 13 * Thus most bits set go first. 14 14 */ 15 15 16 + /* These define the values that are enums (the bits) */ 17 + #define TRACE_GFP_FLAGS_GENERAL \ 18 + TRACE_GFP_EM(DMA) \ 19 + TRACE_GFP_EM(HIGHMEM) \ 20 + TRACE_GFP_EM(DMA32) \ 21 + TRACE_GFP_EM(MOVABLE) \ 22 + TRACE_GFP_EM(RECLAIMABLE) \ 23 + TRACE_GFP_EM(HIGH) \ 24 + TRACE_GFP_EM(IO) \ 25 + TRACE_GFP_EM(FS) \ 26 + TRACE_GFP_EM(ZERO) \ 27 + TRACE_GFP_EM(DIRECT_RECLAIM) \ 28 + TRACE_GFP_EM(KSWAPD_RECLAIM) \ 29 + TRACE_GFP_EM(WRITE) \ 30 + TRACE_GFP_EM(NOWARN) \ 31 + TRACE_GFP_EM(RETRY_MAYFAIL) \ 32 + TRACE_GFP_EM(NOFAIL) \ 33 + TRACE_GFP_EM(NORETRY) \ 34 + TRACE_GFP_EM(MEMALLOC) \ 35 + TRACE_GFP_EM(COMP) \ 36 + TRACE_GFP_EM(NOMEMALLOC) \ 37 + TRACE_GFP_EM(HARDWALL) \ 38 + TRACE_GFP_EM(THISNODE) \ 39 + TRACE_GFP_EM(ACCOUNT) \ 40 + TRACE_GFP_EM(ZEROTAGS) 41 + 42 + #ifdef CONFIG_KASAN_HW_TAGS 43 + # define TRACE_GFP_FLAGS_KASAN \ 44 + TRACE_GFP_EM(SKIP_ZERO) \ 45 + TRACE_GFP_EM(SKIP_KASAN) 46 + #else 47 + # define TRACE_GFP_FLAGS_KASAN 48 + #endif 49 + 50 + #ifdef CONFIG_LOCKDEP 51 + # define TRACE_GFP_FLAGS_LOCKDEP \ 52 + TRACE_GFP_EM(NOLOCKDEP) 53 + #else 54 + # define TRACE_GFP_FLAGS_LOCKDEP 55 + #endif 56 + 57 + #ifdef CONFIG_SLAB_OBJ_EXT 58 + # define TRACE_GFP_FLAGS_SLAB \ 59 + TRACE_GFP_EM(NO_OBJ_EXT) 60 + #else 61 + # define TRACE_GFP_FLAGS_SLAB 62 + #endif 63 + 64 + #define TRACE_GFP_FLAGS \ 65 + TRACE_GFP_FLAGS_GENERAL \ 66 + TRACE_GFP_FLAGS_KASAN \ 67 + TRACE_GFP_FLAGS_LOCKDEP \ 68 + TRACE_GFP_FLAGS_SLAB 69 + 70 + #undef TRACE_GFP_EM 71 + #define TRACE_GFP_EM(a) TRACE_DEFINE_ENUM(___GFP_##a##_BIT); 72 + 73 + TRACE_GFP_FLAGS 74 + 75 + /* Just in case these are ever used */ 76 + TRACE_DEFINE_ENUM(___GFP_UNUSED_BIT); 77 + TRACE_DEFINE_ENUM(___GFP_LAST_BIT); 78 + 16 79 #define gfpflag_string(flag) {(__force unsigned long)flag, #flag} 17 80 18 81 #define __def_gfpflag_names \