Re: [PATCH] clockevent: on resume program the next oneshot tick withthe next actual event
From: Jeremy Fitzhardinge
Date: Wed Mar 25 2009 - 19:40:26 EST
Ian Campbell wrote:
Hmm, yes I think so too. I misread tick_dev_program_event(), it seems
like it Does The Right Thing and I do see the Xen set_next_event hook
get called which I thought wasn't getting called earlier.
Turns out the virtual timer IRQ isn't getting reinitialised before
tick_oneshot_resume runs so we are just missing the interrupt, doh!
While that ordering is a bug, I'm still not sure it completely explains
what we're seeing here.
In drivers/xen/manage.c:do_suspend() we call clock_was_set(), which has
the specific effect of causing all the timer events to get retriggered
on all cpus. This is necessary because we don't unplug/replug all the
cpus, and the normal sysdev_resume() timer resume only resumes the
current cpu (which is cpu 0 in this case). It also deals with the
clocksource timebase shifting, as it will over suspend/resume (esp
suspend/reboot/resume, or suspend/migrate/resume). Your patch will only
re-trigger the next cpu0 timer event, and leave the rest hanging without
a next event.
So the question is why does your patch help?
I'm seeing much worse symptoms on my test machine: the resumed domain is
just sitting there spinning dead with 100% cpu use. I don't know if
this is related or something else.
J
Subject: xen: resume interrupts before system devices.
otherwise the first timer interrupt after resume is missed and we never
get another.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
diff --git a/drivers/xen/manage.c b/drivers/xen/manage.c
index 0489ea2..5269bb4 100644
--- a/drivers/xen/manage.c
+++ b/drivers/xen/manage.c
@@ -68,15 +68,15 @@ static int xen_suspend(void *data)
gnttab_resume();
xen_mm_unpin_all();
- sysdev_resume();
- device_power_up(PMSG_RESUME);
-
if (!*cancelled) {
xen_irq_resume();
xen_console_resume();
xen_timer_resume();
}
+ sysdev_resume();
+ device_power_up(PMSG_RESUME);
+
return 0;
}
Ian.
J
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/