[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] RE: Re: Discussion on the delayed start of major frame with ARINC653 scheduler
Stewart, > On 6/25/25 23:50, Choi, Anderson wrote: >> 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? > > The drift you're observing is a known issue with the scheduler. The next major > frame shouldn't be calculated with the "now" variable. It should rather be > calculated by adding the major frame period. Also, as your code suggests, it > should take into account edge cases where "now" may be in the far future. > There is another instance of next_major_frame being calculated using "now" > just above. Are you willing to submit a patch? I appreciate your feedback on this subject. Here's the link to the patch I have submitted. https://patchwork.kernel.org/project/xen-devel/patch/26f4fb409f03cb221a98692c4f291756d9cc26ae.1751948342.git.anderson.choi@xxxxxxxxxx/ Could you review the patch? Thanks, Anderson
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |