All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ?
@ 2008-04-24  4:33 Tomas Kalibera
  2008-04-24  8:45 ` Philippe Gerum
  0 siblings, 1 reply; 6+ messages in thread
From: Tomas Kalibera @ 2008-04-24  4:33 UTC (permalink / raw)
  To: xenomai-core


Hi,

I think that when I handle interrupts from user space, I cannot 
correctly use I_NOAUTOENA. The thing is that this flag in fact means "do 
not call automatically xnarch_end_irq". The xnarch_end_irq call usually 
maps to unmasking the interrupt, but not always - depending on interrupt 
type (sometimes in eoi, sometimes is nop).

I was thinking that it would be nice if I could call something like 
"xnarch_end_irq" (i.e. rt_intr_end) from user space, so that I could 
correctly use I_NOAUTOENA to control the flow of interrupts.

Cheers,
Tomas




^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ?
  2008-04-24  4:33 [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ? Tomas Kalibera
@ 2008-04-24  8:45 ` Philippe Gerum
  2008-04-24 16:08   ` Tomas Kalibera
  0 siblings, 1 reply; 6+ messages in thread
From: Philippe Gerum @ 2008-04-24  8:45 UTC (permalink / raw)
  To: Tomas Kalibera; +Cc: xenomai-core

[-- Attachment #1: Type: text/plain, Size: 1442 bytes --]

Tomas Kalibera wrote:
> Hi,
> 
> I think that when I handle interrupts from user space, I cannot 
> correctly use I_NOAUTOENA. The thing is that this flag in fact means "do 
> not call automatically xnarch_end_irq". The xnarch_end_irq call usually 
> maps to unmasking the interrupt, but not always - depending on interrupt 
> type (sometimes in eoi, sometimes is nop).
> 
> I was thinking that it would be nice if I could call something like 
> "xnarch_end_irq" (i.e. rt_intr_end) from user space, so that I could 
> correctly use I_NOAUTOENA to control the flow of interrupts.
>

What would this buy you? xnarch_irq_end() would still handle the unmasking logic
depending on the interrupt type, because it knows how the interrupt was
acknowledged in the first place -- in contrast, the application does not and
should not.

xnarch_end_irq() basically calls the ->unmask() method of the interrupt chip
descriptor, which is the same as calling rt_intr_enable(). Before you do that,
you may want to try the attached patch, which makes sure that
rt_intr_enable/disable are eagerly routed to unmask/mask on x86 for post-2.6.18
kernels. That patch is expected to solve the "rt_intr_disable() not masking
IO-APIC interrupt" issue we discussed earlier.

> Cheers,
> Tomas
> 
> 
> 
> _______________________________________________
> Xenomai-core mailing list
> Xenomai-core@domain.hid
> https://mail.gna.org/listinfo/xenomai-core
> 


-- 
Philippe.

[-- Attachment #2: unconditionally-apply-irq-enable-disable-requests-to-pic.patch --]
[-- Type: text/x-diff, Size: 1666 bytes --]

Index: include/asm-x86/wrappers_32.h
===================================================================
--- include/asm-x86/wrappers_32.h	(revision 3708)
+++ include/asm-x86/wrappers_32.h	(working copy)
@@ -163,8 +163,8 @@
 
 #define rthal_irq_chip_end(irq)	rthal_irq_chip_enable(irq)
 #else /* >= 2.6.19 */
-#define rthal_irq_chip_enable(irq)   ({ rthal_irq_descp(irq)->chip->enable(irq); 0; })
-#define rthal_irq_chip_disable(irq)  ({ rthal_irq_descp(irq)->chip->disable(irq); 0; })
+#define rthal_irq_chip_enable(irq)   ({ rthal_irq_descp(irq)->chip->unmask(irq); 0; })
+#define rthal_irq_chip_disable(irq)  ({ rthal_irq_descp(irq)->chip->mask(irq); 0; })
 #define rthal_irq_chip_end(irq)      ({ rthal_irq_descp(irq)->ipipe_end(irq, rthal_irq_descp(irq)); 0; })
 typedef irq_handler_t rthal_irq_host_handler_t;
 
Index: include/asm-x86/wrappers_64.h
===================================================================
--- include/asm-x86/wrappers_64.h	(revision 3708)
+++ include/asm-x86/wrappers_64.h	(working copy)
@@ -31,8 +31,8 @@
 #define rthal_irq_descp(irq)		(irq_desc + irq)
 #define rthal_irq_desc_status(irq)	(rthal_irq_descp(irq)->status)
 
-#define rthal_irq_chip_enable(irq)   ({ rthal_irq_descp(irq)->chip->enable(irq); 0; })
-#define rthal_irq_chip_disable(irq)  ({ rthal_irq_descp(irq)->chip->disable(irq); 0; })
+#define rthal_irq_chip_enable(irq)   ({ rthal_irq_descp(irq)->chip->unmask(irq); 0; })
+#define rthal_irq_chip_disable(irq)  ({ rthal_irq_descp(irq)->chip->mask(irq); 0; })
 #define rthal_irq_chip_end(irq)      ({ rthal_irq_descp(irq)->ipipe_end(irq, rthal_irq_descp(irq)); 0; })
 
 typedef irq_handler_t rthal_irq_host_handler_t;

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ?
  2008-04-24  8:45 ` Philippe Gerum
@ 2008-04-24 16:08   ` Tomas Kalibera
  2008-04-24 16:39     ` Philippe Gerum
  0 siblings, 1 reply; 6+ messages in thread
From: Tomas Kalibera @ 2008-04-24 16:08 UTC (permalink / raw)
  To: rpm; +Cc: xenomai-core


Hi Philippe,

thank you for the patch !

> xnarch_end_irq() basically calls the ->unmask() method of the interrupt chip
> descriptor, which is the same as calling rt_intr_enable(). Before you do that,
>   
If I read the sources correctly, for "edge" and "simple" interrupt, 
xnarch_end_irq() calls nothing, for "percpu" it calls ->eoi() . For 
"level", "fasteoi", and "demux", it calls ->unmask().

So calling rt_intr_enable from user space would not always do the same 
as xnarch_end_irq from the kernel, wouldn't it ?

Tomas



Philippe Gerum wrote:
> Tomas Kalibera wrote:
>   
>> Hi,
>>
>> I think that when I handle interrupts from user space, I cannot 
>> correctly use I_NOAUTOENA. The thing is that this flag in fact means "do 
>> not call automatically xnarch_end_irq". The xnarch_end_irq call usually 
>> maps to unmasking the interrupt, but not always - depending on interrupt 
>> type (sometimes in eoi, sometimes is nop).
>>
>> I was thinking that it would be nice if I could call something like 
>> "xnarch_end_irq" (i.e. rt_intr_end) from user space, so that I could 
>> correctly use I_NOAUTOENA to control the flow of interrupts.
>>
>>     
>
> What would this buy you? xnarch_irq_end() would still handle the unmasking logic
> depending on the interrupt type, because it knows how the interrupt was
> acknowledged in the first place -- in contrast, the application does not and
> should not.
>
> xnarch_end_irq() basically calls the ->unmask() method of the interrupt chip
> descriptor, which is the same as calling rt_intr_enable(). Before you do that,
> you may want to try the attached patch, which makes sure that
> rt_intr_enable/disable are eagerly routed to unmask/mask on x86 for post-2.6.18
> kernels. That patch is expected to solve the "rt_intr_disable() not masking
> IO-APIC interrupt" issue we discussed earlier.
>
>   
>> Cheers,
>> Tomas
>>
>>
>>
>> _______________________________________________
>> Xenomai-core mailing list
>> Xenomai-core@domain.hid
>> https://mail.gna.org/listinfo/xenomai-core
>>
>>     
>
>
>   



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ?
  2008-04-24 16:08   ` Tomas Kalibera
@ 2008-04-24 16:39     ` Philippe Gerum
  2008-04-24 19:16       ` Tomas Kalibera
  0 siblings, 1 reply; 6+ messages in thread
From: Philippe Gerum @ 2008-04-24 16:39 UTC (permalink / raw)
  To: Tomas Kalibera; +Cc: xenomai-core

Tomas Kalibera wrote:
> 
> Hi Philippe,
> 
> thank you for the patch !
> 
>> xnarch_end_irq() basically calls the ->unmask() method of the
>> interrupt chip
>> descriptor, which is the same as calling rt_intr_enable(). Before you
>> do that,
>>   
> If I read the sources correctly, for "edge" and "simple" interrupt,
> xnarch_end_irq() calls nothing, for "percpu" it calls ->eoi() . For
> "level", "fasteoi", and "demux", it calls ->unmask().
> 
> So calling rt_intr_enable from user space would not always do the same
> as xnarch_end_irq from the kernel, wouldn't it ?
>

No it would not, and this is what we want. The patch makes sure that calling
rt_intr_enable/disable() will actually unmask/mask the interrupt at PIC level,
regardless of how the normal ack/handle/end process works for that interrupt.

> Tomas
> 
> 
> 
> Philippe Gerum wrote:
>> Tomas Kalibera wrote:
>>  
>>> Hi,
>>>
>>> I think that when I handle interrupts from user space, I cannot
>>> correctly use I_NOAUTOENA. The thing is that this flag in fact means
>>> "do not call automatically xnarch_end_irq". The xnarch_end_irq call
>>> usually maps to unmasking the interrupt, but not always - depending
>>> on interrupt type (sometimes in eoi, sometimes is nop).
>>>
>>> I was thinking that it would be nice if I could call something like
>>> "xnarch_end_irq" (i.e. rt_intr_end) from user space, so that I could
>>> correctly use I_NOAUTOENA to control the flow of interrupts.
>>>
>>>     
>>
>> What would this buy you? xnarch_irq_end() would still handle the
>> unmasking logic
>> depending on the interrupt type, because it knows how the interrupt was
>> acknowledged in the first place -- in contrast, the application does
>> not and
>> should not.
>>
>> xnarch_end_irq() basically calls the ->unmask() method of the
>> interrupt chip
>> descriptor, which is the same as calling rt_intr_enable(). Before you
>> do that,
>> you may want to try the attached patch, which makes sure that
>> rt_intr_enable/disable are eagerly routed to unmask/mask on x86 for
>> post-2.6.18
>> kernels. That patch is expected to solve the "rt_intr_disable() not
>> masking
>> IO-APIC interrupt" issue we discussed earlier.
>>
>>  
>>> Cheers,
>>> Tomas
>>>
>>>
>>>
>>> _______________________________________________
>>> Xenomai-core mailing list
>>> Xenomai-core@domain.hid
>>> https://mail.gna.org/listinfo/xenomai-core
>>>
>>>     
>>
>>
>>   
> 
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ?
  2008-04-24 16:39     ` Philippe Gerum
@ 2008-04-24 19:16       ` Tomas Kalibera
  2008-04-25  7:12         ` Philippe Gerum
  0 siblings, 1 reply; 6+ messages in thread
From: Tomas Kalibera @ 2008-04-24 19:16 UTC (permalink / raw)
  To: rpm; +Cc: xenomai-core


>> So calling rt_intr_enable from user space would not always do the same
>> as xnarch_end_irq from the kernel, wouldn't it ?
>>     
>
> No it would not, and this is what we want. The patch makes sure that calling
> rt_intr_enable/disable() will actually unmask/mask the interrupt at PIC level,
> regardless of how the normal ack/handle/end process works for that interrupt.
>
>   
OK, and this is the problem why I started calling for rt_intr_end. In 
order to use I_NOAUTOENA from user space correctly, I need to be able to 
end the interrupt correctly from user space. And there is no function to 
do this.

Tomas


>> Tomas
>>
>>
>>
>> Philippe Gerum wrote:
>>     
>>> Tomas Kalibera wrote:
>>>  
>>>       
>>>> Hi,
>>>>
>>>> I think that when I handle interrupts from user space, I cannot
>>>> correctly use I_NOAUTOENA. The thing is that this flag in fact means
>>>> "do not call automatically xnarch_end_irq". The xnarch_end_irq call
>>>> usually maps to unmasking the interrupt, but not always - depending
>>>> on interrupt type (sometimes in eoi, sometimes is nop).
>>>>
>>>> I was thinking that it would be nice if I could call something like
>>>> "xnarch_end_irq" (i.e. rt_intr_end) from user space, so that I could
>>>> correctly use I_NOAUTOENA to control the flow of interrupts.
>>>>
>>>>     
>>>>         
>>> What would this buy you? xnarch_irq_end() would still handle the
>>> unmasking logic
>>> depending on the interrupt type, because it knows how the interrupt was
>>> acknowledged in the first place -- in contrast, the application does
>>> not and
>>> should not.
>>>
>>> xnarch_end_irq() basically calls the ->unmask() method of the
>>> interrupt chip
>>> descriptor, which is the same as calling rt_intr_enable(). Before you
>>> do that,
>>> you may want to try the attached patch, which makes sure that
>>> rt_intr_enable/disable are eagerly routed to unmask/mask on x86 for
>>> post-2.6.18
>>> kernels. That patch is expected to solve the "rt_intr_disable() not
>>> masking
>>> IO-APIC interrupt" issue we discussed earlier.
>>>
>>>  
>>>       
>>>> Cheers,
>>>> Tomas
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> Xenomai-core mailing list
>>>> Xenomai-core@domain.hid
>>>> https://mail.gna.org/listinfo/xenomai-core
>>>>
>>>>     
>>>>         
>>>   
>>>       
>>     
>
>
>   



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ?
  2008-04-24 19:16       ` Tomas Kalibera
@ 2008-04-25  7:12         ` Philippe Gerum
  0 siblings, 0 replies; 6+ messages in thread
From: Philippe Gerum @ 2008-04-25  7:12 UTC (permalink / raw)
  To: Tomas Kalibera; +Cc: xenomai-core

Tomas Kalibera wrote:
> 
>>> So calling rt_intr_enable from user space would not always do the same
>>> as xnarch_end_irq from the kernel, wouldn't it ?
>>>     
>>
>> No it would not, and this is what we want. The patch makes sure that
>> calling
>> rt_intr_enable/disable() will actually unmask/mask the interrupt at
>> PIC level,
>> regardless of how the normal ack/handle/end process works for that
>> interrupt.
>>
>>   
> OK, and this is the problem why I started calling for rt_intr_end. In
> order to use I_NOAUTOENA from user space correctly, I need to be able to
> end the interrupt correctly from user space. And there is no function to
> do this.
>

Call rt_intr_enable(), with the patch applied. This will work.

> Tomas
> 
> 
>>> Tomas
>>>
>>>
>>>
>>> Philippe Gerum wrote:
>>>    
>>>> Tomas Kalibera wrote:
>>>>  
>>>>      
>>>>> Hi,
>>>>>
>>>>> I think that when I handle interrupts from user space, I cannot
>>>>> correctly use I_NOAUTOENA. The thing is that this flag in fact means
>>>>> "do not call automatically xnarch_end_irq". The xnarch_end_irq call
>>>>> usually maps to unmasking the interrupt, but not always - depending
>>>>> on interrupt type (sometimes in eoi, sometimes is nop).
>>>>>
>>>>> I was thinking that it would be nice if I could call something like
>>>>> "xnarch_end_irq" (i.e. rt_intr_end) from user space, so that I could
>>>>> correctly use I_NOAUTOENA to control the flow of interrupts.
>>>>>
>>>>>             
>>>> What would this buy you? xnarch_irq_end() would still handle the
>>>> unmasking logic
>>>> depending on the interrupt type, because it knows how the interrupt was
>>>> acknowledged in the first place -- in contrast, the application does
>>>> not and
>>>> should not.
>>>>
>>>> xnarch_end_irq() basically calls the ->unmask() method of the
>>>> interrupt chip
>>>> descriptor, which is the same as calling rt_intr_enable(). Before you
>>>> do that,
>>>> you may want to try the attached patch, which makes sure that
>>>> rt_intr_enable/disable are eagerly routed to unmask/mask on x86 for
>>>> post-2.6.18
>>>> kernels. That patch is expected to solve the "rt_intr_disable() not
>>>> masking
>>>> IO-APIC interrupt" issue we discussed earlier.
>>>>
>>>>  
>>>>      
>>>>> Cheers,
>>>>> Tomas
>>>>>
>>>>>
>>>>>
>>>>> _______________________________________________
>>>>> Xenomai-core mailing list
>>>>> Xenomai-core@domain.hid
>>>>> https://mail.gna.org/listinfo/xenomai-core
>>>>>
>>>>>             
>>>>         
>>>     
>>
>>
>>   
> 
> 


-- 
Philippe.


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-04-25  7:12 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-04-24  4:33 [Xenomai-core] Cannot end interrupt from user space: add rt_intr_end call ? Tomas Kalibera
2008-04-24  8:45 ` Philippe Gerum
2008-04-24 16:08   ` Tomas Kalibera
2008-04-24 16:39     ` Philippe Gerum
2008-04-24 19:16       ` Tomas Kalibera
2008-04-25  7:12         ` Philippe Gerum

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.