On Mon, 2011-03-21 at 18:26 +0000, Frank Pan wrote:
> In recent pv-ops kernel, pvclock is not guaranteed as monotone.
> After a migration, pvclock can produce smaller cycle count.
>
> [The test is performed on next-2.6.32 tree]
> The issue occured when uptime(sender) > uptime(target), and with
> CONFIG_GENERIC_TIME. The guest get stucked after the migration,
> doing a huge loop inside update_wall_time, until the overflow of
> 64-bit unsigned offset.
>
> The following patch fixed this issue by introducing a global sign.
> Xen pvclock will update the cycle_last with the newest cycle count
> on the first read after migration.
Does the tree you are running have e7a3481c0246 (backported to the
2.6.32 longterm tree in 2.6.32.30 as 595b62a8acfb) in it? That commit
seems to deal with a very similar problem to this.
Ian.
>
> Signed-off-by: Frank Pan <frankpzh@xxxxxxxxx>
> ---
> linux-2.6-xen/arch/x86/xen/time.c | 12 +++++++++++-
> 1 files changed, 11 insertions(+), 1 deletions(-)
>
> diff --git a/linux-2.6-xen/arch/x86/xen/time.c
> b/linux-2.6-xen/arch/x86/xen/time.c
> index ab35140..ac6fe2a 100644
> --- a/linux-2.6-xen/arch/x86/xen/time.c
> +++ b/linux-2.6-xen/arch/x86/xen/time.c
> @@ -41,6 +41,9 @@ static DEFINE_PER_CPU(struct vcpu_runstate_info,
> runstate_snapshot);
> static DEFINE_PER_CPU(u64, residual_stolen);
> static DEFINE_PER_CPU(u64, residual_blocked);
>
> +/* xen_clocksource_get_cycles should update cycle_last after resume */
> +static int just_resume = 0;
> +
> /* return an consistent snapshot of 64-bit time/counter value */
> static u64 get64(const u64 *p)
> {
> @@ -177,7 +180,13 @@ cycle_t xen_clocksource_read(void)
>
> static cycle_t xen_clocksource_get_cycles(struct clocksource *cs)
> {
> - return xen_clocksource_read();
> + cycle_t c = xen_clocksource_read();
> +
> + if (unlikely(just_resume)) {
> + cs->cycle_last = c++;
> + just_resume = 0;
> + }
> + return c;
> }
>
> static void xen_read_wallclock(struct timespec *ts)
> @@ -441,6 +450,7 @@ void xen_timer_resume(void)
> {
> int cpu;
>
> + just_resume = 1;
> pvclock_resume();
>
> if (xen_clockevent != &xen_vcpuop_clockevent)
> --
> 1.7.0.4
>
>
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|