|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Discussion on the delayed start of major frame with ARINC653 scheduler
We are observing a slight delay in the start of major frame with the current
implementation of ARINC653 scheduler, which breaks the determinism in the
periodic execution of domains.
This seems to result from the logic where the variable "next_major_frame" is
calculated based on the current timestamp "now" at a653sched_do_schedule().
static void cf_check
a653sched_do_schedule(
<snip>
else if ( now >= sched_priv->next_major_frame )
{
/* time to enter a new major frame
* the first time this function is called, this will be true */
/* start with the first domain in the schedule */
sched_priv->sched_index = 0;
sched_priv->next_major_frame = now + sched_priv->major_frame;
sched_priv->next_switch_time = now + sched_priv->schedule[0].runtime;
}
Therefore, the inherent delta between "now" and the previous "next_major_frame"
is added to the next start of major frame represented by the variable
"next_major_frame".
And I think the issue can be fixed with the following change to use
"next_major_frame" as the base of calculation.
diff --git a/xen/common/sched/arinc653.c b/xen/common/sched/arinc653.c index
930361fa5c..15affad3a3 100644
--- a/xen/common/sched/arinc653.c
+++ b/xen/common/sched/arinc653.c
@@ -534,8 +534,11 @@ a653sched_do_schedule(
* the first time this function is called, this will be true */
/* start with the first domain in the schedule */
sched_priv->sched_index = 0;
- sched_priv->next_major_frame = now + sched_priv->major_frame;
- sched_priv->next_switch_time = now + sched_priv->schedule[0].runtime;
+
+ do {
+ sched_priv->next_switch_time = sched_priv->next_major_frame +
sched_priv->schedule[0].runtime;
+ sched_priv->next_major_frame += sched_priv->major_frame;
+ } while ((now >= sched_priv->next_major_frame) || (now >=
sched_priv->next_switch_time));
}
Else
Can I get your advice on this subject?
Should you have any questions about the description, please let me know.
Here are the details to reproduce the issue on QEMUARM64.
[Xen version]
- 4.19 (43aeacff8695850ee26ee038159b1f885e69fdf)
[ARINC653 pool configuration]
- name="Pool-arinc"
- sched="arinc653"
- cpus=["3"]
[Dom1 configuration]
- name = "dom1"
- kernel = "/etc/xen/dom1/Image"
- ramdisk = "/etc/xen/dom1/guest.cpio.gz"
- extra = "root=/dev/loop0 rw nohlt"
- memory = 256
- vcpus = 1
- pool = "Pool-arinc"
[Major frame configuration]
$ a653_sched -p Pool-arinc dom1:10 :10 //20 msec (Dom1 10 msec : Idle 10 msec)
[Collecting xentrace dump]
$ xentrace -D -T 5 -e 0x2f000 /tmp/xentrace.bin
Parsed xentrace shows that its runstate change from 'runnable' to 'running',
which means the start of major frame, is slightly shifted every period.
Below are the first 21 traces since dom1 has started running. With the given
major frame of 20 msec, the 21st major frame should have started at 0.414553536
sec (0.01455336 + 20 msec * 20).
However, it started running at 0.418066096 sec which results in 3.5 msec of
shift, which will be eventually long enough to wrap around the whole major
frame (roughly after 120 periods).
0.014553536 ---x d?v? runstate_change d1v0 runnable->running
0.034629712 ---x d?v? runstate_change d1v0 runnable->running
0.054771216 ---x d?v? runstate_change d1v0 runnable->running
0.075080608 -|-x d?v? runstate_change d1v0 runnable->running
0.095236544 ---x d?v? runstate_change d1v0 runnable->running
0.115390144 ---x d?v? runstate_change d1v0 runnable->running
0.135499040 ---x d?v? runstate_change d1v0 runnable->running
0.155614784 ---x d?v? runstate_change d1v0 runnable->running
0.175833744 ---x d?v? runstate_change d1v0 runnable->running
0.195887488 ---x d?v? runstate_change d1v0 runnable->running
0.216028656 ---x d?v? runstate_change d1v0 runnable->running
0.236182032 ---x d?v? runstate_change d1v0 runnable->running
0.256302368 ---x d?v? runstate_change d1v0 runnable->running
0.276457472 ---x d?v? runstate_change d1v0 runnable->running
0.296649296 ---x d?v? runstate_change d1v0 runnable->running
0.316753856 ---x d?v? runstate_change d1v0 runnable->running
0.336909120 ---x d?v? runstate_change d1v0 runnable->running
0.357329936 ---x d?v? runstate_change d1v0 runnable->running
0.377691744 |||x d?v? runstate_change d1v0 runnable->running
0.397747008 |||x d?v? runstate_change d1v0 runnable->running
0.418066096 -||x d?v? runstate_change d1v0 runnable->running
However, with the suggested change applied, we can obtain the deterministic
behavior of arinc653 scheduler, where every major frame starts 20 msec apart.
0.022110320 ---x d?v? runstate_change d1v0 runnable->running
0.041985952 ---x d?v? runstate_change d1v0 runnable->running
0.062345824 ---x d?v? runstate_change d1v0 runnable->running
0.082145808 ---x d?v? runstate_change d1v0 runnable->running
0.101957360 ---x d?v? runstate_change d1v0 runnable->running
0.122223776 ---x d?v? runstate_change d1v0 runnable->running
0.142334352 ---x d?v? runstate_change d1v0 runnable->running
0.162126256 ---x d?v? runstate_change d1v0 runnable->running
0.182261984 ---x d?v? runstate_change d1v0 runnable->running
0.202001840 |--x d?v? runstate_change d1v0 runnable->running
0.222070800 ---x d?v? runstate_change d1v0 runnable->running
0.242137680 ---x d?v? runstate_change d1v0 runnable->running
0.262313040 ---x d?v? runstate_change d1v0 runnable->running
0.282178128 ---x d?v? runstate_change d1v0 runnable->running
0.302071328 ---x d?v? runstate_change d1v0 runnable->running
0.321969216 ---x d?v? runstate_change d1v0 runnable->running
0.341958464 ---x d?v? runstate_change d1v0 runnable->running
0.362147136 ---x d?v? runstate_change d1v0 runnable->running
0.382085296 ---x d?v? runstate_change d1v0 runnable->running
0.402076560 ---x d?v? runstate_change d1v0 runnable->running
0.421985456 ---x d?v? runstate_change d1v0 runnable->running
Thanks,
Anderson
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |