| /* 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_RESULT | |
| MF_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> |