kgdb: clocksource watchdog
In order to not trip the clocksource watchdog, kgdb must touch the clocksource watchdog on the return to normal system run state. Signed-off-by: Jason Wessel <jason.wessel@windriver.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
Родитель
d359752407
Коммит
7c3078b637
|
@ -216,6 +216,7 @@ static inline void clocksource_calculate_interval(struct clocksource *c,
|
||||||
/* used to install a new clocksource */
|
/* used to install a new clocksource */
|
||||||
extern int clocksource_register(struct clocksource*);
|
extern int clocksource_register(struct clocksource*);
|
||||||
extern void clocksource_unregister(struct clocksource*);
|
extern void clocksource_unregister(struct clocksource*);
|
||||||
|
extern void clocksource_touch_watchdog(void);
|
||||||
extern struct clocksource* clocksource_get_next(void);
|
extern struct clocksource* clocksource_get_next(void);
|
||||||
extern void clocksource_change_rating(struct clocksource *cs, int rating);
|
extern void clocksource_change_rating(struct clocksource *cs, int rating);
|
||||||
extern void clocksource_resume(void);
|
extern void clocksource_resume(void);
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
* kind, whether express or implied.
|
* kind, whether express or implied.
|
||||||
*/
|
*/
|
||||||
#include <linux/pid_namespace.h>
|
#include <linux/pid_namespace.h>
|
||||||
|
#include <linux/clocksource.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
|
@ -574,6 +575,7 @@ static void kgdb_wait(struct pt_regs *regs)
|
||||||
|
|
||||||
/* Signal the primary CPU that we are done: */
|
/* Signal the primary CPU that we are done: */
|
||||||
atomic_set(&cpu_in_kgdb[cpu], 0);
|
atomic_set(&cpu_in_kgdb[cpu], 0);
|
||||||
|
clocksource_touch_watchdog();
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1396,6 +1398,7 @@ acquirelock:
|
||||||
atomic_read(&kgdb_cpu_doing_single_step) != cpu) {
|
atomic_read(&kgdb_cpu_doing_single_step) != cpu) {
|
||||||
|
|
||||||
atomic_set(&kgdb_active, -1);
|
atomic_set(&kgdb_active, -1);
|
||||||
|
clocksource_touch_watchdog();
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
goto acquirelock;
|
goto acquirelock;
|
||||||
|
@ -1487,6 +1490,7 @@ acquirelock:
|
||||||
kgdb_restore:
|
kgdb_restore:
|
||||||
/* Free kgdb_active */
|
/* Free kgdb_active */
|
||||||
atomic_set(&kgdb_active, -1);
|
atomic_set(&kgdb_active, -1);
|
||||||
|
clocksource_touch_watchdog();
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
|
|
|
@ -221,6 +221,18 @@ void clocksource_resume(void)
|
||||||
spin_unlock_irqrestore(&clocksource_lock, flags);
|
spin_unlock_irqrestore(&clocksource_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clocksource_touch_watchdog - Update watchdog
|
||||||
|
*
|
||||||
|
* Update the watchdog after exception contexts such as kgdb so as not
|
||||||
|
* to incorrectly trip the watchdog.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void clocksource_touch_watchdog(void)
|
||||||
|
{
|
||||||
|
clocksource_resume_watchdog();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* clocksource_get_next - Returns the selected clocksource
|
* clocksource_get_next - Returns the selected clocksource
|
||||||
*
|
*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче