virtualization.lists.linux-foundation.org archive mirror
 help / color / mirror / Atom feed
From: "Jan Beulich" <jbeulich@novell.com>
To: Jeremy Fitzhardinge <jeremy@goop.org>
Cc: Xen-devel <xen-devel@lists.xensource.com>,
	Andrew Morton <akpm@linux-foundation.org>,
	Andi Kleen <ak@suse.de>, lkml <linux-kernel@vger.kernel.org>,
	Chris Wright <chrisw@sous-sol.org>,
	virtualization@lists.osdl.org, Ingo Molnar <mingo@elte.hu>,
	Linus Torvalds <torvalds@linux-foundation.org>,
	Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [patch 14/33] xen: xen time implementation
Date: Wed, 06 Jun 2007 10:39:02 +0200	[thread overview]
Message-ID: <46668EC6.76E4.0078.0@novell.com> (raw)
In-Reply-To: <20070522141252.030961467@goop.org>

>+cycle_t xen_clocksource_read(void)
>+{
>+	struct shadow_time_info *shadow = &get_cpu_var(shadow_time);
>+	cycle_t ret;
>+
>+	get_time_values_from_xen();
>+
>+	ret = shadow->system_timestamp + get_nsec_offset(shadow);
>+
>+	put_cpu_var(shadow_time);
>+
>+	return ret;
>+}

I'm afraid this mechanism is pretty unreliable on SMP: getnstimeofday() and
do_gettimeofday() both use the difference between the last snapshot taken
and the current value read from the clock source. Since I had added this
clocksource code to our kernel, I had reproducible hangs on one of the
systems I regularly work with (you may have seen the respective thread
on xen-devel), which recently I finally found time to look into. The issue is
that on that system, transition into ACPI mode takes over 600ms (SMM
execution, and hence no interrupts delivered during that time), and with
Xen using the PIT (PM timer support was added by Keir as a result of this,
but that doesn't cure the problem here, it just reduces the likelihood it'll
be encountered) platform time and local time got pretty much out of sync.

Xen itself knows to deal with this (by using an error correction factor to
slow down the local [TSC-based] clock), but for the kernel such a situation
may be fatal: If clocksource->cycle_last was most recently set on a CPU
with shadow->tsc_to_nsec_mul sufficiently different from that where
getnstimeofday() is being used, timekeeping.c's __get_nsec_offset() will
calculate a huge nanosecond value (due to cyc2ns() doing unsigned
operations), worth abut 4000s. This value may then be used to set a
timeout that was intended to be a few milliseconds, effectively yielding
a hung app (and perhaps system).

I'm sure the time keeping code can't deal with negative values returned
from __get_nsec_offset() (timespec_add_ns() is an example, used in
__get_realtime_clock_ts()), otherwise a potential solution might have
been to set the clock source's multiplier and shift to one and zero
respectively. But I think that a clock source can be expected to be
monotonic anyway, which Xen's interpolation mechanism doesn't
guarantee across multiple CPUs. (I'm actually beginning to think that
this might also be the reason for certain test suites occasionally reporting
timeouts to fire early.)

Unfortunately so far I haven't been able to think of a reasonable solution
to this - a simplistic approach like making xen_clocksource_read() check
the value it is about to return against the last value it returned doesn't
seem to be a good idea (time might appear to have stopped over some
period of time otherwise), nor does attempting to adjust the shadowed
tsc_to_nsec_mul values (because the kernel can't know whether it should
boost the lagging CPU or throttle the rushing one).

Jan

  reply	other threads:[~2007-06-06  8:39 UTC|newest]

Thread overview: 53+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-05-22 14:09 [patch 00/33] xen: Xen paravirt_ops implementation Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 01/33] xen: paravirt: add an "mm" argument to alloc_pt Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 02/33] xen: paravirt: add a hook for once the allocator is ready Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 03/33] xen: paravirt: increase IRQ limit Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 04/33] xen: paravirt: unstatic leave_mm Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 05/33] xen: paravirt: unstatic smp_store_cpu_info Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 06/33] xen: paravirt: make siblingmap functions visible Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 07/33] xen: paravirt: export __supported_pte_mask Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 08/33] xen: Allocate and free vmalloc areas Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 09/33] xen: Add nosegneg capability to the vsyscall page notes Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 10/33] xen: Add Xen interface header files Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 11/33] xen: Core Xen implementation Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 12/33] xen: Xen virtual mmu Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 13/33] xen: xen event channels Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 14/33] xen: xen time implementation Jeremy Fitzhardinge
2007-06-06  8:39   ` Jan Beulich [this message]
2007-06-06  8:54     ` [Xen-devel] " Keir Fraser
2007-06-06  8:54     ` Keir Fraser
     [not found]     ` <C28C34EB.101FE%keir@xensource.com>
2007-06-06  9:30       ` Jan Beulich
2007-06-06  9:56         ` [Xen-devel] " Keir Fraser
2007-06-06  9:56         ` Keir Fraser
     [not found]         ` <C28C4362.1021C%keir@xensource.com>
2007-06-06 11:00           ` Jan Beulich
2007-06-06 11:52             ` [Xen-devel] " Keir Fraser
2007-06-06 11:52             ` Keir Fraser
2007-06-06 10:05     ` Jeremy Fitzhardinge
2007-06-06 10:20       ` Jan Beulich
2007-06-06 10:26       ` Andi Kleen
2007-06-06 14:15         ` [Xen-devel] " Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 15/33] xen: xen configuration Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 16/33] xen: xen: add pinned page flag Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 17/33] xen: Complete pagetable pinning for Xen Jeremy Fitzhardinge
2007-05-22 14:09 ` [patch 18/33] xen: xen: ignore RW mapping of RO pages in pagetable_init Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 19/33] xen: Account for time stolen by Xen Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 20/33] xen: Implement xen_sched_clock Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 21/33] xen: Xen SMP guest support Jeremy Fitzhardinge
2007-06-06  7:34   ` Jan Beulich
2007-06-06  8:33     ` [Xen-devel] " Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 22/33] xen: Add support for preemption Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 23/33] xen: xen: lazy-mmu operations Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 24/33] xen: xen: hack to prevent bad segment register reload Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 25/33] xen: Use the hvc console infrastructure for Xen console Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 26/33] xen: Add Xen grant table support Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 27/33] xen: Add the Xenbus sysfs and virtual device hotplug driver Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 28/33] xen: Add Xen virtual block device driver Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 29/33] xen: Add the Xen virtual network " Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 30/33] xen: Xen machine operations Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 31/33] xen: xen: handle external requests for shutdown, reboot and sysrq Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 32/33] xen: Place vcpu_info structure into per-cpu memory, if possible Jeremy Fitzhardinge
2007-05-22 14:10 ` [patch 33/33] xen: Attempt to patch inline versions of common operations Jeremy Fitzhardinge
2007-05-22 14:57 ` [patch 00/33] xen: Xen paravirt_ops implementation Andi Kleen
2007-05-22 15:06   ` Jeremy Fitzhardinge
     [not found] <C28C5EAB.1024D%keir@xensource.com>
2007-06-06 12:18 ` [Xen-devel] [patch 14/33] xen: xen time implementation Andi Kleen
2007-06-06 12:46   ` Jan Beulich
2007-06-06 12:53     ` Andi Kleen

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=46668EC6.76E4.0078.0@novell.com \
    --to=jbeulich@novell.com \
    --cc=ak@suse.de \
    --cc=akpm@linux-foundation.org \
    --cc=chrisw@sous-sol.org \
    --cc=jeremy@goop.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@elte.hu \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    --cc=virtualization@lists.osdl.org \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).