From: Dave Winchell <dwinchell@virtualiron.com>
To: Keir Fraser <Keir.Fraser@cl.cam.ac.uk>
Cc: "Dong, Eddie" <eddie.dong@intel.com>,
Dave Winchell <dwinchell@virtualiron.com>,
"Shan, Haitao" <haitao.shan@intel.com>,
xen-devel@lists.xensource.com, "Jiang,
Yunhong" <yunhong.jiang@intel.com>
Subject: Re: [PATCH] Add a timer mode that disables pending missed ticks
Date: Sat, 03 Nov 2007 17:17:46 -0400 [thread overview]
Message-ID: <472CE57A.9030804@virtualiron.com> (raw)
In-Reply-To: <472B66F1.20201@virtualiron.com>
[-- Attachment #1: Type: text/plain, Size: 4157 bytes --]
Hi Keir,
Thanks for applying the fixes in the last submit.
In moving the test for no_missed_tick_accounting into
pt_process_missed_ticks()
you forgot to add the scheduling part.
This patch adds the scheduling.
It also defines two options for scheduling, PT_SCHEDULE_SYNC and
PT_SCHEDULE_ASYNC.
The default is PT_SCHEDULE_SYNC.
I am not providing any means for selecting between these two options.
My purpose is to have something to discuss and you can do as you like with
this patch or tell me what you want.
We have been discussing the difference between SYNC and ASYNC scheduling.
I found the reason the code checked in as of 10.31 had an error of .23%.
In the following fragment from pt_restore_timer()
if ( !mode_is(v->domain, no_missed_tick_accounting) )
{
pt_process_missed_ticks(pt);
}
else if ( (NOW() - pt->scheduled) >= 0 )
{
pt->pending_intr_nr++;
pt->scheduled = NOW() + pt->period;
}
set_timer(&pt->timer, pt->scheduled);
the pt->pending_intr_nr++; line is the problem because if the value of
pt->pending_intr_nr is non-zero before the increment, then you get extra
timer injections. We can either test for zero, set unconditionally to 1,
or leave the line out altogether and let the timeout take care of it.
I have chosen the later in the patch.
The result with this fixed, and with the patch submitted here
is as follows with the usual test I have been describing.
For both SYNC and ASYNC methods, with a sles9sp3-64 and
rh4u4-64 guest running at the same time, the errors were less than
.028%. I have run some tests with single guests and big loads
and found sles to be in error by .1% with the ASYNC method.
All of the SYNC tests have been under .03%.
But my tests are short, usually 10 to 20 minutes. And there is quite a bit
of variability. Looking at the timer code for the two guests,
they look identical to me.
In my review of the Linux code, I see no reason why the interrupt
deliveries need to be "SYNC". This has been your intuition all along.
So, I leave the choice up to you.
thanks,
Dave
Dave Winchell wrote:
> oops, you're right. I missed the ( (NOW() - pt->scheduled) >= 0 ).
>
> This means I will have to come up with another explanation.
>
> -Dave
>
>
> Keir Fraser wrote:
>
>> Thanks for the explanation. I think you are mis-describing the current
>> behaviour of vpt.c though (If I understand it correctly myself, which
>> I may
>> not!). As I understand it, we do *not* unconditionally deliver a tick
>> and
>> reset the time space when a vcpu is scheduled onto a cpu. We only do
>> that if
>> (NOW() - pt->scheduled) >= 0 -- that is if more than a tick period has
>> passed. Otherwise we wait to deliver the next tick exactly one period
>> after
>> the previous tick was delivered. The remainder of your explanation
>> seems to
>> be predicated on the (impossible?) case that we deliver a tick less
>> than one
>> period after the previous one.
>>
>> Am I confused? :-) Also, what version of Linux are we talking about
>> here,
>> and what periodic timer, and x86/64 or i386? There are lots of different
>> Linux timer-handling logics out there in the wild!
>>
>> -- Keir
>>
>> On 2/11/07 15:51, "Dave Winchell" <dwinchell@virtualiron.com> wrote:
>>
>>
>>
>>> Let D be the time that the clock vcpu is descheduled and P be
>>> the clock period. When D < P, I think there is an issue.
>>>
>>> The reason is that Linux's offset calculation, which affects the
>>> last clock interrupt tsc that is recorded, doesn't kick in if the
>>> time since the last interrupt is less than P. In this case it sets
>>> offset to zero. Linux records the tsc of the current (last) clock
>>> interrupt
>>> as (current tsc - offset).
>>>
>>> Interrupt delivery method AS delivers a clock interrupt
>>> at context switch (in) time. When D < P, Linux records the
>>> interrupt delivery time as current tsc and bumps jiffies.
>>> This results in a gain of time equal to P-D over wall time.
>>>
>>> For method S this never happens because the interrupt isn't
>>> delivered until the next boundary.
>>>
>>
>>
>>
>>
>>
>
[-- Attachment #2: vpt.patch.11.03 --]
[-- Type: text/plain, Size: 1187 bytes --]
diff -r 650cadd1b283 xen/arch/x86/hvm/vpt.c
--- a/xen/arch/x86/hvm/vpt.c Fri Nov 02 16:38:11 2007 +0000
+++ b/xen/arch/x86/hvm/vpt.c Sat Nov 03 16:20:04 2007 -0400
@@ -45,12 +45,20 @@ static void pt_unlock(struct periodic_ti
spin_unlock(&pt->vcpu->arch.hvm_vcpu.tm_lock);
}
+#define PT_SCHEDULE_SYNC 0
+#define PT_SCHEDULE_ASYNC 1
+int pt_missed_option = PT_SCHEDULE_SYNC;
static void pt_process_missed_ticks(struct periodic_time *pt)
{
s_time_t missed_ticks;
- if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
- return;
+ if ( mode_is(pt->vcpu->domain, no_missed_tick_accounting) && (pt_missed_option == PT_SCHEDULE_ASYNC)) {
+ if ( pt->one_shot )
+ return;
+ if ( (NOW() - pt->scheduled) >= 0 )
+ pt->scheduled = NOW() + pt->period;
+ return;
+ }
if ( pt->one_shot )
return;
@@ -60,7 +68,8 @@ static void pt_process_missed_ticks(stru
return;
missed_ticks = missed_ticks / (s_time_t) pt->period + 1;
- pt->pending_intr_nr += missed_ticks;
+ if ( !mode_is(pt->vcpu->domain, no_missed_tick_accounting) )
+ pt->pending_intr_nr += missed_ticks;
pt->scheduled += missed_ticks * pt->period;
}
[-- Attachment #3: Type: text/plain, Size: 138 bytes --]
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel
next prev parent reply other threads:[~2007-11-03 21:17 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-10-30 14:28 [PATCH] Add a timer mode that disables pending missed ticks Shan, Haitao
2007-10-30 16:12 ` Keir Fraser
2007-10-30 21:16 ` Dave Winchell
2007-10-31 7:09 ` Keir Fraser
2007-11-01 21:14 ` Dave Winchell
2007-11-01 21:21 ` Dave Winchell
2007-11-02 9:40 ` Keir Fraser
2007-11-02 15:51 ` Dave Winchell
2007-11-02 16:14 ` Keir Fraser
2007-11-02 16:35 ` Keir Fraser
2007-11-02 18:05 ` Dave Winchell
2007-11-03 21:17 ` Dave Winchell [this message]
2007-11-03 22:31 ` Keir Fraser
2007-11-05 14:36 ` Dave Winchell
2007-11-07 14:39 ` Dave Winchell
2007-11-07 14:39 ` Keir Fraser
2007-11-07 16:23 ` Dave Winchell
2007-11-07 17:10 ` Keir Fraser
2007-11-07 17:29 ` Keir Fraser
2007-11-07 17:47 ` Keir Fraser
2007-11-07 19:38 ` Dave Winchell
2007-11-08 8:07 ` Keir Fraser
2007-11-08 14:43 ` Dave Winchell
2007-11-08 14:53 ` Keir Fraser
2007-11-08 15:08 ` Dave Winchell
2007-11-09 19:22 ` Dave Winchell
2007-11-10 10:55 ` Keir Fraser
2007-11-12 15:37 ` Dave Winchell
2007-11-26 20:57 ` Dave Winchell
2007-12-06 11:57 ` Keir Fraser
2007-12-19 18:57 ` Dan Magenheimer
2007-12-19 19:32 ` Dave Winchell
2008-01-03 22:57 ` Dan Magenheimer
2008-01-03 23:24 ` Dave Winchell
2008-01-04 23:24 ` Dave Winchell
2008-01-08 14:33 ` Keir Fraser
2008-01-09 16:53 ` Dave Winchell
2008-01-09 17:19 ` Dan Magenheimer
2008-01-09 19:14 ` Keir Fraser
2008-01-25 23:50 ` Dan Magenheimer
2008-01-27 21:21 ` Dave Winchell
2008-01-28 0:29 ` Dan Magenheimer
2008-01-28 15:21 ` Dave Winchell
2008-01-29 22:34 ` Dan Magenheimer
2008-01-30 15:25 ` Dave Winchell
2008-01-30 21:04 ` Deepak Patel
2008-01-30 21:44 ` Dave Winchell
2008-02-01 22:31 ` Dan Magenheimer
2008-02-04 20:07 ` Dave Winchell
2008-02-08 21:21 ` Dave Winchell
2008-02-11 16:52 ` Dave Winchell
2008-02-14 15:59 ` Dave Winchell
2008-02-14 16:21 ` Dan Magenheimer
2008-02-14 17:55 ` Dave Winchell
2008-02-15 16:46 ` Dan Magenheimer
2008-02-15 17:28 ` Dave Winchell
2008-02-19 15:26 ` Dave Winchell
2008-02-19 17:55 ` Dan Magenheimer
2008-02-19 19:29 ` Keir Fraser
2008-02-19 20:50 ` Dave Winchell
2008-02-19 23:38 ` Dan Magenheimer
2008-02-20 23:40 ` Dan Magenheimer
2008-02-25 16:42 ` Dan Magenheimer
2008-02-25 20:01 ` (progress on hpet accuracy) and " Dave Winchell
2008-02-26 8:26 ` Keir Fraser
2008-02-26 14:45 ` Dave Winchell
2008-02-26 14:56 ` Keir Fraser
2008-02-26 15:49 ` Dave Winchell
2008-03-05 15:06 ` Dave Winchell
2008-03-05 15:20 ` Keir Fraser
2008-03-05 17:25 ` Dave Winchell
2008-03-05 17:21 ` Keir Fraser
2008-03-05 17:42 ` Dave Winchell
2008-03-05 17:53 ` Dan Magenheimer
2008-03-06 23:36 ` Dan Magenheimer
2007-12-19 19:40 ` Dave Winchell
2007-11-08 14:57 ` Dave Winchell
2007-10-31 3:10 ` Shan, Haitao
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=472CE57A.9030804@virtualiron.com \
--to=dwinchell@virtualiron.com \
--cc=Keir.Fraser@cl.cam.ac.uk \
--cc=eddie.dong@intel.com \
--cc=haitao.shan@intel.com \
--cc=xen-devel@lists.xensource.com \
--cc=yunhong.jiang@intel.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 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.