Message ID | 1432116013-25902-11-git-send-email-jiang.liu@linux.intel.com (mailing list archive) |
---|---|
State | Superseded |
Delegated to: | Geert Uytterhoeven |
Headers | show |
On Wed, 20 May 2015, Jiang Liu wrote: > Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc while we > already have a pointer to corresponding irq_desc. > > Also replace generic_handle_irq with generic_handle_irq_desc() to avoid > looking up irq_desc again. > > Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> > --- > drivers/sh/intc/core.c | 2 +- > drivers/sh/intc/virq.c | 14 ++++++++------ > 2 files changed, 9 insertions(+), 7 deletions(-) > > diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c > index 81f22980b2de..e4ca964ca840 100644 > --- a/drivers/sh/intc/core.c > +++ b/drivers/sh/intc/core.c > @@ -67,7 +67,7 @@ void intc_set_prio_level(unsigned int irq, unsigned int level) > > static void intc_redirect_irq(unsigned int irq, struct irq_desc *desc) > { > - generic_handle_irq((unsigned int)irq_get_handler_data(irq)); > + generic_handle_irq_desc(irq, desc); This looks wrong. It's a redirector of irq to some other irq. redir_irq = (unsigned int)irq_get_handler_data(irq); which should be: redir_irq = (unsigned int)irq_desc_get_irq_handler_data(desc); And redir_irq is certainly not the same as irq. So this wants a conversion to irq_desc_get_irq_handler_data() first. That makes the irq argument unused. Thanks, tglx -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On 2015/5/20 23:12, Thomas Gleixner wrote: > On Wed, 20 May 2015, Jiang Liu wrote: > >> Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc while we >> already have a pointer to corresponding irq_desc. >> >> Also replace generic_handle_irq with generic_handle_irq_desc() to avoid >> looking up irq_desc again. >> >> Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> >> --- >> drivers/sh/intc/core.c | 2 +- >> drivers/sh/intc/virq.c | 14 ++++++++------ >> 2 files changed, 9 insertions(+), 7 deletions(-) >> >> diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c >> index 81f22980b2de..e4ca964ca840 100644 >> --- a/drivers/sh/intc/core.c >> +++ b/drivers/sh/intc/core.c >> @@ -67,7 +67,7 @@ void intc_set_prio_level(unsigned int irq, unsigned int level) >> >> static void intc_redirect_irq(unsigned int irq, struct irq_desc *desc) >> { >> - generic_handle_irq((unsigned int)irq_get_handler_data(irq)); >> + generic_handle_irq_desc(irq, desc); > > This looks wrong. It's a redirector of irq to some other irq. > > redir_irq = (unsigned int)irq_get_handler_data(irq); > > which should be: > > redir_irq = (unsigned int)irq_desc_get_irq_handler_data(desc); > > And redir_irq is certainly not the same as irq. So this wants a > conversion to irq_desc_get_irq_handler_data() first. That makes the > irq argument unused. Good catch, will fix it in next version. > > Thanks, > > tglx > -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/sh/intc/core.c b/drivers/sh/intc/core.c index 81f22980b2de..e4ca964ca840 100644 --- a/drivers/sh/intc/core.c +++ b/drivers/sh/intc/core.c @@ -67,7 +67,7 @@ void intc_set_prio_level(unsigned int irq, unsigned int level) static void intc_redirect_irq(unsigned int irq, struct irq_desc *desc) { - generic_handle_irq((unsigned int)irq_get_handler_data(irq)); + generic_handle_irq_desc(irq, desc); } static void __init intc_register_irq(struct intc_desc *desc, diff --git a/drivers/sh/intc/virq.c b/drivers/sh/intc/virq.c index 3dbc21696924..8083882a91c0 100644 --- a/drivers/sh/intc/virq.c +++ b/drivers/sh/intc/virq.c @@ -109,7 +109,7 @@ static int add_virq_to_pirq(unsigned int irq, unsigned int virq) static void intc_virq_handler(unsigned int irq, struct irq_desc *desc) { - struct irq_data *data = irq_get_irq_data(irq); + struct irq_data *data = irq_desc_get_irq_data(desc); struct irq_chip *chip = irq_data_get_irq_chip(data); struct intc_virq_list *entry, *vlist = irq_data_get_irq_handler_data(data); struct intc_desc_int *d = get_intc_desc(irq); @@ -118,12 +118,14 @@ static void intc_virq_handler(unsigned int irq, struct irq_desc *desc) for_each_virq(entry, vlist) { unsigned long addr, handle; + struct irq_desc *vdesc = irq_to_desc(entry->irq); - handle = (unsigned long)irq_get_handler_data(entry->irq); - addr = INTC_REG(d, _INTC_ADDR_E(handle), 0); - - if (intc_reg_fns[_INTC_FN(handle)](addr, handle, 0)) - generic_handle_irq(entry->irq); + if (vdesc) { + handle = (unsigned long)irq_desc_get_handler_data(vdesc); + addr = INTC_REG(d, _INTC_ADDR_E(handle), 0); + if (intc_reg_fns[_INTC_FN(handle)](addr, handle, 0)) + generic_handle_irq_desc(entry->irq, vdesc); + } } chip->irq_unmask(data);
Use irq_desc_get_xxx() to avoid redundant lookup of irq_desc while we already have a pointer to corresponding irq_desc. Also replace generic_handle_irq with generic_handle_irq_desc() to avoid looking up irq_desc again. Signed-off-by: Jiang Liu <jiang.liu@linux.intel.com> --- drivers/sh/intc/core.c | 2 +- drivers/sh/intc/virq.c | 14 ++++++++------ 2 files changed, 9 insertions(+), 7 deletions(-)