Re: [PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Thomas Gleixner
On Mon, 19 Sep 2016, Thomas Gleixner wrote:
> On Mon, 19 Sep 2016, Marc Zyngier wrote:
> > On 19/09/16 10:12, Thomas Gleixner wrote:
> > > On Mon, 19 Sep 2016, Marc Zyngier wrote:
> > >>  if (handle != handle_bad_irq && is_chained) {
> > >> +unsigned int type = 
> > >> irqd_get_trigger_type(&desc->irq_data);
> > >> +
> > >>  /*
> > >>   * We're about to start this interrupt immediately,
> > >>   * hence the need to set the trigger configuration.
> > >> @@ -828,8 +830,10 @@ __irq_do_set_handler(struct irq_desc *desc, 
> > >> irq_flow_handler_t handle,
> > >>   * chained interrupt. Reset it immediately because we
> > >>   * do know better.
> > >>   */
> > >> -__irq_set_trigger(desc, 
> > >> irqd_get_trigger_type(&desc->irq_data));
> > >> -desc->handle_irq = handle;
> > >> +if (type != IRQ_TYPE_NONE) {
> > >> +__irq_set_trigger(desc, type);
> > >> +desc->handle_irq = handle;
> > > 
> > > Are you really sure that the handler should only be set when the trigger
> > > type is != NONE? I seriously doubt that this is correct.
> > 
> > The handler has already been set outside of if() statement (at line
> > 819). Here, we only set it again if we've actually called
> > __irq_set_trigger() which could have changed it to something that takes
> > the type into account (handle_level_irq or handle_edge_irq, for example).
> 
> Ah. I'll add a comment...

Bah. There is one already. Reading patches before being awake seems not to
be a brilliant idea.




Re: [PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Geert Uytterhoeven
Hi Thomas,

On Mon, Sep 19, 2016 at 11:28 AM, Thomas Gleixner  wrote:
> On Mon, 19 Sep 2016, Marc Zyngier wrote:
>> On 19/09/16 10:12, Thomas Gleixner wrote:
>> > On Mon, 19 Sep 2016, Marc Zyngier wrote:
>> >>if (handle != handle_bad_irq && is_chained) {
>> >> +  unsigned int type = irqd_get_trigger_type(&desc->irq_data);
>> >> +
>> >>/*
>> >> * We're about to start this interrupt immediately,
>> >> * hence the need to set the trigger configuration.
>> >> @@ -828,8 +830,10 @@ __irq_do_set_handler(struct irq_desc *desc, 
>> >> irq_flow_handler_t handle,
>> >> * chained interrupt. Reset it immediately because we
>> >> * do know better.
>> >> */
>> >> -  __irq_set_trigger(desc, 
>> >> irqd_get_trigger_type(&desc->irq_data));
>> >> -  desc->handle_irq = handle;
>> >> +  if (type != IRQ_TYPE_NONE) {
>> >> +  __irq_set_trigger(desc, type);
>> >> +  desc->handle_irq = handle;
>> >
>> > Are you really sure that the handler should only be set when the trigger
>> > type is != NONE? I seriously doubt that this is correct.
>>
>> The handler has already been set outside of if() statement (at line
>> 819). Here, we only set it again if we've actually called
>> __irq_set_trigger() which could have changed it to something that takes
>> the type into account (handle_level_irq or handle_edge_irq, for example).
>
> Ah. I'll add a comment...

The comment is already there ;-)

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds


Re: [PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Thomas Gleixner
On Mon, 19 Sep 2016, Marc Zyngier wrote:
> On 19/09/16 10:12, Thomas Gleixner wrote:
> > On Mon, 19 Sep 2016, Marc Zyngier wrote:
> >>if (handle != handle_bad_irq && is_chained) {
> >> +  unsigned int type = irqd_get_trigger_type(&desc->irq_data);
> >> +
> >>/*
> >> * We're about to start this interrupt immediately,
> >> * hence the need to set the trigger configuration.
> >> @@ -828,8 +830,10 @@ __irq_do_set_handler(struct irq_desc *desc, 
> >> irq_flow_handler_t handle,
> >> * chained interrupt. Reset it immediately because we
> >> * do know better.
> >> */
> >> -  __irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data));
> >> -  desc->handle_irq = handle;
> >> +  if (type != IRQ_TYPE_NONE) {
> >> +  __irq_set_trigger(desc, type);
> >> +  desc->handle_irq = handle;
> > 
> > Are you really sure that the handler should only be set when the trigger
> > type is != NONE? I seriously doubt that this is correct.
> 
> The handler has already been set outside of if() statement (at line
> 819). Here, we only set it again if we've actually called
> __irq_set_trigger() which could have changed it to something that takes
> the type into account (handle_level_irq or handle_edge_irq, for example).

Ah. I'll add a comment...


Re: [PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Geert Uytterhoeven
Hi Marc,

On Mon, Sep 19, 2016 at 10:49 AM, Marc Zyngier  wrote:
> There is no point in trying to configure the trigger of a chained
> interrupt if no trigger information has been configured. At best
> this is ignored, and at the worse this confuses the underlying
> irqchip (which is likely not to handle such a thing), and
> unnecessarily alarms the user.
>
> Only apply the configuration if type is not IRQ_TYPE_NONE.

Thanks!

> Reported-by: Geert Uytterhoeven 
> Fixes: 1e12c4a9393b ("genirq: Correctly configure the trigger on chained 
> interrupts")
> Link: 
> https://lkml.kernel.org/r/CAMuHMdVW1eTn20=etycj8hkvwohasuh_yqxry2mgbevz8fp...@mail.gmail.com
> Signed-off-by: Marc Zyngier 

Tested-by: Geert Uytterhoeven 

Gr{oetje,eeting}s,

Geert

--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- ge...@linux-m68k.org

In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds


Re: [PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Marc Zyngier
On 19/09/16 10:12, Thomas Gleixner wrote:
> On Mon, 19 Sep 2016, Marc Zyngier wrote:
>> There is no point in trying to configure the trigger of a chained
>> interrupt if no trigger information has been configured. At best
>> this is ignored, and at the worse this confuses the underlying
>> irqchip (which is likely not to handle such a thing), and
>> unnecessarily alarms the user.
>>
>> Only apply the configuration if type is not IRQ_TYPE_NONE.
>>
>> Reported-by: Geert Uytterhoeven 
>> Fixes: 1e12c4a9393b ("genirq: Correctly configure the trigger on chained 
>> interrupts")
>> Link: 
>> https://lkml.kernel.org/r/CAMuHMdVW1eTn20=etycj8hkvwohasuh_yqxry2mgbevz8fp...@mail.gmail.com
>> Signed-off-by: Marc Zyngier 
>> ---
>>  kernel/irq/chip.c | 8 ++--
>>  1 file changed, 6 insertions(+), 2 deletions(-)
>>
>> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
>> index 6373890..26ba565 100644
>> --- a/kernel/irq/chip.c
>> +++ b/kernel/irq/chip.c
>> @@ -820,6 +820,8 @@ __irq_do_set_handler(struct irq_desc *desc, 
>> irq_flow_handler_t handle,
>>  desc->name = name;
>>  
>>  if (handle != handle_bad_irq && is_chained) {
>> +unsigned int type = irqd_get_trigger_type(&desc->irq_data);
>> +
>>  /*
>>   * We're about to start this interrupt immediately,
>>   * hence the need to set the trigger configuration.
>> @@ -828,8 +830,10 @@ __irq_do_set_handler(struct irq_desc *desc, 
>> irq_flow_handler_t handle,
>>   * chained interrupt. Reset it immediately because we
>>   * do know better.
>>   */
>> -__irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data));
>> -desc->handle_irq = handle;
>> +if (type != IRQ_TYPE_NONE) {
>> +__irq_set_trigger(desc, type);
>> +desc->handle_irq = handle;
> 
> Are you really sure that the handler should only be set when the trigger
> type is != NONE? I seriously doubt that this is correct.

The handler has already been set outside of if() statement (at line
819). Here, we only set it again if we've actually called
__irq_set_trigger() which could have changed it to something that takes
the type into account (handle_level_irq or handle_edge_irq, for example).

Thanks,

M.
-- 
Jazz is not dead. It just smells funny...


Re: [PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Thomas Gleixner
On Mon, 19 Sep 2016, Marc Zyngier wrote:
> There is no point in trying to configure the trigger of a chained
> interrupt if no trigger information has been configured. At best
> this is ignored, and at the worse this confuses the underlying
> irqchip (which is likely not to handle such a thing), and
> unnecessarily alarms the user.
> 
> Only apply the configuration if type is not IRQ_TYPE_NONE.
> 
> Reported-by: Geert Uytterhoeven 
> Fixes: 1e12c4a9393b ("genirq: Correctly configure the trigger on chained 
> interrupts")
> Link: 
> https://lkml.kernel.org/r/CAMuHMdVW1eTn20=etycj8hkvwohasuh_yqxry2mgbevz8fp...@mail.gmail.com
> Signed-off-by: Marc Zyngier 
> ---
>  kernel/irq/chip.c | 8 ++--
>  1 file changed, 6 insertions(+), 2 deletions(-)
> 
> diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
> index 6373890..26ba565 100644
> --- a/kernel/irq/chip.c
> +++ b/kernel/irq/chip.c
> @@ -820,6 +820,8 @@ __irq_do_set_handler(struct irq_desc *desc, 
> irq_flow_handler_t handle,
>   desc->name = name;
>  
>   if (handle != handle_bad_irq && is_chained) {
> + unsigned int type = irqd_get_trigger_type(&desc->irq_data);
> +
>   /*
>* We're about to start this interrupt immediately,
>* hence the need to set the trigger configuration.
> @@ -828,8 +830,10 @@ __irq_do_set_handler(struct irq_desc *desc, 
> irq_flow_handler_t handle,
>* chained interrupt. Reset it immediately because we
>* do know better.
>*/
> - __irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data));
> - desc->handle_irq = handle;
> + if (type != IRQ_TYPE_NONE) {
> + __irq_set_trigger(desc, type);
> + desc->handle_irq = handle;

Are you really sure that the handler should only be set when the trigger
type is != NONE? I seriously doubt that this is correct.

Thanks,

tglx




[PATCH] genirq: Skip chained interrupt trigger configuration if type is IRQ_TYPE_NONE

2016-09-19 Thread Marc Zyngier
There is no point in trying to configure the trigger of a chained
interrupt if no trigger information has been configured. At best
this is ignored, and at the worse this confuses the underlying
irqchip (which is likely not to handle such a thing), and
unnecessarily alarms the user.

Only apply the configuration if type is not IRQ_TYPE_NONE.

Reported-by: Geert Uytterhoeven 
Fixes: 1e12c4a9393b ("genirq: Correctly configure the trigger on chained 
interrupts")
Link: 
https://lkml.kernel.org/r/CAMuHMdVW1eTn20=etycj8hkvwohasuh_yqxry2mgbevz8fp...@mail.gmail.com
Signed-off-by: Marc Zyngier 
---
 kernel/irq/chip.c | 8 ++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index 6373890..26ba565 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -820,6 +820,8 @@ __irq_do_set_handler(struct irq_desc *desc, 
irq_flow_handler_t handle,
desc->name = name;
 
if (handle != handle_bad_irq && is_chained) {
+   unsigned int type = irqd_get_trigger_type(&desc->irq_data);
+
/*
 * We're about to start this interrupt immediately,
 * hence the need to set the trigger configuration.
@@ -828,8 +830,10 @@ __irq_do_set_handler(struct irq_desc *desc, 
irq_flow_handler_t handle,
 * chained interrupt. Reset it immediately because we
 * do know better.
 */
-   __irq_set_trigger(desc, irqd_get_trigger_type(&desc->irq_data));
-   desc->handle_irq = handle;
+   if (type != IRQ_TYPE_NONE) {
+   __irq_set_trigger(desc, type);
+   desc->handle_irq = handle;
+   }
 
irq_settings_set_noprobe(desc);
irq_settings_set_norequest(desc);
-- 
2.1.4