|
@@ -372,6 +372,13 @@ static int watchdog(void *unused)
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_HARDLOCKUP_DETECTOR
|
|
|
+/*
|
|
|
+ * People like the simple clean cpu node info on boot.
|
|
|
+ * Reduce the watchdog noise by only printing messages
|
|
|
+ * that are different from what cpu0 displayed.
|
|
|
+ */
|
|
|
+static unsigned long cpu0_err;
|
|
|
+
|
|
|
static int watchdog_nmi_enable(int cpu)
|
|
|
{
|
|
|
struct perf_event_attr *wd_attr;
|
|
@@ -390,11 +397,21 @@ static int watchdog_nmi_enable(int cpu)
|
|
|
|
|
|
/* Try to register using hardware perf events */
|
|
|
event = perf_event_create_kernel_counter(wd_attr, cpu, NULL, watchdog_overflow_callback, NULL);
|
|
|
+
|
|
|
+ /* save cpu0 error for future comparision */
|
|
|
+ if (cpu == 0 && IS_ERR(event))
|
|
|
+ cpu0_err = PTR_ERR(event);
|
|
|
+
|
|
|
if (!IS_ERR(event)) {
|
|
|
- pr_info("enabled, takes one hw-pmu counter.\n");
|
|
|
+ /* only print for cpu0 or different than cpu0 */
|
|
|
+ if (cpu == 0 || cpu0_err)
|
|
|
+ pr_info("enabled on all CPUs, permanently consumes one hw-PMU counter.\n");
|
|
|
goto out_save;
|
|
|
}
|
|
|
|
|
|
+ /* skip displaying the same error again */
|
|
|
+ if (cpu > 0 && (PTR_ERR(event) == cpu0_err))
|
|
|
+ return PTR_ERR(event);
|
|
|
|
|
|
/* vary the KERN level based on the returned errno */
|
|
|
if (PTR_ERR(event) == -EOPNOTSUPP)
|