Commit d3b62ace authored by Douglas Anderson's avatar Douglas Anderson Committed by Andrew Morton

watchdog/buddy: cleanup how watchdog_buddy_check_hardlockup() is called

In the patch ("watchdog/hardlockup: detect hard lockups using secondary
(buddy) CPUs"), we added a call from the common watchdog.c file into the
buddy.  That call could be done more cleanly.  Specifically:

1. If we move the call into watchdog_hardlockup_kick() then it keeps
   watchdog_timer_fn() simpler.
2. We don't need to pass an "unsigned long" to the buddy for the timer
   count. In the patch ("watchdog/hardlockup: add a "cpu" param to
   watchdog_hardlockup_check()") the count was changed to "atomic_t"
   which is backed by an int, so we should match types.

Link: https://lkml.kernel.org/r/20230526184139.6.I006c7d958a1ea5c4e1e4dc44a25596d9bb5fd3ba@changeidSigned-off-by: default avatarDouglas Anderson <dianders@chromium.org>
Suggested-by: default avatarPetr Mladek <pmladek@suse.com>
Reviewed-by: default avatarPetr 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: default avatarAndrew Morton <akpm@linux-foundation.org>
parent 05e7b558
...@@ -114,9 +114,9 @@ void watchdog_hardlockup_disable(unsigned int cpu); ...@@ -114,9 +114,9 @@ void watchdog_hardlockup_disable(unsigned int cpu);
void lockup_detector_reconfigure(void); void lockup_detector_reconfigure(void);
#ifdef CONFIG_HARDLOCKUP_DETECTOR_BUDDY #ifdef CONFIG_HARDLOCKUP_DETECTOR_BUDDY
void watchdog_buddy_check_hardlockup(unsigned long hrtimer_interrupts); void watchdog_buddy_check_hardlockup(int hrtimer_interrupts);
#else #else
static inline void watchdog_buddy_check_hardlockup(unsigned long hrtimer_interrupts) {} static inline void watchdog_buddy_check_hardlockup(int hrtimer_interrupts) {}
#endif #endif
/** /**
......
...@@ -131,9 +131,12 @@ static bool is_hardlockup(unsigned int cpu) ...@@ -131,9 +131,12 @@ static bool is_hardlockup(unsigned int cpu)
return false; return false;
} }
static unsigned long watchdog_hardlockup_kick(void) static void watchdog_hardlockup_kick(void)
{ {
return atomic_inc_return(this_cpu_ptr(&hrtimer_interrupts)); int new_interrupts;
new_interrupts = atomic_inc_return(this_cpu_ptr(&hrtimer_interrupts));
watchdog_buddy_check_hardlockup(new_interrupts);
} }
void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs) void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
...@@ -195,7 +198,7 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs) ...@@ -195,7 +198,7 @@ void watchdog_hardlockup_check(unsigned int cpu, struct pt_regs *regs)
#else /* CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER */ #else /* CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER */
static inline unsigned long watchdog_hardlockup_kick(void) { return 0; } static inline void watchdog_hardlockup_kick(void) { }
#endif /* !CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER */ #endif /* !CONFIG_HARDLOCKUP_DETECTOR_COUNTS_HRTIMER */
...@@ -449,15 +452,11 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer) ...@@ -449,15 +452,11 @@ static enum hrtimer_restart watchdog_timer_fn(struct hrtimer *hrtimer)
struct pt_regs *regs = get_irq_regs(); struct pt_regs *regs = get_irq_regs();
int duration; int duration;
int softlockup_all_cpu_backtrace = sysctl_softlockup_all_cpu_backtrace; int softlockup_all_cpu_backtrace = sysctl_softlockup_all_cpu_backtrace;
unsigned long hrtimer_interrupts;
if (!watchdog_enabled) if (!watchdog_enabled)
return HRTIMER_NORESTART; return HRTIMER_NORESTART;
hrtimer_interrupts = watchdog_hardlockup_kick(); watchdog_hardlockup_kick();
/* test for hardlockups */
watchdog_buddy_check_hardlockup(hrtimer_interrupts);
/* kick the softlockup detector */ /* kick the softlockup detector */
if (completion_done(this_cpu_ptr(&softlockup_completion))) { if (completion_done(this_cpu_ptr(&softlockup_completion))) {
......
...@@ -72,7 +72,7 @@ void watchdog_hardlockup_disable(unsigned int cpu) ...@@ -72,7 +72,7 @@ void watchdog_hardlockup_disable(unsigned int cpu)
cpumask_clear_cpu(cpu, &watchdog_cpus); cpumask_clear_cpu(cpu, &watchdog_cpus);
} }
void watchdog_buddy_check_hardlockup(unsigned long hrtimer_interrupts) void watchdog_buddy_check_hardlockup(int hrtimer_interrupts)
{ {
unsigned int next_cpu; unsigned int next_cpu;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment