|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [XEN PATCH v2] xen/arinc653: fix delay in the start of major frame
On 7/17/25 22:16, Nathan Studer wrote:
> On 7/17/25 21:39, Choi, Anderson wrote:
>>> On 7/17/25 9:21, Hildebrand, Stewart wrote:
>> else + { + sched_priv->next_switch_time =
>>>>> sched_priv->next_major_frame + +
>>>>> sched_priv->schedule[0].runtime; +
>>>>> sched_priv->next_major_frame += sched_priv->major_frame; + } +
>>>>> }
>>>>
>>>> There's no need for the above loop, this can be fixed by subtracting
>>>> the remainder (modulus major_frame). E.g.:
>>>>
>>>> if ( now >= sched_priv->next_major_frame )
>>>> {
>>>> s_time_t major_frame = sched_priv->num_schedule_entries < 1
>>>> ? DEFAULT_TIMESLICE
>>>> : sched_priv->major_frame;
>>>> s_time_t remainder = (now - sched_priv->next_major_frame) %
>>>> major_frame;
>>>>
>>>> sched_priv->sched_index = 0;
>>>> sched_priv->next_major_frame = now - remainder + major_frame;
>>>> sched_priv->next_switch_time = now - remainder +
>>>> (sched_priv->num_schedule_entries <
>>>> 1
>>>> ? DEFAULT_TIMESLICE
>>>> : sched_priv->schedule[0].runtime);
>>>> }
>>>
>>
>> Stewart,
>>
>> I appreciate your suggestion to eliminate the while loop.
>> What about initializing major_frame and schedule[0].runtime to
>> DEFAULT_TIMESLICE at a653sched_init() and use them until the real parameters
>> are set as below to eliminate the if branch?
>
> It would make the scheduling code cleaner, but since you asked Stew I'll
> defer to him.
It feels odd to index schedule[0] when num_schedule_entries may be
zero... But since it's a fixed size array and element 0 is guaranteed to
exist I don't have a strong preference.
>
>>
>> diff --git a/xen/common/sched/arinc653.c b/xen/common/sched/arinc653.c
>> index 930361fa5c..73ce5cdfaf 100644
>> --- a/xen/common/sched/arinc653.c
>> +++ b/xen/common/sched/arinc653.c
>> @@ -361,6 +361,8 @@ a653sched_init(struct scheduler *ops)
>> ops->sched_data = prv;
>>
>> prv->next_major_frame = 0;
>> + prv->major_frame = DEFAULT_TIMESLICE;
>> + prv->schedule[0].runtime = DEFAULT_TIMESLICE;
>> spin_lock_init(&prv->lock);
>> INIT_LIST_HEAD(&prv->unit_list);
>>
>> static void cf_check
>> a653sched_do_schedule(
>> <snip>
>> /* Switch to next major frame directly eliminating the use of loop */
>> if ( now >= sched_priv->next_major_frame )
>> {
>> s_time_t major_frame = sched_priv->major_frame;
>> s_time_t remainder = (now - sched_priv->next_major_frame) %
>> major_frame;
>>
>> sched_priv->sched_index = 0;
>> sched_priv->next_major_frame = now - remainder + major_frame;
>> sched_priv->next_switch_time = now - remainder + sched_priv-
>>> schedule[0].runtime;
>> }
>>
>>> The direct method suggested by Stew is preferable in the unusual case
>>> where many major frames are missed. (We have only seen that happen
>>> when using a debugger.)
>>>
>>> To help uncover any issues like the one this patch addresses in the
>>> future we may also want to follow up this commit with a change to make
>>> scheduler misses more obvious. Something like the following:
>>>
>>> commit e95cbc9078127c412bd1605d93cb97837751b5b4 (HEAD -> master)
>>> Author: Nathan Studer <nathan.studer@xxxxxxxxxxxxxxx>
>>> Date: Thu Jul 17 12:43:39 2025 -0400
>>>
>>> Do not silently skip frame overruns diff --git
>>> a/xen/common/sched/arinc653.c b/xen/common/sched/arinc653.c index
>>> 2d0d3bcbb3..a2c1c66c27 100644
>>> --- a/xen/common/sched/arinc653.c
>>> +++ b/xen/common/sched/arinc653.c
>>> @@ -523,9 +523,17 @@ a653sched_do_schedule(
>>> a653sched_priv_t *sched_priv = SCHED_PRIV(ops);
>>> const unsigned int cpu = sched_get_resource_cpu(smp_processor_id());
>>> unsigned long flags;
>>> + unsigned int oindex;
>>> + unsigned int missed;
>>>
>>> spin_lock_irqsave(&sched_priv->lock, flags);
>>> + if ( now > (sched_priv->next_major_frame + sched_priv->major_frame))
>>> + {
>>> + missed = (now - sched_priv->next_major_frame) / sched_priv-
>>>> major_frame;
>>> + printk(XENLOG_ERR, "Missed %d major frame(s)!\n", missed);
>>> + }
>>> +
>>> /* Switch to next major frame while handling potentially missed
>>> frames */ @@ -544,6 +552,7 @@ a653sched_do_schedule(
>>> }
>>> }
>>> + oindex = sched_priv->sched_index;
>>> /* Switch minor frame or find correct minor frame after a miss */
>>> while ( (now >= sched_priv->next_switch_time) &&
>>> (sched_priv->sched_index <
>>> sched_priv->num_schedule_entries) ) @@ -553,6 +562,12 @@
>>> a653sched_do_schedule(
>>> sched_priv->schedule[sched_priv->sched_index].runtime;
>>> }
>>> + if ( (oindex - sched_priv->sched_index) > 1)
>>> + {
>>> + missed = (oindex - sched_priv->sched_index - 1);
>>> + printk(XENLOG_WARNING, "Missed %d minor frame(s)!\n", missed);
>>> + }
>>> +
>>> /*
>>
>> Nathan,
>>
>> Do we need a comma (,) between XENLOG_WARNING and the quoted string
>> when calling printk()?
>
> No.
>
>> And wouldn't the log be printed every time a new minor frame starts, for
>> example
>> oindex = 0 and sched_priv->sched_index = 1?
>> I think you meant to use the condition "if (sched_priv->sched_index -
>> oindex) > 1"
>> to check minor frame misses?
>
> Right, the order should be the other way around in both the condition and the
> print.
>
> Regardless, we can just worry about your patch for now and improve the miss
> detection reporting later.
+1
>
> Nate
>
>>
>> Thanks,
>> Anderson
>>
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |