On 07/08/2015 03:04 PM, Jan Kiszka wrote:
> On 2015-07-08 15:00, Philippe Gerum wrote:
>> On 07/08/2015 02:52 PM, Jan Kiszka wrote:
>>> On 2015-07-08 14:43, Philippe Gerum wrote:
>>>> On 07/08/2015 02:33 PM, Jan Kiszka wrote:
>>>>> On 2015-07-08 14:32, Gilles Chanteperdrix wrote:
>>>>>> On Wed, Jul 08, 2015 at 02:24:41PM +0200, Jan Kiszka wrote:
>>>>>>> On 2015-07-08 13:56, Philippe Gerum wrote:
>>>>>>>> On 07/08/2015 12:31 PM, Jan Kiszka wrote:
>>>>>>>>> On 2015-07-07 14:53, Philippe Gerum wrote:
>>>>>>>>>> On 07/07/2015 11:27 AM, Philippe Gerum wrote:
>>>>>>>>>>> I tested the patch on ARM. Enabling IPIPE_DEBUG_INTERNAL there 
>>>>>>>>>>> reveals a
>>>>>>>>>>> bug with the mayday handler now turning hw IRQs on, as a result of
>>>>>>>>>>> relaxing over the low level IRQ trampoline, which makes some I-pipe 
>>>>>>>>>>> call
>>>>>>>>>>> in the irq_handler boilerplate code unhappy. The very same issue is
>>>>>>>>>>> looming on x86, with an unprotected call to __ipipe_root_p from
>>>>>>>>>>> __ipipe_handle_irq(). Disabling IRQs before leaving the mayday 
>>>>>>>>>>> handler
>>>>>>>>>>> is required at the very least.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Looking further, ARM is affected because it does not invoke
>>>>>>>>>> __ipipe_call_mayday() for triggering the mayday trap, but still uses 
>>>>>>>>>> the
>>>>>>>>>> open-coded method. This routine preserves the current hw state across
>>>>>>>>>> the trap, which should make x86 safe in the end.
>>>>>>>>>
>>>>>>>>> Which kernel version are you testing? It's not reproducing on 3.14 for
>>>>>>>>> Cortex-A7/15 targets at least. And I find __ipipe_call_mayday in both
>>>>>>>>> 3.14 and 3.18 (fastcall_exit_check).
>>>>>>>>>
>>>>>>>>
>>>>>>>> Looking at the code, any kernel version since 3.10 will have the same
>>>>>>>> issue, older ones likely too, tested on 3.18.12. This does not depend 
>>>>>>>> on
>>>>>>>> the ARM target.
>>>>>>>>
>>>>>>>> irq_handler from entry-armv.S:
>>>>>>>>        => __ipipe_grab_irq (or indirecty via ipipe_handle_multi_irq 
>>>>>>>> with
>>>>>>>> MULTI_IRQ enabled)
>>>>>>>>                => __ipipe_exit_irq (open coded 
>>>>>>>> __ipipe_notify_trap(MAYDAY),
>>>>>>>> xnthread_relax() re-enables hw IRQs)
>>>>>>>>        => __ipipe_check_root_interruptible (from irq_handler)
>>>>>>>>                BAD: __ipipe_root_p tested with CPU migration enabled
>>>>>>>>
>>>>>>>
>>>>>>> Maybe [1] makes the difference here? I think I had to fix this for a
>>>>>>> different reason.
>>>>>>
>>>>>> Except this does not work over legacy kernel thread stacks..
>>>>>
>>>>> Xenomai 2 is out of scope for these changes on mayday and for gdb
>>>>> improvements.
>>>>>
>>>>
>>>> Testing CONFIG_IPIPE_LEGACY for such change would be required then.
>>>
>>> Do you mean if I can access preempt_count() in
>>> __ipipe_check_percpu_access? We are over the root domain at that point,
>>> thus legacy RT kernel threads are implicitly excluded, no?
>>
>> Yes. I mean that if you intend to upstream changes that only care for
>> Xenomai 3, you should exclude them from legacy mode builds using
>> CONFIG_IPIPE_LEGACY, at least until we drop all support for Xenomai 2 in
>> the I-pipe for newer kernel releases.
> 
> Sure, if there are dependencies, I'll do this. Right now I see none,
> thus I'd like to avoid cluttering up the code with #ifdefs.
>

IS_ENABLED() would likely help nicely.

> What is in current for-upstream/3.14 and 3.18 is intended for upstream
> as-is unless someone sees problems I missed.
> 
> Jan
> 


-- 
Philippe.

_______________________________________________
Xenomai mailing list
Xenomai@xenomai.org
http://xenomai.org/mailman/listinfo/xenomai

Reply via email to