/* used to install a new clocksource */
extern int clocksource_register(struct clocksource*);
extern void clocksource_unregister(struct clocksource*);
+extern void clocksource_touch_watchdog(void);
extern struct clocksource* clocksource_get_next(void);
extern void clocksource_change_rating(struct clocksource *cs, int rating);
extern void clocksource_resume(void);
* kind, whether express or implied.
*/
#include <linux/pid_namespace.h>
+#include <linux/clocksource.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/console.h>
/* Signal the primary CPU that we are done: */
atomic_set(&cpu_in_kgdb[cpu], 0);
+ clocksource_touch_watchdog();
local_irq_restore(flags);
}
#endif
atomic_read(&kgdb_cpu_doing_single_step) != cpu) {
atomic_set(&kgdb_active, -1);
+ clocksource_touch_watchdog();
local_irq_restore(flags);
goto acquirelock;
kgdb_restore:
/* Free kgdb_active */
atomic_set(&kgdb_active, -1);
+ clocksource_touch_watchdog();
local_irq_restore(flags);
return error;
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
*