xref: /linux/include/trace/events/memory-failure.h (revision a10ea943356b9d70c5616a0a06f6fa97cfdaccb1)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 /*
4  * For historical versions, memory_failure_event is in ras subsystem,
5  * some user programs depend on it.
6  */
7 #define TRACE_SYSTEM ras
8 #define TRACE_INCLUDE_FILE memory-failure
9 
10 #if !defined(_TRACE_MEMORY_FAILURE_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_MEMORY_FAILURE_H
12 
13 #include <linux/tracepoint.h>
14 #include <linux/mm.h>
15 
16 /*
17  * memory-failure recovery action result event
18  *
19  * unsigned long pfn -	Page Frame Number of the corrupted page
20  * int type	-	Page types of the corrupted page
21  * int result	-	Result of recovery action
22  */
23 
24 #define MF_ACTION_RESULT	\
25 	EM ( MF_IGNORED, "Ignored" )	\
26 	EM ( MF_FAILED,  "Failed" )	\
27 	EM ( MF_DELAYED, "Delayed" )	\
28 	EMe ( MF_RECOVERED, "Recovered" )
29 
30 #define MF_PAGE_TYPE		\
31 	EM ( MF_MSG_KERNEL, "reserved kernel page" )			\
32 	EM ( MF_MSG_KERNEL_HIGH_ORDER, "high-order kernel page" )	\
33 	EM ( MF_MSG_HUGE, "huge page" )					\
34 	EM ( MF_MSG_FREE_HUGE, "free huge page" )			\
35 	EM ( MF_MSG_GET_HWPOISON, "get hwpoison page" )			\
36 	EM ( MF_MSG_UNMAP_FAILED, "unmapping failed page" )		\
37 	EM ( MF_MSG_DIRTY_SWAPCACHE, "dirty swapcache page" )		\
38 	EM ( MF_MSG_CLEAN_SWAPCACHE, "clean swapcache page" )		\
39 	EM ( MF_MSG_DIRTY_MLOCKED_LRU, "dirty mlocked LRU page" )	\
40 	EM ( MF_MSG_CLEAN_MLOCKED_LRU, "clean mlocked LRU page" )	\
41 	EM ( MF_MSG_DIRTY_UNEVICTABLE_LRU, "dirty unevictable LRU page" )	\
42 	EM ( MF_MSG_CLEAN_UNEVICTABLE_LRU, "clean unevictable LRU page" )	\
43 	EM ( MF_MSG_DIRTY_LRU, "dirty LRU page" )			\
44 	EM ( MF_MSG_CLEAN_LRU, "clean LRU page" )			\
45 	EM ( MF_MSG_TRUNCATED_LRU, "already truncated LRU page" )	\
46 	EM ( MF_MSG_BUDDY, "free buddy page" )				\
47 	EM ( MF_MSG_DAX, "dax page" )					\
48 	EM ( MF_MSG_UNSPLIT_THP, "unsplit thp" )			\
49 	EM ( MF_MSG_ALREADY_POISONED, "already poisoned" )		\
50 	EM ( MF_MSG_PFN_MAP, "non struct page pfn" )                    \
51 	EMe ( MF_MSG_UNKNOWN, "unknown page" )
52 
53 /*
54  * First define the enums in MM_ACTION_RESULT to be exported to userspace
55  * via TRACE_DEFINE_ENUM().
56  */
57 #undef EM
58 #undef EMe
59 #define EM(a, b) TRACE_DEFINE_ENUM(a);
60 #define EMe(a, b)	TRACE_DEFINE_ENUM(a);
61 
62 MF_ACTION_RESULT
63 MF_PAGE_TYPE
64 
65 /*
66  * Now redefine the EM() and EMe() macros to map the enums to the strings
67  * that will be printed in the output.
68  */
69 #undef EM
70 #undef EMe
71 #define EM(a, b)		{ a, b },
72 #define EMe(a, b)	{ a, b }
73 
74 TRACE_EVENT(memory_failure_event,
75 	TP_PROTO(unsigned long pfn,
76 		 int type,
77 		 int result),
78 
79 	TP_ARGS(pfn, type, result),
80 
81 	TP_STRUCT__entry(
82 		__field(unsigned long, pfn)
83 		__field(int, type)
84 		__field(int, result)
85 	),
86 
87 	TP_fast_assign(
88 		__entry->pfn	= pfn;
89 		__entry->type	= type;
90 		__entry->result	= result;
91 	),
92 
93 	TP_printk("pfn %#lx: recovery action for %s: %s",
94 		__entry->pfn,
95 		__print_symbolic(__entry->type, MF_PAGE_TYPE),
96 		__print_symbolic(__entry->result, MF_ACTION_RESULT)
97 	)
98 );
99 #endif /* _TRACE_MEMORY_FAILURE_H */
100 
101 /* This part must be outside protection */
102 #include <trace/define_trace.h>
103