[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <5d6222a80712200234t5129a0aes98e0f0869ad9c93c@mail.gmail.com>
Date: Thu, 20 Dec 2007 08:34:18 -0200
From: "Glauber de Oliveira Costa" <glommer@...il.com>
To: "Avi Kivity" <avi@...ranet.com>
Cc: "Avi Kivity" <avi@...o.co.il>, "Ingo Molnar" <mingo@...e.hu>,
kvm-devel <kvm-devel@...ts.sourceforge.net>,
linux-kernel <linux-kernel@...r.kernel.org>,
"Chris Wright" <chrisw@...s-sol.org>,
"Gerd Hoffmann" <kraxel@...hat.com>
Subject: Re: [kvm-devel] Guest kernel hangs in smp kvm for older kernels prior to tsc sync cleanup
On Dec 19, 2007 1:41 PM, Avi Kivity <avi@...ranet.com> wrote:
> Glauber de Oliveira Costa wrote:
> > Changes in rate does not sound good. It's possibly what's screwing up
> > my paravirt clock implementation in smp.
> >
>
> You should renew the timebase on vcpu migration, and hook cpufreq so
> that changes in frequency are reflected in the timebase.
To be conservative, I do it in every vcpu run, and have any kind of
cpu frequency scaling disabled. And it does not work.
In a trace in the host, I see that vcpu runs happens very often in
vcpu 0 (probably because exits happen often there, so we have to go
back),
and comparatively, very few times in vcpu 1.
So what's probably happening is : vcpu 1 does system_time + tsc_delta,
but vcpu 0 has already updated it so many times, the tsc does not
keep up,
and it end going backwards.
I'm running (in the host), the following test, upon module loading
(and Ingo can please tell me if I'm doing something idiotic in it,
compromising my conclusions)
void test (int foo)
{
u64 start, stop;
start = native_read_tsc();
udelay(foo);
stop = native_read_tsc();
printk("%d Result: %lld\n", foo, foo * 1000 - cycles_2_ns(stop
- start));
}
Output is:
30 Result: -126
90 Result: 576
300 Result: 2627
1000 Result: 9381
3000 Result: 28238
5000 Result: 48086
So the delta is expecting to get bigger. If a vcpu passes a long time
without having the time updated.
Xen manages to keep the guest tsc stable and steady by doing
synchronization from time to time.
We can either: (If I'm right at this, of course):
* put a periodic timer in the host to update the system time from time to time;
* use some sort of global timestamp, instead of the per-cpu one.
* do something akin to what xen does, and still rely on the tsc.
Any thoughts?
--
Glauber de Oliveira Costa.
"Free as in Freedom"
http://glommer.net
"The less confident you are, the more serious you have to act."
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@...r.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/
Powered by blists - more mailing lists