After being offline for a long time, the softlockup watchdog triggers
a BUG() on our faces. This is expected, as in fact, we spent more than
a fixed 10*HZ amount of time without touching the watchdog.
However, by inspecting the contents of RUNSTATE_offline, we can gain
awareness of the fact, and do better than that. This patch fixes it.
Signed-off-by: Glauber de Oliveira Costa <gcosta@xxxxxxxxxx>
--
Glauber de Oliveira Costa
Red Hat Inc.
"Free as in Freedom"
# HG changeset patch
# User gcosta@xxxxxxxxxx
# Date 1164376767 18000
# Node ID 0f235d94eeabbca64c14ae6d5ae3708870522f60
# Parent 47fcd5f768fef50cba2fc6dbadc7b75de55e88a5
[LINUX] Avoid triggering the softlockup BUG when offline for too long.
After being offline for a long time, the softlockup watchdog triggers
a BUG() on our faces. This is expected, as in fact, we spent more than
a fixed 10*HZ amount of time without touching the watchdog.
However, by inspecting the contents of RUNSTATE_offline, we can gain
awareness of the fact, and do better than that. This patch fixes it.
Signed-off-by: Glauber de Oliveira Costa <gcosta@xxxxxxxxxx>
diff -r 47fcd5f768fe -r 0f235d94eeab
linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c
--- a/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Fri Nov 17 08:30:43
2006 -0500
+++ b/linux-2.6-xen-sparse/arch/i386/kernel/time-xen.c Fri Nov 24 08:59:27
2006 -0500
@@ -129,6 +129,8 @@ static DEFINE_PER_CPU(u64, processed_sys
/* How much CPU time was spent blocked and how much was 'stolen'? */
static DEFINE_PER_CPU(u64, processed_stolen_time);
static DEFINE_PER_CPU(u64, processed_blocked_time);
+/* How much time did we spend offline? */
+static DEFINE_PER_CPU(u64, offline_time);
/* Current runstate of each CPU (updated automatically by the hypervisor). */
static DEFINE_PER_CPU(struct vcpu_runstate_info, runstate);
@@ -607,7 +609,7 @@ EXPORT_SYMBOL(profile_pc);
irqreturn_t timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
{
- s64 delta, delta_cpu, stolen, blocked;
+ s64 delta, delta_cpu, stolen, blocked, offline;
u64 sched_time;
int i, cpu = smp_processor_id();
struct shadow_time_info *shadow = &per_cpu(shadow_time, cpu);
@@ -636,6 +638,8 @@ irqreturn_t timer_interrupt(int irq, voi
per_cpu(processed_stolen_time, cpu);
blocked = runstate->time[RUNSTATE_blocked] -
per_cpu(processed_blocked_time, cpu);
+ offline = runstate->time[RUNSTATE_offline] -
+ per_cpu(offline_time, cpu);
barrier();
} while (sched_time != runstate->state_entry_time);
} while (!time_values_up_to_date(cpu));
@@ -710,6 +714,13 @@ irqreturn_t timer_interrupt(int irq, voi
(cputime_t)delta_cpu);
}
+ /* We know we were offline for too long, avoid triggering the
+ * softlockup_tick bug */
+ if ((offline > 10*HZ)) {
+ touch_softlockup_watchdog();
+ per_cpu(offline_time, cpu) += offline;
+ }
+
/* Local timer processing (see update_process_times()). */
run_local_timers();
if (rcu_pending(cpu))
@@ -734,6 +745,8 @@ static void init_missing_ticks_accountin
runstate->time[RUNSTATE_blocked];
per_cpu(processed_stolen_time, cpu) =
runstate->time[RUNSTATE_runnable] +
+ runstate->time[RUNSTATE_offline];
+ per_cpu(offline_time, cpu) =
runstate->time[RUNSTATE_offline];
}
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|