On Mon, Jul 29, 2024 at 10:47:52AM +0800, Jinjie Ruan wrote: > Since commit 064dbfb41691 ("arm64: entry: convert IRQ+FIQ handlers to C"), > the gic_handle_irq() is only called by C functions. > > And since commit a7b0872e964c ("irq: arm: perform irqentry in entry code"), > aic_handle(), aic5_handle(), clps711x_irqh(), davinci_cp_intc_handle_irq(), > ft010_irqchip_handle_irq(), ixp4xx_handle_irq(), omap_intc_handle_irq(), > sa1100_handle_irq() and fpga_handle_irq() are only called by C functions. > > So remove the asmlinkages. This commit message isn't quite right -- GICv3 can also be used on 32-bit arm, and so even after commit 064dbfb41691 it could be called from assembly until commit a7b0872e964c. I think it'd be better to say: Currently, all architectures with set_handle_irq() call the root irqchip handler from C code, so there's no need for these to be asmlinkage. Remove asmlinkage for all handlers registered with set_handle_irq(). > Fixes: 064dbfb41691 ("arm64: entry: convert IRQ+FIQ handlers to C") > Fixes: a7b0872e964c ("irq: arm: perform irqentry in entry code") This is a cleanup, not a fix. Please don't add Fixes tags unless this fixes a real functional issue. > Signed-off-by: Jinjie Ruan <ruanjinjie@xxxxxxxxxx> > Suggested-by: Thomas Gleixner <tglx@xxxxxxxxxxxxx> With the commit message cleaned up and the fixes tags gone: Acked-by: Mark Rutland <mark.rutland@xxxxxxx> Mark. > --- > v2: > - Also fix for arm32 irqchip as Thomas suggested. > - Add Suggested-by. > --- > drivers/irqchip/irq-atmel-aic.c | 3 +-- > drivers/irqchip/irq-atmel-aic5.c | 3 +-- > drivers/irqchip/irq-clps711x.c | 2 +- > drivers/irqchip/irq-davinci-cp-intc.c | 3 +-- > drivers/irqchip/irq-ftintc010.c | 2 +- > drivers/irqchip/irq-gic-v3.c | 2 +- > drivers/irqchip/irq-ixp4xx.c | 3 +-- > drivers/irqchip/irq-omap-intc.c | 3 +-- > drivers/irqchip/irq-sa11x0.c | 3 +-- > drivers/irqchip/irq-versatile-fpga.c | 2 +- > 10 files changed, 10 insertions(+), 16 deletions(-) > > diff --git a/drivers/irqchip/irq-atmel-aic.c b/drivers/irqchip/irq-atmel-aic.c > index 4631f6847953..3839ad79ad31 100644 > --- a/drivers/irqchip/irq-atmel-aic.c > +++ b/drivers/irqchip/irq-atmel-aic.c > @@ -57,8 +57,7 @@ > > static struct irq_domain *aic_domain; > > -static asmlinkage void __exception_irq_entry > -aic_handle(struct pt_regs *regs) > +static void __exception_irq_entry aic_handle(struct pt_regs *regs) > { > struct irq_domain_chip_generic *dgc = aic_domain->gc; > struct irq_chip_generic *gc = dgc->gc[0]; > diff --git a/drivers/irqchip/irq-atmel-aic5.c b/drivers/irqchip/irq-atmel-aic5.c > index 145535bd7560..c0f55dc7b050 100644 > --- a/drivers/irqchip/irq-atmel-aic5.c > +++ b/drivers/irqchip/irq-atmel-aic5.c > @@ -67,8 +67,7 @@ > > static struct irq_domain *aic5_domain; > > -static asmlinkage void __exception_irq_entry > -aic5_handle(struct pt_regs *regs) > +static void __exception_irq_entry aic5_handle(struct pt_regs *regs) > { > struct irq_chip_generic *bgc = irq_get_domain_generic_chip(aic5_domain, 0); > u32 irqnr; > diff --git a/drivers/irqchip/irq-clps711x.c b/drivers/irqchip/irq-clps711x.c > index e731e0784f7e..806ebb1de201 100644 > --- a/drivers/irqchip/irq-clps711x.c > +++ b/drivers/irqchip/irq-clps711x.c > @@ -69,7 +69,7 @@ static struct { > struct irq_domain_ops ops; > } *clps711x_intc; > > -static asmlinkage void __exception_irq_entry clps711x_irqh(struct pt_regs *regs) > +static void __exception_irq_entry clps711x_irqh(struct pt_regs *regs) > { > u32 irqstat; > > diff --git a/drivers/irqchip/irq-davinci-cp-intc.c b/drivers/irqchip/irq-davinci-cp-intc.c > index 7482c8ed34b2..f4f8e9fadbbf 100644 > --- a/drivers/irqchip/irq-davinci-cp-intc.c > +++ b/drivers/irqchip/irq-davinci-cp-intc.c > @@ -116,8 +116,7 @@ static struct irq_chip davinci_cp_intc_irq_chip = { > .flags = IRQCHIP_SKIP_SET_WAKE, > }; > > -static asmlinkage void __exception_irq_entry > -davinci_cp_intc_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry davinci_cp_intc_handle_irq(struct pt_regs *regs) > { > int gpir, irqnr, none; > > diff --git a/drivers/irqchip/irq-ftintc010.c b/drivers/irqchip/irq-ftintc010.c > index 359efc1d1be7..b91c358ea6db 100644 > --- a/drivers/irqchip/irq-ftintc010.c > +++ b/drivers/irqchip/irq-ftintc010.c > @@ -125,7 +125,7 @@ static struct irq_chip ft010_irq_chip = { > /* Local static for the IRQ entry call */ > static struct ft010_irq_data firq; > > -static asmlinkage void __exception_irq_entry ft010_irqchip_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry ft010_irqchip_handle_irq(struct pt_regs *regs) > { > struct ft010_irq_data *f = &firq; > int irq; > diff --git a/drivers/irqchip/irq-gic-v3.c b/drivers/irqchip/irq-gic-v3.c > index c19083bfb943..0efa3443c323 100644 > --- a/drivers/irqchip/irq-gic-v3.c > +++ b/drivers/irqchip/irq-gic-v3.c > @@ -930,7 +930,7 @@ static void __gic_handle_irq_from_irqsoff(struct pt_regs *regs) > __gic_handle_nmi(irqnr, regs); > } > > -static asmlinkage void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs) > { > if (unlikely(gic_supports_nmi() && !interrupts_enabled(regs))) > __gic_handle_irq_from_irqsoff(regs); > diff --git a/drivers/irqchip/irq-ixp4xx.c b/drivers/irqchip/irq-ixp4xx.c > index 5fba907b9052..f23b02f62a5c 100644 > --- a/drivers/irqchip/irq-ixp4xx.c > +++ b/drivers/irqchip/irq-ixp4xx.c > @@ -105,8 +105,7 @@ static void ixp4xx_irq_unmask(struct irq_data *d) > } > } > > -static asmlinkage void __exception_irq_entry > -ixp4xx_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry ixp4xx_handle_irq(struct pt_regs *regs) > { > struct ixp4xx_irq *ixi = &ixirq; > unsigned long status; > diff --git a/drivers/irqchip/irq-omap-intc.c b/drivers/irqchip/irq-omap-intc.c > index dc82162ba763..ad84a2f03368 100644 > --- a/drivers/irqchip/irq-omap-intc.c > +++ b/drivers/irqchip/irq-omap-intc.c > @@ -325,8 +325,7 @@ static int __init omap_init_irq(u32 base, struct device_node *node) > return ret; > } > > -static asmlinkage void __exception_irq_entry > -omap_intc_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry omap_intc_handle_irq(struct pt_regs *regs) > { > extern unsigned long irq_err_count; > u32 irqnr; > diff --git a/drivers/irqchip/irq-sa11x0.c b/drivers/irqchip/irq-sa11x0.c > index 31c202a1ae62..9d0b80271949 100644 > --- a/drivers/irqchip/irq-sa11x0.c > +++ b/drivers/irqchip/irq-sa11x0.c > @@ -127,8 +127,7 @@ static int __init sa1100irq_init_devicefs(void) > > device_initcall(sa1100irq_init_devicefs); > > -static asmlinkage void __exception_irq_entry > -sa1100_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry sa1100_handle_irq(struct pt_regs *regs) > { > uint32_t icip, icmr, mask; > > diff --git a/drivers/irqchip/irq-versatile-fpga.c b/drivers/irqchip/irq-versatile-fpga.c > index 5018a06060e6..ca471c6fee99 100644 > --- a/drivers/irqchip/irq-versatile-fpga.c > +++ b/drivers/irqchip/irq-versatile-fpga.c > @@ -128,7 +128,7 @@ static int handle_one_fpga(struct fpga_irq_data *f, struct pt_regs *regs) > * Keep iterating over all registered FPGA IRQ controllers until there are > * no pending interrupts. > */ > -static asmlinkage void __exception_irq_entry fpga_handle_irq(struct pt_regs *regs) > +static void __exception_irq_entry fpga_handle_irq(struct pt_regs *regs) > { > int i, handled; > > -- > 2.34.1 >