* mini-os: x86: virtual-timer interrupt and get_time_values_from_xen
@ 2014-10-17 14:12 Thomas Leonard
2014-10-21 10:38 ` Ian Campbell
0 siblings, 1 reply; 3+ messages in thread
From: Thomas Leonard @ 2014-10-17 14:12 UTC (permalink / raw)
To: xen-devel@lists.xenproject.org
In Mini-OS on x86 we have:
static void timer_handler(evtchn_port_t ev, struct pt_regs *regs, void *ign)
{
get_time_values_from_xen();
update_wallclock();
}
static evtchn_port_t port;
void init_time(void)
{
printk("Initialising timer interface\n");
port = bind_virq(VIRQ_TIMER, &timer_handler, NULL);
unmask_evtchn(port);
}
It seems that the timer values are only correct after the first timer
interrupt occurs. For example, test.c can output this (if you remove
xenbus_tester so it starts the timer test quickly enough):
Periodic thread started.
T(s=8734 us=790808)
T(s=1413543796 us=487564)
T(s=1413543797 us=487867)
...
I can fix this by getting it to read the values in init_time:
void init_time(void)
{
printk("Initialising timer interface\n");
port = bind_virq(VIRQ_TIMER, &timer_handler, NULL);
unmask_evtchn(port);
get_time_values_from_xen();
update_wallclock();
}
But now I wonder whether the code in timer_handler is needed at all.
It seems that all code that reads the timer already ensures these
values are up-to-date by comparing the version number (presumably this
doesn't work the first time because shadow isn't initialised). With
the fix to init_time, is it safe to use an empty handler?
Thanks,
--
Dr Thomas Leonard http://0install.net/
GPG: 9242 9807 C985 3C07 44A6 8B9A AE07 8280 59A5 3CC1
GPG: DA98 25AE CAD0 8975 7CDA BD8E 0713 3F96 CA74 D8BA
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: mini-os: x86: virtual-timer interrupt and get_time_values_from_xen
2014-10-17 14:12 mini-os: x86: virtual-timer interrupt and get_time_values_from_xen Thomas Leonard
@ 2014-10-21 10:38 ` Ian Campbell
2014-10-21 21:46 ` Samuel Thibault
0 siblings, 1 reply; 3+ messages in thread
From: Ian Campbell @ 2014-10-21 10:38 UTC (permalink / raw)
To: Thomas Leonard, Samuel Thibault, keir; +Cc: xen-devel@lists.xenproject.org
(adding some CCs, and not trimming quotes for their benefit)
On Fri, 2014-10-17 at 15:12 +0100, Thomas Leonard wrote:
> In Mini-OS on x86 we have:
>
> static void timer_handler(evtchn_port_t ev, struct pt_regs *regs, void *ign)
> {
> get_time_values_from_xen();
> update_wallclock();
> }
>
> static evtchn_port_t port;
> void init_time(void)
> {
> printk("Initialising timer interface\n");
> port = bind_virq(VIRQ_TIMER, &timer_handler, NULL);
> unmask_evtchn(port);
> }
>
> It seems that the timer values are only correct after the first timer
> interrupt occurs. For example, test.c can output this (if you remove
> xenbus_tester so it starts the timer test quickly enough):
>
> Periodic thread started.
> T(s=8734 us=790808)
> T(s=1413543796 us=487564)
> T(s=1413543797 us=487867)
> ...
>
> I can fix this by getting it to read the values in init_time:
>
> void init_time(void)
> {
> printk("Initialising timer interface\n");
> port = bind_virq(VIRQ_TIMER, &timer_handler, NULL);
> unmask_evtchn(port);
>
> get_time_values_from_xen();
> update_wallclock();
> }
>
> But now I wonder whether the code in timer_handler is needed at all.
> It seems that all code that reads the timer already ensures these
> values are up-to-date by comparing the version number (presumably this
> doesn't work the first time because shadow isn't initialised). With
> the fix to init_time, is it safe to use an empty handler?
It seems like you might be right wrt get_time_values_from_xen(), since
the shadow struct is static to this file all users must be in there, and
on inspection it does seem like everything is always up to date.
(get_nsec_offset appears not, but it's only caller takes care of it).
However I think the update_wallclock is needed, since gettimeofday
doesn't force the update of shadow_ts (nb: different thing to shadow).
Essentially it uses the monotonic_clock to interpolate between timer
ticks.
Ian.
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: mini-os: x86: virtual-timer interrupt and get_time_values_from_xen
2014-10-21 10:38 ` Ian Campbell
@ 2014-10-21 21:46 ` Samuel Thibault
0 siblings, 0 replies; 3+ messages in thread
From: Samuel Thibault @ 2014-10-21 21:46 UTC (permalink / raw)
To: Ian Campbell; +Cc: xen-devel@lists.xenproject.org, Thomas Leonard, keir
Hello,
Thanks for the Cc, I had indeed missed it.
Ian Campbell, le Tue 21 Oct 2014 11:38:49 +0100, a écrit :
> However I think the update_wallclock is needed, since gettimeofday
> doesn't force the update of shadow_ts (nb: different thing to shadow).
> Essentially it uses the monotonic_clock to interpolate between timer
> ticks.
Yes. Not updating on timer tick would lead to time divergence. So the
right fix does seem to me to call get_time_values_from_xen once at
initialization (and let it called by the timer handler).
Samuel
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2014-10-21 21:46 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-10-17 14:12 mini-os: x86: virtual-timer interrupt and get_time_values_from_xen Thomas Leonard
2014-10-21 10:38 ` Ian Campbell
2014-10-21 21:46 ` Samuel Thibault
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.