mirror of
https://github.com/raspberrypi/linux.git
synced 2025-12-07 10:29:52 +00:00
watchdog/hardlockup: keep kernel.nmi_watchdog sysctl as 0444 if probe fails
Patch series "watchdog: Cleanup / fixes after buddy series v5 reviews".
This patch series attempts to finish resolving the feedback received
from Petr Mladek on the v5 series I posted.
Probably the only thing that wasn't fully as clean as Petr requested was
the Kconfig stuff. I couldn't find a better way to express it without a
more major overhaul. In the very least, I renamed "NON_ARCH" to
"PERF_OR_BUDDY" in the hopes that will make it marginally better.
Nothing in this series is terribly critical and even the bugfixes are
small. However, it does cleanup a few things that were pointed out in
review.
This patch (of 10):
The permissions for the kernel.nmi_watchdog sysctl have always been set at
compile time despite the fact that a watchdog can fail to probe. Let's
fix this and set the permissions based on whether the hardlockup detector
actually probed.
Link: https://lkml.kernel.org/r/20230527014153.2793931-1-dianders@chromium.org
Link: https://lkml.kernel.org/r/20230526184139.1.I0d75971cc52a7283f495aac0bd5c3041aadc734e@changeid
Fixes: a994a3147e ("watchdog/hardlockup/perf: Implement init time detection of perf")
Signed-off-by: Douglas Anderson <dianders@chromium.org>
Reported-by: Petr Mladek <pmladek@suse.com>
Closes: https://lore.kernel.org/r/ZHCn4hNxFpY5-9Ki@alley
Reviewed-by: Petr Mladek <pmladek@suse.com>
Cc: Christophe Leroy <christophe.leroy@csgroup.eu>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: Nicholas Piggin <npiggin@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Andrew Morton
parent
a94181ec06
commit
9ec272c586
@@ -95,12 +95,6 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs);
|
|||||||
static inline void arch_touch_nmi_watchdog(void) { }
|
static inline void arch_touch_nmi_watchdog(void) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_HAVE_NMI_WATCHDOG) || defined(CONFIG_HARDLOCKUP_DETECTOR)
|
|
||||||
# define NMI_WATCHDOG_SYSCTL_PERM 0644
|
|
||||||
#else
|
|
||||||
# define NMI_WATCHDOG_SYSCTL_PERM 0444
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(CONFIG_HARDLOCKUP_DETECTOR_PERF)
|
#if defined(CONFIG_HARDLOCKUP_DETECTOR_PERF)
|
||||||
extern void hardlockup_detector_perf_stop(void);
|
extern void hardlockup_detector_perf_stop(void);
|
||||||
extern void hardlockup_detector_perf_restart(void);
|
extern void hardlockup_detector_perf_restart(void);
|
||||||
|
|||||||
@@ -880,15 +880,6 @@ static struct ctl_table watchdog_sysctls[] = {
|
|||||||
.extra1 = SYSCTL_ZERO,
|
.extra1 = SYSCTL_ZERO,
|
||||||
.extra2 = (void *)&sixty,
|
.extra2 = (void *)&sixty,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
.procname = "nmi_watchdog",
|
|
||||||
.data = &watchdog_hardlockup_user_enabled,
|
|
||||||
.maxlen = sizeof(int),
|
|
||||||
.mode = NMI_WATCHDOG_SYSCTL_PERM,
|
|
||||||
.proc_handler = proc_nmi_watchdog,
|
|
||||||
.extra1 = SYSCTL_ZERO,
|
|
||||||
.extra2 = SYSCTL_ONE,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
.procname = "watchdog_cpumask",
|
.procname = "watchdog_cpumask",
|
||||||
.data = &watchdog_cpumask_bits,
|
.data = &watchdog_cpumask_bits,
|
||||||
@@ -952,10 +943,28 @@ static struct ctl_table watchdog_sysctls[] = {
|
|||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct ctl_table watchdog_hardlockup_sysctl[] = {
|
||||||
|
{
|
||||||
|
.procname = "nmi_watchdog",
|
||||||
|
.data = &watchdog_hardlockup_user_enabled,
|
||||||
|
.maxlen = sizeof(int),
|
||||||
|
.mode = 0444,
|
||||||
|
.proc_handler = proc_nmi_watchdog,
|
||||||
|
.extra1 = SYSCTL_ZERO,
|
||||||
|
.extra2 = SYSCTL_ONE,
|
||||||
|
},
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
|
||||||
static void __init watchdog_sysctl_init(void)
|
static void __init watchdog_sysctl_init(void)
|
||||||
{
|
{
|
||||||
register_sysctl_init("kernel", watchdog_sysctls);
|
register_sysctl_init("kernel", watchdog_sysctls);
|
||||||
|
|
||||||
|
if (watchdog_hardlockup_available)
|
||||||
|
watchdog_hardlockup_sysctl[0].mode = 0644;
|
||||||
|
register_sysctl_init("kernel", watchdog_hardlockup_sysctl);
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define watchdog_sysctl_init() do { } while (0)
|
#define watchdog_sysctl_init() do { } while (0)
|
||||||
#endif /* CONFIG_SYSCTL */
|
#endif /* CONFIG_SYSCTL */
|
||||||
@@ -1011,6 +1020,8 @@ static int __init lockup_detector_check(void)
|
|||||||
/* Make sure no work is pending. */
|
/* Make sure no work is pending. */
|
||||||
flush_work(&detector_work);
|
flush_work(&detector_work);
|
||||||
|
|
||||||
|
watchdog_sysctl_init();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1030,5 +1041,4 @@ void __init lockup_detector_init(void)
|
|||||||
allow_lockup_detector_init_retry = true;
|
allow_lockup_detector_init_retry = true;
|
||||||
|
|
||||||
lockup_detector_setup();
|
lockup_detector_setup();
|
||||||
watchdog_sysctl_init();
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user