From 423be1545cb5ff6fb9cc7ab2b2a2e988fd03f759 Mon Sep 17 00:00:00 2001 From: Tomas Hruby Date: Wed, 25 May 2011 09:42:11 +0200 Subject: [PATCH] Fix for SPROFILE == 0 - contributed by Antoine Leca --- kernel/arch/i386/arch_clock.c | 3 ++- kernel/proc.c | 4 ++++ kernel/watchdog.c | 8 ++++++++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/kernel/arch/i386/arch_clock.c b/kernel/arch/i386/arch_clock.c index 34faee56a..235a9336c 100644 --- a/kernel/arch/i386/arch_clock.c +++ b/kernel/arch/i386/arch_clock.c @@ -288,9 +288,10 @@ PUBLIC void context_stop_idle(void) if (is_idle) restart_local_timer(); - +#if SPROFILE if (sprofiling) get_cpulocal_var(idle_interrupted) = 1; +#endif } PUBLIC u64_t ms_2_cpu_time(unsigned ms) diff --git a/kernel/proc.c b/kernel/proc.c index f14b518ef..015150afc 100644 --- a/kernel/proc.c +++ b/kernel/proc.c @@ -222,6 +222,9 @@ PRIVATE void idle(void) /* start accounting for the idle time */ context_stop(proc_addr(KERNEL)); +#if !SPROFILE + halt_cpu(); +#else if (!sprofiling) halt_cpu(); else { @@ -234,6 +237,7 @@ PRIVATE void idle(void) interrupts_disable(); *v = 0; } +#endif /* * end of accounting for the idle task does not happen here, the kernel * is handling stuff for quite a while before it gets back here! diff --git a/kernel/watchdog.c b/kernel/watchdog.c index 739aa3e5d..763435108 100644 --- a/kernel/watchdog.c +++ b/kernel/watchdog.c @@ -52,6 +52,7 @@ PRIVATE void lockup_check(struct nmi_frame * frame) PUBLIC void nmi_watchdog_handler(struct nmi_frame * frame) { +#if SPROFILE /* * Do not check for lockups while profiling, it is extremely likely that * a false positive is detected if the frequency is high @@ -63,6 +64,13 @@ PUBLIC void nmi_watchdog_handler(struct nmi_frame * frame) if ((watchdog_enabled || sprofiling) && watchdog->reinit) watchdog->reinit(cpuid); +#else + if (watchdog_enabled) { + lockup_check(frame); + if (watchdog->reinit) + watchdog->reinit(cpuid); + } +#endif } int nmi_watchdog_start_profiling(const unsigned freq) -- 2.44.0