On 09/18/2012 11:30 AM, Jan Kiszka wrote:
> On 2012-09-18 11:06, Gilles Chanteperdrix wrote:
>> On 09/18/2012 10:48 AM, Jan Kiszka wrote:
>>> On 2012-09-17 23:50, Gilles Chanteperdrix wrote:
>>>> On 09/17/2012 08:54 PM, Jan Kiszka wrote:
>>>>
>>>>> On 2012-09-17 20:37, Gilles Chanteperdrix wrote:
>>>>>> On 09/17/2012 08:29 PM, Jan Kiszka wrote:
>>>>>>
>>>>>>> On 2012-09-17 20:18, Gilles Chanteperdrix wrote:
>>>>>>>> On 09/17/2012 08:15 PM, Jan Kiszka wrote:
>>>>>>>>
>>>>>>>>> On 2012-09-17 20:12, Jan Kiszka wrote:
>>>>>>>>>> On 2012-09-17 20:08, Gilles Chanteperdrix wrote:
>>>>>>>>>>> On 09/17/2012 08:05 PM, Jan Kiszka wrote:
>>>>>>>>>>>
>>>>>>>>>>>> On 2012-09-17 19:46, Gilles Chanteperdrix wrote:
>>>>>>>>>>>>> ipipe_end is a nop when called from primary domain, yes, but this 
>>>>>>>>>>>>> is not
>>>>>>>>>>>>> very different from edge irqs. Also, fasteoi become a bit like 
>>>>>>>>>>>>> MSI: in
>>>>>>>>>>>>> the same way as we can not mask MSI from primary domain, we 
>>>>>>>>>>>>> should not
>>>>>>>>>>>>> mask IO-APIC fasteoi irqs, because the cost is too prohibitive. 
>>>>>>>>>>>>> If we
>>>>>>>>>>>>> can live with MSI without masking them in primary mode, I guess 
>>>>>>>>>>>>> we can
>>>>>>>>>>>>> do the same with fasteoi irqs.
>>>>>>>>>>>>
>>>>>>>>>>>> MSIs are edge triggered, fasteois are still level-based. They 
>>>>>>>>>>>> require
>>>>>>>>>>>> masking at the point you defer them - what we do and what Linux 
>>>>>>>>>>>> may even
>>>>>>>>>>>> extend beyond that. If you mask them by raising the task priority, 
>>>>>>>>>>>> you
>>>>>>>>>>>> have to keep it raised until Linux finally handled the IRQ.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Yes.
>>>>>>>>>>>
>>>>>>>>>>>> Or you
>>>>>>>>>>>> decide to mask it at IO-APIC level again.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> We do not want that.
>>>>>>>>>>>
>>>>>>>>>>>> If you keep the TPR raised,
>>>>>>>>>>>> you will block more than what Linux wants to block.
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> The point is that if the TPR keeps raised, it means that primary 
>>>>>>>>>>> domain
>>>>>>>>>>> has preempted Linux, so, we want it to keep that way. Otherwise the 
>>>>>>>>>>> TPR
>>>>>>>>>>> gets lowered when Linux has handled the interrupt.
>>>>>>>>>>>
>>>>>>>>>>> A week-end of testing made me sure of one thing: it works. I assure 
>>>>>>>>>>> you.
>>>>>>>>>>
>>>>>>>>>> Probably, in the absence of IRQF_ONESHOT Linux interrupts. No longer 
>>>>>>>>>> if
>>>>>>>>>> you face threaded IRQs - I assure you.
>>>>>>>>>
>>>>>>>>> Well, it may work (if mask/unmask callbacks work as native) but the
>>>>>>>>> benefit is gone: masking at IO-APIC level will be done again. Given 
>>>>>>>>> that
>>>>>>>>> threaded IRQs become increasingly popular, it will also be hard to 
>>>>>>>>> avoid
>>>>>>>>> them in common setups.
>>>>>>>>
>>>>>>>>
>>>>>>>> The thing is, if we no longer use the IO-APIC spinlock from primary
>>>>>>>> domain, we may not have to turn it into an ipipe_spinlock, and may be
>>>>>>>> able to preempt the IO-APIC masking.
>>>>>>>
>>>>>>> That might be true - but is the latency related to the lock or the
>>>>>>> hardware access? In the latter case, you will still stall the CPU on it
>>>>>>> and have to isolate the load on a non-RT CPU again.
>>>>>>>
>>>>>>> BTW, the task priority for the RT domain is a quite important parameter.
>>>>>>> If you put it too low, Linux can run out of vectors. If you put it too
>>>>>>> high, the same may happen to Xenomai - on bigger boxes.
>>>>>>
>>>>>>
>>>>>> Yes, and there are only 16 levels. But Xenomai does not need to many 
>>>>>> levels.
>>>>>
>>>>> How is telling you this? It's part of the system setup. And that may
>>>>> lean toward RT or toward non-RT. This level should be adjusted according
>>>>> to the current allocation of Linux and the RT domain for a particular
>>>>> CPU, not hard-coded or compile-time defined.
>>>>
>>>>
>>>> In theory, I agree, in practice, lets be crasy, assume someone would
>>>> want an RT serial driver with 4 irqs, an RT USB driver with 2 irqs, an
>>>> RT CAN driver, and say, 4 RTnet boards. That is still less than the 16
>>>> vectors that a single level provides, so, we can probably get along with
>>>> 2 levels. Or we can use a kernel parameter.
>>>
>>> Linux - and so should we do - allocates separate levels first as that
>>> provides better performance for external interrupts (need to look up the
>>> precise reason, should be documented in the x86 code). Only if levels
>>> are used up, interrupts will share them.
>>
>> I have seen this code, and I wondered if it was not, in fact, only
>> useful, where the irq flow handler were reenabling irqs (that is, before
>> the removal of IRQF_DISABLED), but am really not sure.
> 
> This pattern is still present with IRQF_ONESHOT, aka threaded IRQs.

No, from what I understand, it is different: with threaded IRQS, the
flow handler masks irqs then sends the EOI. So, the APIC does not nest.

If you re-enable the hardware interrupts before sending the EOI, you
cause the LAPIC to nest.

But I am not sure.


-- 
                                            Gilles.

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

Reply via email to