1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */ 253f2d028SMauro Carvalho Chehab #undef TRACE_SYSTEM 353f2d028SMauro Carvalho Chehab #define TRACE_SYSTEM ras 453f2d028SMauro Carvalho Chehab #define TRACE_INCLUDE_FILE ras_event 553f2d028SMauro Carvalho Chehab 653f2d028SMauro Carvalho Chehab #if !defined(_TRACE_HW_EVENT_MC_H) || defined(TRACE_HEADER_MULTI_READ) 753f2d028SMauro Carvalho Chehab #define _TRACE_HW_EVENT_MC_H 853f2d028SMauro Carvalho Chehab 953f2d028SMauro Carvalho Chehab #include <linux/tracepoint.h> 1053f2d028SMauro Carvalho Chehab #include <linux/edac.h> 1153f2d028SMauro Carvalho Chehab #include <linux/ktime.h> 1299d44024SChen, Gong #include <linux/pci.h> 130a2409aaSChen, Gong #include <linux/aer.h> 142dfb7d51SChen, Gong #include <linux/cper.h> 1597f0b134SXie XiuQi #include <linux/mm.h> 162dfb7d51SChen, Gong 172dfb7d51SChen, Gong /* 182dfb7d51SChen, Gong * MCE Extended Error Log trace event 192dfb7d51SChen, Gong * 202dfb7d51SChen, Gong * These events are generated when hardware detects a corrected or 212dfb7d51SChen, Gong * uncorrected event. 222dfb7d51SChen, Gong */ 232dfb7d51SChen, Gong 242dfb7d51SChen, Gong /* memory trace event */ 252dfb7d51SChen, Gong 262dfb7d51SChen, Gong #if defined(CONFIG_ACPI_EXTLOG) || defined(CONFIG_ACPI_EXTLOG_MODULE) 272dfb7d51SChen, Gong TRACE_EVENT(extlog_mem_event, 282dfb7d51SChen, Gong TP_PROTO(struct cper_sec_mem_err *mem, 292dfb7d51SChen, Gong u32 err_seq, 309359a8cbSAndy Shevchenko const guid_t *fru_id, 312dfb7d51SChen, Gong const char *fru_text, 322dfb7d51SChen, Gong u8 sev), 332dfb7d51SChen, Gong 342dfb7d51SChen, Gong TP_ARGS(mem, err_seq, fru_id, fru_text, sev), 352dfb7d51SChen, Gong 362dfb7d51SChen, Gong TP_STRUCT__entry( 372dfb7d51SChen, Gong __field(u32, err_seq) 382dfb7d51SChen, Gong __field(u8, etype) 392dfb7d51SChen, Gong __field(u8, sev) 402dfb7d51SChen, Gong __field(u64, pa) 412dfb7d51SChen, Gong __field(u8, pa_mask_lsb) 429359a8cbSAndy Shevchenko __field_struct(guid_t, fru_id) 432dfb7d51SChen, Gong __string(fru_text, fru_text) 442dfb7d51SChen, Gong __field_struct(struct cper_mem_err_compact, data) 452dfb7d51SChen, Gong ), 462dfb7d51SChen, Gong 472dfb7d51SChen, Gong TP_fast_assign( 482dfb7d51SChen, Gong __entry->err_seq = err_seq; 492dfb7d51SChen, Gong if (mem->validation_bits & CPER_MEM_VALID_ERROR_TYPE) 502dfb7d51SChen, Gong __entry->etype = mem->error_type; 512dfb7d51SChen, Gong else 522dfb7d51SChen, Gong __entry->etype = ~0; 532dfb7d51SChen, Gong __entry->sev = sev; 542dfb7d51SChen, Gong if (mem->validation_bits & CPER_MEM_VALID_PA) 552dfb7d51SChen, Gong __entry->pa = mem->physical_addr; 562dfb7d51SChen, Gong else 572dfb7d51SChen, Gong __entry->pa = ~0ull; 582dfb7d51SChen, Gong 592dfb7d51SChen, Gong if (mem->validation_bits & CPER_MEM_VALID_PA_MASK) 602dfb7d51SChen, Gong __entry->pa_mask_lsb = (u8)__ffs64(mem->physical_addr_mask); 612dfb7d51SChen, Gong else 622dfb7d51SChen, Gong __entry->pa_mask_lsb = ~0; 632dfb7d51SChen, Gong __entry->fru_id = *fru_id; 642dfb7d51SChen, Gong __assign_str(fru_text, fru_text); 652dfb7d51SChen, Gong cper_mem_err_pack(mem, &__entry->data); 662dfb7d51SChen, Gong ), 672dfb7d51SChen, Gong 682dfb7d51SChen, Gong TP_printk("{%d} %s error: %s physical addr: %016llx (mask lsb: %x) %sFRU: %pUl %.20s", 692dfb7d51SChen, Gong __entry->err_seq, 702dfb7d51SChen, Gong cper_severity_str(__entry->sev), 712dfb7d51SChen, Gong cper_mem_err_type_str(__entry->etype), 722dfb7d51SChen, Gong __entry->pa, 732dfb7d51SChen, Gong __entry->pa_mask_lsb, 742dfb7d51SChen, Gong cper_mem_err_unpack(p, &__entry->data), 752dfb7d51SChen, Gong &__entry->fru_id, 762dfb7d51SChen, Gong __get_str(fru_text)) 772dfb7d51SChen, Gong ); 782dfb7d51SChen, Gong #endif 7953f2d028SMauro Carvalho Chehab 8053f2d028SMauro Carvalho Chehab /* 8153f2d028SMauro Carvalho Chehab * Hardware Events Report 8253f2d028SMauro Carvalho Chehab * 8353f2d028SMauro Carvalho Chehab * Those events are generated when hardware detected a corrected or 8453f2d028SMauro Carvalho Chehab * uncorrected event, and are meant to replace the current API to report 8553f2d028SMauro Carvalho Chehab * errors defined on both EDAC and MCE subsystems. 8653f2d028SMauro Carvalho Chehab * 8753f2d028SMauro Carvalho Chehab * FIXME: Add events for handling memory errors originated from the 8853f2d028SMauro Carvalho Chehab * MCE subsystem. 8953f2d028SMauro Carvalho Chehab */ 9053f2d028SMauro Carvalho Chehab 9153f2d028SMauro Carvalho Chehab /* 9253f2d028SMauro Carvalho Chehab * Hardware-independent Memory Controller specific events 9353f2d028SMauro Carvalho Chehab */ 9453f2d028SMauro Carvalho Chehab 9553f2d028SMauro Carvalho Chehab /* 9653f2d028SMauro Carvalho Chehab * Default error mechanisms for Memory Controller errors (CE and UE) 9753f2d028SMauro Carvalho Chehab */ 9853f2d028SMauro Carvalho Chehab TRACE_EVENT(mc_event, 9953f2d028SMauro Carvalho Chehab 10053f2d028SMauro Carvalho Chehab TP_PROTO(const unsigned int err_type, 10153f2d028SMauro Carvalho Chehab const char *error_msg, 10253f2d028SMauro Carvalho Chehab const char *label, 10353f2d028SMauro Carvalho Chehab const int error_count, 10453f2d028SMauro Carvalho Chehab const u8 mc_index, 10553f2d028SMauro Carvalho Chehab const s8 top_layer, 10653f2d028SMauro Carvalho Chehab const s8 mid_layer, 10753f2d028SMauro Carvalho Chehab const s8 low_layer, 10853f2d028SMauro Carvalho Chehab unsigned long address, 10953f2d028SMauro Carvalho Chehab const u8 grain_bits, 11053f2d028SMauro Carvalho Chehab unsigned long syndrome, 11153f2d028SMauro Carvalho Chehab const char *driver_detail), 11253f2d028SMauro Carvalho Chehab 11353f2d028SMauro Carvalho Chehab TP_ARGS(err_type, error_msg, label, error_count, mc_index, 11453f2d028SMauro Carvalho Chehab top_layer, mid_layer, low_layer, address, grain_bits, 11553f2d028SMauro Carvalho Chehab syndrome, driver_detail), 11653f2d028SMauro Carvalho Chehab 11753f2d028SMauro Carvalho Chehab TP_STRUCT__entry( 11853f2d028SMauro Carvalho Chehab __field( unsigned int, error_type ) 11953f2d028SMauro Carvalho Chehab __string( msg, error_msg ) 12053f2d028SMauro Carvalho Chehab __string( label, label ) 12153f2d028SMauro Carvalho Chehab __field( u16, error_count ) 12253f2d028SMauro Carvalho Chehab __field( u8, mc_index ) 12353f2d028SMauro Carvalho Chehab __field( s8, top_layer ) 12453f2d028SMauro Carvalho Chehab __field( s8, middle_layer ) 12553f2d028SMauro Carvalho Chehab __field( s8, lower_layer ) 12653f2d028SMauro Carvalho Chehab __field( long, address ) 12753f2d028SMauro Carvalho Chehab __field( u8, grain_bits ) 12853f2d028SMauro Carvalho Chehab __field( long, syndrome ) 12953f2d028SMauro Carvalho Chehab __string( driver_detail, driver_detail ) 13053f2d028SMauro Carvalho Chehab ), 13153f2d028SMauro Carvalho Chehab 13253f2d028SMauro Carvalho Chehab TP_fast_assign( 13353f2d028SMauro Carvalho Chehab __entry->error_type = err_type; 13453f2d028SMauro Carvalho Chehab __assign_str(msg, error_msg); 13553f2d028SMauro Carvalho Chehab __assign_str(label, label); 13653f2d028SMauro Carvalho Chehab __entry->error_count = error_count; 13753f2d028SMauro Carvalho Chehab __entry->mc_index = mc_index; 13853f2d028SMauro Carvalho Chehab __entry->top_layer = top_layer; 13953f2d028SMauro Carvalho Chehab __entry->middle_layer = mid_layer; 14053f2d028SMauro Carvalho Chehab __entry->lower_layer = low_layer; 14153f2d028SMauro Carvalho Chehab __entry->address = address; 14253f2d028SMauro Carvalho Chehab __entry->grain_bits = grain_bits; 14353f2d028SMauro Carvalho Chehab __entry->syndrome = syndrome; 14453f2d028SMauro Carvalho Chehab __assign_str(driver_detail, driver_detail); 14553f2d028SMauro Carvalho Chehab ), 14653f2d028SMauro Carvalho Chehab 14753f2d028SMauro Carvalho Chehab TP_printk("%d %s error%s:%s%s on %s (mc:%d location:%d:%d:%d address:0x%08lx grain:%d syndrome:0x%08lx%s%s)", 14853f2d028SMauro Carvalho Chehab __entry->error_count, 1498dd93d45SMauro Carvalho Chehab mc_event_error_type(__entry->error_type), 15053f2d028SMauro Carvalho Chehab __entry->error_count > 1 ? "s" : "", 151a17167ceSDaniel Bristot de Oliveira __get_str(msg)[0] ? " " : "", 15253f2d028SMauro Carvalho Chehab __get_str(msg), 15353f2d028SMauro Carvalho Chehab __get_str(label), 15453f2d028SMauro Carvalho Chehab __entry->mc_index, 15553f2d028SMauro Carvalho Chehab __entry->top_layer, 15653f2d028SMauro Carvalho Chehab __entry->middle_layer, 15753f2d028SMauro Carvalho Chehab __entry->lower_layer, 15853f2d028SMauro Carvalho Chehab __entry->address, 15953f2d028SMauro Carvalho Chehab 1 << __entry->grain_bits, 16053f2d028SMauro Carvalho Chehab __entry->syndrome, 161a17167ceSDaniel Bristot de Oliveira __get_str(driver_detail)[0] ? " " : "", 16253f2d028SMauro Carvalho Chehab __get_str(driver_detail)) 16353f2d028SMauro Carvalho Chehab ); 16453f2d028SMauro Carvalho Chehab 1650a2409aaSChen, Gong /* 166e9279e83STyler Baicar * ARM Processor Events Report 167e9279e83STyler Baicar * 168e9279e83STyler Baicar * This event is generated when hardware detects an ARM processor error 169e9279e83STyler Baicar * has occurred. UEFI 2.6 spec section N.2.4.4. 170e9279e83STyler Baicar */ 171e9279e83STyler Baicar TRACE_EVENT(arm_event, 172e9279e83STyler Baicar 173e9279e83STyler Baicar TP_PROTO(const struct cper_sec_proc_arm *proc), 174e9279e83STyler Baicar 175e9279e83STyler Baicar TP_ARGS(proc), 176e9279e83STyler Baicar 177e9279e83STyler Baicar TP_STRUCT__entry( 178e9279e83STyler Baicar __field(u64, mpidr) 179e9279e83STyler Baicar __field(u64, midr) 180e9279e83STyler Baicar __field(u32, running_state) 181e9279e83STyler Baicar __field(u32, psci_state) 182e9279e83STyler Baicar __field(u8, affinity) 183e9279e83STyler Baicar ), 184e9279e83STyler Baicar 185e9279e83STyler Baicar TP_fast_assign( 186e9279e83STyler Baicar if (proc->validation_bits & CPER_ARM_VALID_AFFINITY_LEVEL) 187e9279e83STyler Baicar __entry->affinity = proc->affinity_level; 188e9279e83STyler Baicar else 189e9279e83STyler Baicar __entry->affinity = ~0; 190e9279e83STyler Baicar if (proc->validation_bits & CPER_ARM_VALID_MPIDR) 191e9279e83STyler Baicar __entry->mpidr = proc->mpidr; 192e9279e83STyler Baicar else 193e9279e83STyler Baicar __entry->mpidr = 0ULL; 194e9279e83STyler Baicar __entry->midr = proc->midr; 195e9279e83STyler Baicar if (proc->validation_bits & CPER_ARM_VALID_RUNNING_STATE) { 196e9279e83STyler Baicar __entry->running_state = proc->running_state; 197e9279e83STyler Baicar __entry->psci_state = proc->psci_state; 198e9279e83STyler Baicar } else { 199e9279e83STyler Baicar __entry->running_state = ~0; 200e9279e83STyler Baicar __entry->psci_state = ~0; 201e9279e83STyler Baicar } 202e9279e83STyler Baicar ), 203e9279e83STyler Baicar 204e9279e83STyler Baicar TP_printk("affinity level: %d; MPIDR: %016llx; MIDR: %016llx; " 205e9279e83STyler Baicar "running state: %d; PSCI state: %d", 206e9279e83STyler Baicar __entry->affinity, __entry->mpidr, __entry->midr, 207e9279e83STyler Baicar __entry->running_state, __entry->psci_state) 208e9279e83STyler Baicar ); 209e9279e83STyler Baicar 210e9279e83STyler Baicar /* 211297b64c7STyler Baicar * Non-Standard Section Report 212297b64c7STyler Baicar * 213297b64c7STyler Baicar * This event is generated when hardware detected a hardware 214297b64c7STyler Baicar * error event, which may be of non-standard section as defined 215297b64c7STyler Baicar * in UEFI spec appendix "Common Platform Error Record", or may 216297b64c7STyler Baicar * be of sections for which TRACE_EVENT is not defined. 217297b64c7STyler Baicar * 218297b64c7STyler Baicar */ 219297b64c7STyler Baicar TRACE_EVENT(non_standard_event, 220297b64c7STyler Baicar 2219359a8cbSAndy Shevchenko TP_PROTO(const guid_t *sec_type, 2229359a8cbSAndy Shevchenko const guid_t *fru_id, 223297b64c7STyler Baicar const char *fru_text, 224297b64c7STyler Baicar const u8 sev, 225297b64c7STyler Baicar const u8 *err, 226297b64c7STyler Baicar const u32 len), 227297b64c7STyler Baicar 228297b64c7STyler Baicar TP_ARGS(sec_type, fru_id, fru_text, sev, err, len), 229297b64c7STyler Baicar 230297b64c7STyler Baicar TP_STRUCT__entry( 231297b64c7STyler Baicar __array(char, sec_type, UUID_SIZE) 232297b64c7STyler Baicar __array(char, fru_id, UUID_SIZE) 233297b64c7STyler Baicar __string(fru_text, fru_text) 234297b64c7STyler Baicar __field(u8, sev) 235297b64c7STyler Baicar __field(u32, len) 236297b64c7STyler Baicar __dynamic_array(u8, buf, len) 237297b64c7STyler Baicar ), 238297b64c7STyler Baicar 239297b64c7STyler Baicar TP_fast_assign( 240297b64c7STyler Baicar memcpy(__entry->sec_type, sec_type, UUID_SIZE); 241297b64c7STyler Baicar memcpy(__entry->fru_id, fru_id, UUID_SIZE); 242297b64c7STyler Baicar __assign_str(fru_text, fru_text); 243297b64c7STyler Baicar __entry->sev = sev; 244297b64c7STyler Baicar __entry->len = len; 245297b64c7STyler Baicar memcpy(__get_dynamic_array(buf), err, len); 246297b64c7STyler Baicar ), 247297b64c7STyler Baicar 248297b64c7STyler Baicar TP_printk("severity: %d; sec type:%pU; FRU: %pU %s; data len:%d; raw data:%s", 249297b64c7STyler Baicar __entry->sev, __entry->sec_type, 250297b64c7STyler Baicar __entry->fru_id, __get_str(fru_text), 251297b64c7STyler Baicar __entry->len, 252297b64c7STyler Baicar __print_hex(__get_dynamic_array(buf), __entry->len)) 253297b64c7STyler Baicar ); 254297b64c7STyler Baicar 255297b64c7STyler Baicar /* 2560a2409aaSChen, Gong * PCIe AER Trace event 2570a2409aaSChen, Gong * 2580a2409aaSChen, Gong * These events are generated when hardware detects a corrected or 2590a2409aaSChen, Gong * uncorrected event on a PCIe device. The event report has 2600a2409aaSChen, Gong * the following structure: 2610a2409aaSChen, Gong * 2620a2409aaSChen, Gong * char * dev_name - The name of the slot where the device resides 2630a2409aaSChen, Gong * ([domain:]bus:device.function). 2640a2409aaSChen, Gong * u32 status - Either the correctable or uncorrectable register 2650a2409aaSChen, Gong * indicating what error or errors have been seen 2660a2409aaSChen, Gong * u8 severity - error severity 0:NONFATAL 1:FATAL 2:CORRECTED 2670a2409aaSChen, Gong */ 2680a2409aaSChen, Gong 2690a2409aaSChen, Gong #define aer_correctable_errors \ 27099d44024SChen, Gong {PCI_ERR_COR_RCVR, "Receiver Error"}, \ 27199d44024SChen, Gong {PCI_ERR_COR_BAD_TLP, "Bad TLP"}, \ 27299d44024SChen, Gong {PCI_ERR_COR_BAD_DLLP, "Bad DLLP"}, \ 27399d44024SChen, Gong {PCI_ERR_COR_REP_ROLL, "RELAY_NUM Rollover"}, \ 27499d44024SChen, Gong {PCI_ERR_COR_REP_TIMER, "Replay Timer Timeout"}, \ 275cb9a684aSChen, Gong {PCI_ERR_COR_ADV_NFAT, "Advisory Non-Fatal Error"}, \ 276cb9a684aSChen, Gong {PCI_ERR_COR_INTERNAL, "Corrected Internal Error"}, \ 277cb9a684aSChen, Gong {PCI_ERR_COR_LOG_OVER, "Header Log Overflow"} 2780a2409aaSChen, Gong 2790a2409aaSChen, Gong #define aer_uncorrectable_errors \ 280846fc709SChen, Gong {PCI_ERR_UNC_UND, "Undefined"}, \ 281cb9a684aSChen, Gong {PCI_ERR_UNC_DLP, "Data Link Protocol Error"}, \ 282cb9a684aSChen, Gong {PCI_ERR_UNC_SURPDN, "Surprise Down Error"}, \ 28399d44024SChen, Gong {PCI_ERR_UNC_POISON_TLP,"Poisoned TLP"}, \ 284cb9a684aSChen, Gong {PCI_ERR_UNC_FCP, "Flow Control Protocol Error"}, \ 28599d44024SChen, Gong {PCI_ERR_UNC_COMP_TIME, "Completion Timeout"}, \ 28699d44024SChen, Gong {PCI_ERR_UNC_COMP_ABORT,"Completer Abort"}, \ 28799d44024SChen, Gong {PCI_ERR_UNC_UNX_COMP, "Unexpected Completion"}, \ 28899d44024SChen, Gong {PCI_ERR_UNC_RX_OVER, "Receiver Overflow"}, \ 28999d44024SChen, Gong {PCI_ERR_UNC_MALF_TLP, "Malformed TLP"}, \ 290cb9a684aSChen, Gong {PCI_ERR_UNC_ECRC, "ECRC Error"}, \ 291cb9a684aSChen, Gong {PCI_ERR_UNC_UNSUP, "Unsupported Request Error"}, \ 292cb9a684aSChen, Gong {PCI_ERR_UNC_ACSV, "ACS Violation"}, \ 293cb9a684aSChen, Gong {PCI_ERR_UNC_INTN, "Uncorrectable Internal Error"},\ 294cb9a684aSChen, Gong {PCI_ERR_UNC_MCBTLP, "MC Blocked TLP"}, \ 295cb9a684aSChen, Gong {PCI_ERR_UNC_ATOMEG, "AtomicOp Egress Blocked"}, \ 296cb9a684aSChen, Gong {PCI_ERR_UNC_TLPPRE, "TLP Prefix Blocked Error"} 2970a2409aaSChen, Gong 2980a2409aaSChen, Gong TRACE_EVENT(aer_event, 2990a2409aaSChen, Gong TP_PROTO(const char *dev_name, 3000a2409aaSChen, Gong const u32 status, 3012af8641bSThomas Tai const u8 severity, 3022af8641bSThomas Tai const u8 tlp_header_valid, 3032af8641bSThomas Tai struct aer_header_log_regs *tlp), 3040a2409aaSChen, Gong 3052af8641bSThomas Tai TP_ARGS(dev_name, status, severity, tlp_header_valid, tlp), 3060a2409aaSChen, Gong 3070a2409aaSChen, Gong TP_STRUCT__entry( 3080a2409aaSChen, Gong __string( dev_name, dev_name ) 3090a2409aaSChen, Gong __field( u32, status ) 3100a2409aaSChen, Gong __field( u8, severity ) 3112af8641bSThomas Tai __field( u8, tlp_header_valid) 3122af8641bSThomas Tai __array( u32, tlp_header, 4 ) 3130a2409aaSChen, Gong ), 3140a2409aaSChen, Gong 3150a2409aaSChen, Gong TP_fast_assign( 3160a2409aaSChen, Gong __assign_str(dev_name, dev_name); 3170a2409aaSChen, Gong __entry->status = status; 3180a2409aaSChen, Gong __entry->severity = severity; 3192af8641bSThomas Tai __entry->tlp_header_valid = tlp_header_valid; 3202af8641bSThomas Tai if (tlp_header_valid) { 3212af8641bSThomas Tai __entry->tlp_header[0] = tlp->dw0; 3222af8641bSThomas Tai __entry->tlp_header[1] = tlp->dw1; 3232af8641bSThomas Tai __entry->tlp_header[2] = tlp->dw2; 3242af8641bSThomas Tai __entry->tlp_header[3] = tlp->dw3; 3252af8641bSThomas Tai } 3260a2409aaSChen, Gong ), 3270a2409aaSChen, Gong 3282af8641bSThomas Tai TP_printk("%s PCIe Bus Error: severity=%s, %s, TLP Header=%s\n", 3290a2409aaSChen, Gong __get_str(dev_name), 3300a2409aaSChen, Gong __entry->severity == AER_CORRECTABLE ? "Corrected" : 3310a2409aaSChen, Gong __entry->severity == AER_FATAL ? 3320a2409aaSChen, Gong "Fatal" : "Uncorrected, non-fatal", 3330a2409aaSChen, Gong __entry->severity == AER_CORRECTABLE ? 3340a2409aaSChen, Gong __print_flags(__entry->status, "|", aer_correctable_errors) : 3352af8641bSThomas Tai __print_flags(__entry->status, "|", aer_uncorrectable_errors), 3362af8641bSThomas Tai __entry->tlp_header_valid ? 3372af8641bSThomas Tai __print_array(__entry->tlp_header, 4, 4) : 3382af8641bSThomas Tai "Not available") 3390a2409aaSChen, Gong ); 3400a2409aaSChen, Gong 34197f0b134SXie XiuQi /* 34297f0b134SXie XiuQi * memory-failure recovery action result event 34397f0b134SXie XiuQi * 34497f0b134SXie XiuQi * unsigned long pfn - Page Frame Number of the corrupted page 34597f0b134SXie XiuQi * int type - Page types of the corrupted page 34697f0b134SXie XiuQi * int result - Result of recovery action 34797f0b134SXie XiuQi */ 34897f0b134SXie XiuQi 34997f0b134SXie XiuQi #ifdef CONFIG_MEMORY_FAILURE 35097f0b134SXie XiuQi #define MF_ACTION_RESULT \ 35197f0b134SXie XiuQi EM ( MF_IGNORED, "Ignored" ) \ 35297f0b134SXie XiuQi EM ( MF_FAILED, "Failed" ) \ 35397f0b134SXie XiuQi EM ( MF_DELAYED, "Delayed" ) \ 35497f0b134SXie XiuQi EMe ( MF_RECOVERED, "Recovered" ) 35597f0b134SXie XiuQi 35697f0b134SXie XiuQi #define MF_PAGE_TYPE \ 35797f0b134SXie XiuQi EM ( MF_MSG_KERNEL, "reserved kernel page" ) \ 35897f0b134SXie XiuQi EM ( MF_MSG_KERNEL_HIGH_ORDER, "high-order kernel page" ) \ 35997f0b134SXie XiuQi EM ( MF_MSG_SLAB, "kernel slab page" ) \ 36097f0b134SXie XiuQi EM ( MF_MSG_DIFFERENT_COMPOUND, "different compound page after locking" ) \ 36197f0b134SXie XiuQi EM ( MF_MSG_HUGE, "huge page" ) \ 36297f0b134SXie XiuQi EM ( MF_MSG_FREE_HUGE, "free huge page" ) \ 36397f0b134SXie XiuQi EM ( MF_MSG_UNMAP_FAILED, "unmapping failed page" ) \ 36497f0b134SXie XiuQi EM ( MF_MSG_DIRTY_SWAPCACHE, "dirty swapcache page" ) \ 36597f0b134SXie XiuQi EM ( MF_MSG_CLEAN_SWAPCACHE, "clean swapcache page" ) \ 36697f0b134SXie XiuQi EM ( MF_MSG_DIRTY_MLOCKED_LRU, "dirty mlocked LRU page" ) \ 36797f0b134SXie XiuQi EM ( MF_MSG_CLEAN_MLOCKED_LRU, "clean mlocked LRU page" ) \ 36897f0b134SXie XiuQi EM ( MF_MSG_DIRTY_UNEVICTABLE_LRU, "dirty unevictable LRU page" ) \ 36997f0b134SXie XiuQi EM ( MF_MSG_CLEAN_UNEVICTABLE_LRU, "clean unevictable LRU page" ) \ 37097f0b134SXie XiuQi EM ( MF_MSG_DIRTY_LRU, "dirty LRU page" ) \ 37197f0b134SXie XiuQi EM ( MF_MSG_CLEAN_LRU, "clean LRU page" ) \ 37297f0b134SXie XiuQi EM ( MF_MSG_TRUNCATED_LRU, "already truncated LRU page" ) \ 37397f0b134SXie XiuQi EM ( MF_MSG_BUDDY, "free buddy page" ) \ 374*5d1fd5dcSNaoya Horiguchi EM ( MF_MSG_DAX, "dax page" ) \ 375*5d1fd5dcSNaoya Horiguchi EM ( MF_MSG_UNSPLIT_THP, "unsplit thp" ) \ 37697f0b134SXie XiuQi EMe ( MF_MSG_UNKNOWN, "unknown page" ) 37797f0b134SXie XiuQi 37897f0b134SXie XiuQi /* 37997f0b134SXie XiuQi * First define the enums in MM_ACTION_RESULT to be exported to userspace 38097f0b134SXie XiuQi * via TRACE_DEFINE_ENUM(). 38197f0b134SXie XiuQi */ 38297f0b134SXie XiuQi #undef EM 38397f0b134SXie XiuQi #undef EMe 38497f0b134SXie XiuQi #define EM(a, b) TRACE_DEFINE_ENUM(a); 38597f0b134SXie XiuQi #define EMe(a, b) TRACE_DEFINE_ENUM(a); 38697f0b134SXie XiuQi 38797f0b134SXie XiuQi MF_ACTION_RESULT 38897f0b134SXie XiuQi MF_PAGE_TYPE 38997f0b134SXie XiuQi 39097f0b134SXie XiuQi /* 39197f0b134SXie XiuQi * Now redefine the EM() and EMe() macros to map the enums to the strings 39297f0b134SXie XiuQi * that will be printed in the output. 39397f0b134SXie XiuQi */ 39497f0b134SXie XiuQi #undef EM 39597f0b134SXie XiuQi #undef EMe 39697f0b134SXie XiuQi #define EM(a, b) { a, b }, 39797f0b134SXie XiuQi #define EMe(a, b) { a, b } 39897f0b134SXie XiuQi 39997f0b134SXie XiuQi TRACE_EVENT(memory_failure_event, 40097f0b134SXie XiuQi TP_PROTO(unsigned long pfn, 40197f0b134SXie XiuQi int type, 40297f0b134SXie XiuQi int result), 40397f0b134SXie XiuQi 40497f0b134SXie XiuQi TP_ARGS(pfn, type, result), 40597f0b134SXie XiuQi 40697f0b134SXie XiuQi TP_STRUCT__entry( 40797f0b134SXie XiuQi __field(unsigned long, pfn) 40897f0b134SXie XiuQi __field(int, type) 40997f0b134SXie XiuQi __field(int, result) 41097f0b134SXie XiuQi ), 41197f0b134SXie XiuQi 41297f0b134SXie XiuQi TP_fast_assign( 41397f0b134SXie XiuQi __entry->pfn = pfn; 41497f0b134SXie XiuQi __entry->type = type; 41597f0b134SXie XiuQi __entry->result = result; 41697f0b134SXie XiuQi ), 41797f0b134SXie XiuQi 41897f0b134SXie XiuQi TP_printk("pfn %#lx: recovery action for %s: %s", 41997f0b134SXie XiuQi __entry->pfn, 42097f0b134SXie XiuQi __print_symbolic(__entry->type, MF_PAGE_TYPE), 42197f0b134SXie XiuQi __print_symbolic(__entry->result, MF_ACTION_RESULT) 42297f0b134SXie XiuQi ) 42397f0b134SXie XiuQi ); 42497f0b134SXie XiuQi #endif /* CONFIG_MEMORY_FAILURE */ 42553f2d028SMauro Carvalho Chehab #endif /* _TRACE_HW_EVENT_MC_H */ 42653f2d028SMauro Carvalho Chehab 42753f2d028SMauro Carvalho Chehab /* This part must be outside protection */ 42853f2d028SMauro Carvalho Chehab #include <trace/define_trace.h> 429