PCI/AER: Add TLP header information to tracepoint
When a PCIe AER error occurs, the TLP header information is printed in the kernel message but it is missing from the tracepoint. A userspace program can use this information in the tracepoint to better analyze problems. To enable the tracepoint: echo 1 > /sys/kernel/debug/tracing/events/ras/aer_event/enable Example tracepoint output: $ cat /sys/kernel/debug/tracing/trace aer_event: 0000:01:00.0 PCIe Bus Error: severity=Uncorrected, non-fatal, Completer Abort TLP Header={0x0,0x1,0x2,0x3} Signed-off-by: Thomas Tai <thomas.tai@oracle.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com> Reviewed-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
This commit is contained in:
parent
5d0b401f4c
commit
2af8641b2a
@ -189,7 +189,7 @@ out:
|
||||
pci_err(dev, " Error of this Agent(%04x) is reported first\n", id);
|
||||
|
||||
trace_aer_event(dev_name(&dev->dev), (info->status & ~info->mask),
|
||||
info->severity);
|
||||
info->severity, info->tlp_header_valid, &info->tlp);
|
||||
}
|
||||
|
||||
void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info)
|
||||
@ -251,6 +251,6 @@ void cper_print_aer(struct pci_dev *dev, int aer_severity,
|
||||
__print_tlp_header(dev, &aer->header_log);
|
||||
|
||||
trace_aer_event(dev_name(&dev->dev), (status & ~mask),
|
||||
aer_severity);
|
||||
aer_severity, tlp_header_valid, &aer->header_log);
|
||||
}
|
||||
#endif
|
||||
|
@ -298,30 +298,44 @@ TRACE_EVENT(non_standard_event,
|
||||
TRACE_EVENT(aer_event,
|
||||
TP_PROTO(const char *dev_name,
|
||||
const u32 status,
|
||||
const u8 severity),
|
||||
const u8 severity,
|
||||
const u8 tlp_header_valid,
|
||||
struct aer_header_log_regs *tlp),
|
||||
|
||||
TP_ARGS(dev_name, status, severity),
|
||||
TP_ARGS(dev_name, status, severity, tlp_header_valid, tlp),
|
||||
|
||||
TP_STRUCT__entry(
|
||||
__string( dev_name, dev_name )
|
||||
__field( u32, status )
|
||||
__field( u8, severity )
|
||||
__field( u8, tlp_header_valid)
|
||||
__array( u32, tlp_header, 4 )
|
||||
),
|
||||
|
||||
TP_fast_assign(
|
||||
__assign_str(dev_name, dev_name);
|
||||
__entry->status = status;
|
||||
__entry->severity = severity;
|
||||
__entry->tlp_header_valid = tlp_header_valid;
|
||||
if (tlp_header_valid) {
|
||||
__entry->tlp_header[0] = tlp->dw0;
|
||||
__entry->tlp_header[1] = tlp->dw1;
|
||||
__entry->tlp_header[2] = tlp->dw2;
|
||||
__entry->tlp_header[3] = tlp->dw3;
|
||||
}
|
||||
),
|
||||
|
||||
TP_printk("%s PCIe Bus Error: severity=%s, %s\n",
|
||||
TP_printk("%s PCIe Bus Error: severity=%s, %s, TLP Header=%s\n",
|
||||
__get_str(dev_name),
|
||||
__entry->severity == AER_CORRECTABLE ? "Corrected" :
|
||||
__entry->severity == AER_FATAL ?
|
||||
"Fatal" : "Uncorrected, non-fatal",
|
||||
__entry->severity == AER_CORRECTABLE ?
|
||||
__print_flags(__entry->status, "|", aer_correctable_errors) :
|
||||
__print_flags(__entry->status, "|", aer_uncorrectable_errors))
|
||||
__print_flags(__entry->status, "|", aer_uncorrectable_errors),
|
||||
__entry->tlp_header_valid ?
|
||||
__print_array(__entry->tlp_header, 4, 4) :
|
||||
"Not available")
|
||||
);
|
||||
|
||||
/*
|
||||
|
Loading…
x
Reference in New Issue
Block a user