On 2011-06-18 16:01, Gilles Chanteperdrix wrote:
> On 06/18/2011 03:47 PM, Jan Kiszka wrote:
>> On 2011-06-18 15:40, Gilles Chanteperdrix wrote:
>>> On 06/18/2011 03:16 PM, Jan Kiszka wrote:
>>>> On 2011-06-18 15:12, Gilles Chanteperdrix wrote:
>>>>> On 06/18/2011 03:07 PM, Jan Kiszka wrote:
>>>>>> On 2011-06-18 14:56, Gilles Chanteperdrix wrote:
>>>>>>>
>>>>>>> Maybe in the irq handlers, we should skip the XNHTICK replay, when
>>>>>>> current_domain is root_domain.
>>>>>>>
>>>>>>
>>>>>> That would be against the purpose of the XNTICK replay (it only targets
>>>>>> that particular case). And it would still leave us with broken ipipe due
>>>>>> to enabled IRQs on return from the Xenomai handlers.
>>>>>
>>>>> What I mean is that xnintr_clock_handler, we should skip the XNHTICK
>>>>> replay when the current domain upon return from xnpod_schedule is not
>>>>> root. From what I understand, this case only happens when xnpod_schedule
>>>>> migrated the thread, and in that case, the tick will have been forwarded
>>>>> during xnpod_schedule anyway.
>>>>
>>>> In the problematic case, ie. when the XNHTICK replay uses an invalid
>>>> sched, the current domain is root. It must be root because only then the
>>>> context could have been migrated to a different CPU by Linux. So this
>>>> does not help to avoid having to reload sched.
>>>
>>> I mean replace:
>>>     if (testbits(sched->lflags, XNHTICK) &&
>>>         xnthread_test_state(sched->curr, XNROOT))
>>>             xnintr_host_tick(sched);
>>>
>>> with
>>>     if (!xnarch_root_domain_p() &&
>>>         testbits(sched->lflags, XNHTICK) &&
>>>         xnthread_test_state(sched->curr, XNROOT))
>>>         xnintr_host_tick(sched);
>>>
>>
>> That breaks Linux timer ticks: If we are only running the root thread,
>> where should the pending tick be replayed? It is always deferred, even
>> over the root domain. And __xnpod_schedule, which could replay it as
>> well, is only entered if there is rescheduling required.
> 
> I may be wrong, but it is my understanding that Adeos switches domain 
> before executing interrupt handlers, so that the current Adeos domain 
> when running xnintr_clock_handler is always Xenomai, except at this 
> point if we have migrated. For instance, see the following trace :
> 
>  |   +func                -9296 __ipipe_grab_localtimer+0x10 (__irq_usr+0x3c)
>  |   +func                -9295 __ipipe_grab_irq+0x10 
> (__ipipe_grab_localtimer+0x20)
>  |   +func                -9295 __ipipe_handle_irq+0x10 
> (__ipipe_grab_irq+0x88)
>  |   +func                -9295 __ipipe_ack_localtimer+0x10 
> (__ipipe_handle_irq+0xc8)
>  |   +func                -9294 __ipipe_dispatch_wired+0x10 
> (__ipipe_handle_irq+0xd4)
>  |   +func                -9293 __ipipe_dispatch_wired_nocheck+0x14 
> (__ipipe_dispatch_wired+0x50)
>  |  # func                -9293 xnintr_clock_handler+0x14 
> (__ipipe_dispatch_wired_nocheck+0x88)
> 
> where we clearly see that the current domain is xenomai when executing
> xntintr_clock_handler.

Yeah, that's true.

> 
> Anyway, reading ipipe_current_domain is probably as expensive as
> reading xnpod_current_sched().
> 

And it would extend the common code path by another test.

Jan

Attachment: signature.asc
Description: OpenPGP digital signature

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to