102 lines · 2.9 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */#undef TRACE_SYSTEM/* * For historical versions, memory_failure_event is in ras subsystem, * some user programs depend on it. */#define TRACE_SYSTEM ras#define TRACE_INCLUDE_FILE memory-failure #if !defined(_TRACE_MEMORY_FAILURE_H) || defined(TRACE_HEADER_MULTI_READ)#define _TRACE_MEMORY_FAILURE_H #include <linux/tracepoint.h>#include <linux/mm.h> /* * memory-failure recovery action result event * * unsigned long pfn -	Page Frame Number of the corrupted page * int type	-	Page types of the corrupted page * int result	-	Result of recovery action */ #define MF_ACTION_RESULT	\	EM ( MF_IGNORED, "Ignored" )	\	EM ( MF_FAILED,  "Failed" )	\	EM ( MF_DELAYED, "Delayed" )	\	EMe ( MF_RECOVERED, "Recovered" ) #define MF_PAGE_TYPE		\	EM ( MF_MSG_KERNEL, "reserved kernel page" )			\	EM ( MF_MSG_KERNEL_HIGH_ORDER, "high-order kernel page" )	\	EM ( MF_MSG_HUGE, "huge page" )					\	EM ( MF_MSG_FREE_HUGE, "free huge page" )			\	EM ( MF_MSG_GET_HWPOISON, "get hwpoison page" )			\	EM ( MF_MSG_UNMAP_FAILED, "unmapping failed page" )		\	EM ( MF_MSG_DIRTY_SWAPCACHE, "dirty swapcache page" )		\	EM ( MF_MSG_CLEAN_SWAPCACHE, "clean swapcache page" )		\	EM ( MF_MSG_DIRTY_MLOCKED_LRU, "dirty mlocked LRU page" )	\	EM ( MF_MSG_CLEAN_MLOCKED_LRU, "clean mlocked LRU page" )	\	EM ( MF_MSG_DIRTY_UNEVICTABLE_LRU, "dirty unevictable LRU page" )	\	EM ( MF_MSG_CLEAN_UNEVICTABLE_LRU, "clean unevictable LRU page" )	\	EM ( MF_MSG_DIRTY_LRU, "dirty LRU page" )			\	EM ( MF_MSG_CLEAN_LRU, "clean LRU page" )			\	EM ( MF_MSG_TRUNCATED_LRU, "already truncated LRU page" )	\	EM ( MF_MSG_BUDDY, "free buddy page" )				\	EM ( MF_MSG_DAX, "dax page" )					\	EM ( MF_MSG_UNSPLIT_THP, "unsplit thp" )			\	EM ( MF_MSG_ALREADY_POISONED, "already poisoned" )		\	EM ( MF_MSG_PFN_MAP, "non struct page pfn" )                    \	EMe ( MF_MSG_UNKNOWN, "unknown page" ) /* * First define the enums in MM_ACTION_RESULT to be exported to userspace * via TRACE_DEFINE_ENUM(). */#undef EM#undef EMe#define EM(a, b) TRACE_DEFINE_ENUM(a);#define EMe(a, b)	TRACE_DEFINE_ENUM(a); MF_ACTION_RESULTMF_PAGE_TYPE /* * Now redefine the EM() and EMe() macros to map the enums to the strings * that will be printed in the output. */#undef EM#undef EMe#define EM(a, b)		{ a, b },#define EMe(a, b)	{ a, b } TRACE_EVENT(memory_failure_event,	TP_PROTO(unsigned long pfn,		 int type,		 int result), 	TP_ARGS(pfn, type, result), 	TP_STRUCT__entry(		__field(unsigned long, pfn)		__field(int, type)		__field(int, result)	), 	TP_fast_assign(		__entry->pfn	= pfn;		__entry->type	= type;		__entry->result	= result;	), 	TP_printk("pfn %#lx: recovery action for %s: %s",		__entry->pfn,		__print_symbolic(__entry->type, MF_PAGE_TYPE),		__print_symbolic(__entry->result, MF_ACTION_RESULT)	));#endif /* _TRACE_MEMORY_FAILURE_H */ /* This part must be outside protection */#include <trace/define_trace.h>