Gilles Chanteperdrix wrote:
> Gilles Chanteperdrix wrote:
>> Jan Kiszka wrote:
>>> If we enter __ipipe_handle_exception over a non-root domain and leave it
>>> due to migration in the event handler over root, we must not restore the
>>> root domain state so far saved on entry. This caused subtle pipeline
>>> state corruptions. Actually, we only need to save the state if we enter
>>> over the root domain and have to align its state to the hardware
>>> interrupt mask.
>>>
>>> Moreover, the x86-32 regs.eflags fix-up must happen based on the current
>>> root domain state to avoid more spurious corruptions.
>>>
>>> Signed-off-by: Jan Kiszka <jan.kis...@siemens.com>
>>> ---
>>>
>>> This patch is so far running fine on the x86-64 boxes of our colleagues
>>> @Healthcare. It currently makes most sense to me, also for (untested)
>>> x86-32, but maybe I'm still missing a problematic scenario.
>>>
>>>  arch/x86/kernel/ipipe.c |   64 
>>> ++++++++++++++++++++++++++--------------------
>>>  1 files changed, 36 insertions(+), 28 deletions(-)
>>>
>>> diff --git a/arch/x86/kernel/ipipe.c b/arch/x86/kernel/ipipe.c
>>> index 4442d96..8253993 100644
>>> --- a/arch/x86/kernel/ipipe.c
>>> +++ b/arch/x86/kernel/ipipe.c
>>> @@ -702,19 +702,17 @@ static int __ipipe_xlate_signo[] = {
>>>  
>>>  int __ipipe_handle_exception(struct pt_regs *regs, long error_code, int 
>>> vector)
>>>  {
>>> -   unsigned long flags;
>>> -
>>> -   /* Pick up the root domain state of the interrupted context. */
>>> -   local_save_flags(flags);
>>> +   bool restore_flags = false;
>>> +   unsigned long flags = 0;
>>>  
>>> -   if (ipipe_root_domain_p) {
>>> +   if (ipipe_root_domain_p && irqs_disabled_hw()) {
>> I really do not understand this hunk. It differs a lot from the current
>> situation. In the current situation __fixup_if really does something,
>> even if irqs were not masked on entry.
>>
> 
> Ok, but on x86_64, you have:
> +     bool restore_flags = false;
> +     if (ipipe_root_domain_p && irqs_disabled_hw()) {
> +             restore_flags = true;
>       }
> +     if (restore_flags)
> +             local_irq_restore_nosync(flags);
> 
> Which I do not understand. local_irq_restore_nosync still has an effect
> even if irqs were not disabled on entry.
> 

Right, but is there any scenario remaining where we need this effect?

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