On 06/19/2016 07:34 PM, Gilles Chanteperdrix wrote:
> On Sun, Jun 19, 2016 at 07:28:43PM +0200, Philippe Gerum wrote:
>> On 06/18/2016 03:37 PM, Gilles Chanteperdrix wrote:
>>> On Sat, Jun 18, 2016 at 03:21:40PM +0200, Philippe Gerum wrote:
>>>> On 06/18/2016 03:08 PM, Gilles Chanteperdrix wrote:
>>>>> Hi Philippe,
>>>>>
>>>>> it seems since I-pipe commit
>>>>> b115c4094d734e19fa7a96be1bf3958b3d244b8b on the ipipe-3.18 branch:
>>>>>     Revert "ipipe: Register function tracer for direct and exclusive 
>>>>> invocation"
>>>>>     
>>>>>     This reverts commit e00888b4aae45d9b84698a62079dde14c9be5fd3.
>>>>>     
>>>>>     We now have an I-pipe-compatible dispatching function for ftrace.
>>>>>
>>>>> The ftrace dispatching function causes the following warning at
>>>>> boot on x86_32 with all warnings/debugs enabled:
>>>>> [    4.730812] I-pipe: head domain Xenomai registered.
>>>>> [    4.737967] I-pipe: Detected illicit call from head domain 'Xenomai'
>>>>> [    4.737967]         into a regular Linux service
>>>>>
>>>>> Because it calls preempt_disable(), which is not safe to be called
>>>>> form root domain, when runnning over 2.6.x on an architecture such
>>>>> as x86_32 which does not have IPIPE_HAVE_SAFE_THREAD_INFO.
>>>>>
>>>>> Should we make the ftrace dispatching function really I-pipe
>>>>> compatible by calling ipipe_preempt_disable() in that case instead?
>>>>> or should we make the patch revert conditional to !IPIPE_LEGACY or
>>>>> IPIPE_HAVE_SAFE_THREAD_INFO (but that would make only the I-pipe
>>>>> tracer work in that case).
>>>>>
>>>>
>>>> I would go for the change which has the lesser impact on the mainline
>>>> code; that would be option #1.
>>>
>>> Ok. Something else. Commit fdb5d54d04b8c3b6b6a6ad7ac2b6248cf0b415e0:
>>>     ipipe: Avoid rescheduling from __ftrace_ops_list_func in illegal 
>>> contexts
>>>     
>>>     The ftrace callback dispatcher may be called with hard irqs disabled or
>>>     even over the head domain. We cannot allow any rescheduling in that
>>>     case, but also do not have: only non-urgent events are expected to be
>>>     kicked-off from ftrace callbacks, and those will at latest be handled on
>>>     the next Linux timer tick.
>>>
>>> Added the following code to the ftrace dispatch function:
>>> +#ifdef CONFIG_IPIPE
>>> +       if (hard_irqs_disabled() || !__ipipe_root_p)
>>> +               /*
>>> +                * Nothing urgent to schedule here. At latest the timer tick
>>> +                * will pick up whatever the tracing functions kicked off.
>>> +                */
>>> +               preempt_enable_no_resched_notrace();
>>> +       else
>>> +#endif
>>> +               preempt_enable_notrace();
>>>
>>> Should not this go to the generic definition of preempt_enable() ? I
>>> mean if in the !LEGACY case, it is now legal to call
>>> preempt_enable() over non root contexts or with hard irqs off, so,
>>> does it really make sense to fix all the preempt_enable() spots one
>>> by one?
>>>
>>
>> That would add a useless branch to hundreds of code paths, which can
>> never run with hard irqs off and/or over the head domain. Besides, this
>> might prevent the context check in schedule_debug() to run, papering
>> over a bug. On the other end, specifically annotating the very few code
>> spots affected by the pipeline, which must not reschedule after
>> re-enabling preemption seems better maintenance-wise.
>>
>> I would just use a specific annotation folding all the lengthy code
>> block above into a single statement.
> 
> Yeah, well, the above code does not work anyway. See other mails
> about ftrace.
> 

I saw them, I'm discussing about reducing the impact of the pipeline
changes on the vanilla kernel in general, keeping the corner cases
annotated.

-- 
Philippe.

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

Reply via email to