@@ -698,6 +698,7 @@ static void __aer_print_error(struct pci_dev *dev,
pci_dev_aer_stats_incr(dev, info);
}
+unsigned int aer_print_skip_mask __read_mostly;
void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
{
int layer, agent;
@@ -710,6 +711,9 @@ void aer_print_error(struct pci_dev *dev, struct aer_err_info *info)
goto out;
}
+ if ((1 << info->severity) & aer_print_skip_mask)
+ goto out;
+
layer = AER_GET_LAYER_ERROR(info->severity, info->status);
agent = AER_GET_AGENT(info->severity, info->status);
@@ -1596,3 +1600,22 @@ int __init pcie_aer_init(void)
return -ENXIO;
return pcie_port_service_register(&aerdriver);
}
+
+static const struct ctl_table aer_print_skip_mask_sysctls[] = {
+ {
+ .procname = "aer_print_skip_mask",
+ .data = &aer_print_skip_mask,
+ .maxlen = sizeof(unsigned int),
+ .mode = 0644,
+ .proc_handler = &proc_douintvec,
+ },
+ {}
+};
+
+static int __init aer_print_skip_mask_sysctl_init(void)
+{
+ register_sysctl_init("kernel", aer_print_skip_mask_sysctls);
+ return 0;
+}
+
+late_initcall(aer_print_skip_mask_sysctl_init);
Sometimes certain PCIE devices installed on some servers occasionally produce large number of AER correctable error logs, which is quite annoying. Add this sysctl parameter kernel.aer_print_skip_mask to skip printing AER errors of certain severity. The AER severity can be 0(NONFATAL), 1(FATAL), 2(CORRECTABLE). The 3 low bits of the mask are used to skip these 3 severities. Set bit 0 can skip printing NONFATAL AER errors, and set bit 1 can skip printing FATAL AER errors, set bit 2 can skip printing CORRECTABLE AER errors. And multiple bits can be set to skip multiple severities. Signed-off-by: Bijie Xu <bijie.xu@corigine.com> --- drivers/pci/pcie/aer.c | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+)