From: Mark Rutland <mark.rutland@arm.com> To: linux-kernel@vger.kernel.org Cc: aou@eecs.berkeley.edu, catalin.marinas@arm.com, deanbo422@gmail.com, green.hu@gmail.com, guoren@kernel.org, jonas@southpole.se, kernelfans@gmail.com, linux-arm-kernel@lists.infradead.org, linux@armlinux.org.uk, mark.rutland@arm.com, maz@kernel.org, nickhu@andestech.com, palmer@dabbelt.com, paulmck@kernel.org, paul.walmsley@sifive.com, peterz@infradead.org, shorne@gmail.com, stefan.kristiansson@saunalahti.fi, tglx@linutronix.de, torvalds@linux-foundation.org, tsbogend@alpha.franken.de, vgupta@kernel.org, will@kernel.org Subject: [PATCH 09/15] irq: arm: perform irqentry in entry code Date: Thu, 21 Oct 2021 19:02:30 +0100 [thread overview] Message-ID: <20211021180236.37428-10-mark.rutland@arm.com> (raw) In-Reply-To: <20211021180236.37428-1-mark.rutland@arm.com> In preparation for removing HANDLE_DOMAIN_IRQ_IRQENTRY, have arch/arm perform all the irqentry accounting in its entry code. For configurations with CONFIG_GENERIC_IRQ_MULTI_HANDLER, we can use generic_handle_arch_irq(). Other than asm_do_IRQ(), all C calls to handle_IRQ() are from irqchip handlers which will be called from generic_handle_arch_irq(), so to avoid double accounting IRQ entry, the entry logic is moved from handle_IRQ() into asm_do_IRQ(). For ARMv7M the entry assembly is tightly coupled with the NVIC irqchip, and while the entry code should logically live under arch/arm/, moving the entry logic there makes things more convoluted. So for now, place the entry logic in the NVIC irqchip, but separated into a separate function to make the split of responsibility clear. For all other configurations without CONFIG_GENERIC_IRQ_MULTI_HANDLER, IRQ entry is already handled in arch code, and requires no changes. There should be no functional change as a result of this patch. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Russell King <linux@armlinux.org.uk> Cc: Thomas Gleixner <tglx@linutronix.de> --- arch/arm/Kconfig | 1 - arch/arm/kernel/entry-armv.S | 5 +---- arch/arm/kernel/irq.c | 14 ++++++++------ drivers/irqchip/irq-nvic.c | 19 +++++++++++++++++-- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index f18aff82c27b..fc196421b2ce 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -65,7 +65,6 @@ config ARM select GENERIC_SCHED_CLOCK select GENERIC_SMP_IDLE_THREAD select HANDLE_DOMAIN_IRQ - select HANDLE_DOMAIN_IRQ_IRQENTRY select HARDIRQS_SW_RESEND select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 241b73d64df7..3d0b6169ab86 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -38,14 +38,11 @@ */ .macro irq_handler #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER - ldr r1, =handle_arch_irq mov r0, sp - badr lr, 9997f - ldr pc, [r1] + bl generic_handle_arch_irq #else arch_irq_handler_default #endif -9997: .endm .macro pabt_helper diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 20ab1e607522..b79975bd988c 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -63,11 +63,8 @@ int arch_show_interrupts(struct seq_file *p, int prec) */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { - struct pt_regs *old_regs = set_irq_regs(regs); struct irq_desc *desc; - irq_enter(); - /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. @@ -81,9 +78,6 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs) handle_irq_desc(desc); else ack_bad_irq(irq); - - irq_exit(); - set_irq_regs(old_regs); } /* @@ -92,7 +86,15 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs) asmlinkage void __exception_irq_entry asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { + struct pt_regs *old_regs; + + irq_enter(); + old_regs = set_irq_regs(regs); + handle_IRQ(irq, regs); + + set_irq_regs(old_regs); + irq_exit(); } void __init init_IRQ(void) diff --git a/drivers/irqchip/irq-nvic.c b/drivers/irqchip/irq-nvic.c index b31c4cff4d3a..ce330880665e 100644 --- a/drivers/irqchip/irq-nvic.c +++ b/drivers/irqchip/irq-nvic.c @@ -37,12 +37,27 @@ static struct irq_domain *nvic_irq_domain; -asmlinkage void __exception_irq_entry -nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) +static void __nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) { handle_domain_irq(nvic_irq_domain, hwirq, regs); } +/* + * TODO: restructure the ARMv7M entry logic so that this entry logic can live + * in arch code. + */ +asmlinkage void __exception_irq_entry +static void nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) +{ + struct pt_regs *old_regs; + + irq_enter(); + old_regs = set_irq_regs(regs); + __nvic_handle_irq(hwirq, regs); + set_irq_regs(old_regs); + irq_exit(); +} + static int nvic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { -- 2.11.0
WARNING: multiple messages have this Message-ID (diff)
From: Mark Rutland <mark.rutland@arm.com> To: linux-kernel@vger.kernel.org Cc: aou@eecs.berkeley.edu, catalin.marinas@arm.com, deanbo422@gmail.com, green.hu@gmail.com, guoren@kernel.org, jonas@southpole.se, kernelfans@gmail.com, linux-arm-kernel@lists.infradead.org, linux@armlinux.org.uk, mark.rutland@arm.com, maz@kernel.org, nickhu@andestech.com, palmer@dabbelt.com, paulmck@kernel.org, paul.walmsley@sifive.com, peterz@infradead.org, shorne@gmail.com, stefan.kristiansson@saunalahti.fi, tglx@linutronix.de, torvalds@linux-foundation.org, tsbogend@alpha.franken.de, vgupta@kernel.org, will@kernel.org Subject: [PATCH 09/15] irq: arm: perform irqentry in entry code Date: Thu, 21 Oct 2021 19:02:30 +0100 [thread overview] Message-ID: <20211021180236.37428-10-mark.rutland@arm.com> (raw) In-Reply-To: <20211021180236.37428-1-mark.rutland@arm.com> In preparation for removing HANDLE_DOMAIN_IRQ_IRQENTRY, have arch/arm perform all the irqentry accounting in its entry code. For configurations with CONFIG_GENERIC_IRQ_MULTI_HANDLER, we can use generic_handle_arch_irq(). Other than asm_do_IRQ(), all C calls to handle_IRQ() are from irqchip handlers which will be called from generic_handle_arch_irq(), so to avoid double accounting IRQ entry, the entry logic is moved from handle_IRQ() into asm_do_IRQ(). For ARMv7M the entry assembly is tightly coupled with the NVIC irqchip, and while the entry code should logically live under arch/arm/, moving the entry logic there makes things more convoluted. So for now, place the entry logic in the NVIC irqchip, but separated into a separate function to make the split of responsibility clear. For all other configurations without CONFIG_GENERIC_IRQ_MULTI_HANDLER, IRQ entry is already handled in arch code, and requires no changes. There should be no functional change as a result of this patch. Signed-off-by: Mark Rutland <mark.rutland@arm.com> Cc: Marc Zyngier <maz@kernel.org> Cc: Russell King <linux@armlinux.org.uk> Cc: Thomas Gleixner <tglx@linutronix.de> --- arch/arm/Kconfig | 1 - arch/arm/kernel/entry-armv.S | 5 +---- arch/arm/kernel/irq.c | 14 ++++++++------ drivers/irqchip/irq-nvic.c | 19 +++++++++++++++++-- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig index f18aff82c27b..fc196421b2ce 100644 --- a/arch/arm/Kconfig +++ b/arch/arm/Kconfig @@ -65,7 +65,6 @@ config ARM select GENERIC_SCHED_CLOCK select GENERIC_SMP_IDLE_THREAD select HANDLE_DOMAIN_IRQ - select HANDLE_DOMAIN_IRQ_IRQENTRY select HARDIRQS_SW_RESEND select HAVE_ARCH_AUDITSYSCALL if AEABI && !OABI_COMPAT select HAVE_ARCH_BITREVERSE if (CPU_32v7M || CPU_32v7) && !CPU_32v6 diff --git a/arch/arm/kernel/entry-armv.S b/arch/arm/kernel/entry-armv.S index 241b73d64df7..3d0b6169ab86 100644 --- a/arch/arm/kernel/entry-armv.S +++ b/arch/arm/kernel/entry-armv.S @@ -38,14 +38,11 @@ */ .macro irq_handler #ifdef CONFIG_GENERIC_IRQ_MULTI_HANDLER - ldr r1, =handle_arch_irq mov r0, sp - badr lr, 9997f - ldr pc, [r1] + bl generic_handle_arch_irq #else arch_irq_handler_default #endif -9997: .endm .macro pabt_helper diff --git a/arch/arm/kernel/irq.c b/arch/arm/kernel/irq.c index 20ab1e607522..b79975bd988c 100644 --- a/arch/arm/kernel/irq.c +++ b/arch/arm/kernel/irq.c @@ -63,11 +63,8 @@ int arch_show_interrupts(struct seq_file *p, int prec) */ void handle_IRQ(unsigned int irq, struct pt_regs *regs) { - struct pt_regs *old_regs = set_irq_regs(regs); struct irq_desc *desc; - irq_enter(); - /* * Some hardware gives randomly wrong interrupts. Rather * than crashing, do something sensible. @@ -81,9 +78,6 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs) handle_irq_desc(desc); else ack_bad_irq(irq); - - irq_exit(); - set_irq_regs(old_regs); } /* @@ -92,7 +86,15 @@ void handle_IRQ(unsigned int irq, struct pt_regs *regs) asmlinkage void __exception_irq_entry asm_do_IRQ(unsigned int irq, struct pt_regs *regs) { + struct pt_regs *old_regs; + + irq_enter(); + old_regs = set_irq_regs(regs); + handle_IRQ(irq, regs); + + set_irq_regs(old_regs); + irq_exit(); } void __init init_IRQ(void) diff --git a/drivers/irqchip/irq-nvic.c b/drivers/irqchip/irq-nvic.c index b31c4cff4d3a..ce330880665e 100644 --- a/drivers/irqchip/irq-nvic.c +++ b/drivers/irqchip/irq-nvic.c @@ -37,12 +37,27 @@ static struct irq_domain *nvic_irq_domain; -asmlinkage void __exception_irq_entry -nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) +static void __nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) { handle_domain_irq(nvic_irq_domain, hwirq, regs); } +/* + * TODO: restructure the ARMv7M entry logic so that this entry logic can live + * in arch code. + */ +asmlinkage void __exception_irq_entry +static void nvic_handle_irq(irq_hw_number_t hwirq, struct pt_regs *regs) +{ + struct pt_regs *old_regs; + + irq_enter(); + old_regs = set_irq_regs(regs); + __nvic_handle_irq(hwirq, regs); + set_irq_regs(old_regs); + irq_exit(); +} + static int nvic_irq_domain_alloc(struct irq_domain *domain, unsigned int virq, unsigned int nr_irqs, void *arg) { -- 2.11.0 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2021-10-21 18:03 UTC|newest] Thread overview: 108+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-10-21 18:02 [PATCH 00/15] irq: remove handle_domain_{irq,nmi}() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-21 18:02 ` [PATCH 01/15] irq: mips: avoid nested irq_enter() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 10:38 ` Marc Zyngier 2021-10-22 10:38 ` Marc Zyngier 2021-10-22 15:05 ` Mark Rutland 2021-10-22 15:05 ` Mark Rutland 2021-10-24 15:31 ` Thomas Bogendoerfer 2021-10-24 15:31 ` Thomas Bogendoerfer 2021-10-21 18:02 ` [PATCH 02/15] irq: mips: stop (ab)using handle_domain_irq() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-24 15:30 ` Thomas Bogendoerfer 2021-10-24 15:30 ` Thomas Bogendoerfer 2021-10-21 18:02 ` [PATCH 03/15] irq: mips: simplify do_domain_IRQ() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-24 15:31 ` Thomas Bogendoerfer 2021-10-24 15:31 ` Thomas Bogendoerfer 2021-10-28 17:07 ` Guenter Roeck 2021-10-28 17:07 ` Guenter Roeck 2021-10-28 17:11 ` Mark Rutland 2021-10-28 17:11 ` Mark Rutland 2021-10-21 18:02 ` [PATCH 04/15] irq: simplify handle_domain_{irq,nmi}() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 10:52 ` Marc Zyngier 2021-10-22 10:52 ` Marc Zyngier 2021-10-22 15:05 ` Mark Rutland 2021-10-22 15:05 ` Mark Rutland 2021-10-21 18:02 ` [PATCH 05/15] irq: add generic_handle_arch_irq() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 2:10 ` Pingfan Liu 2021-10-22 2:10 ` Pingfan Liu 2021-10-22 9:02 ` Mark Rutland 2021-10-22 9:02 ` Mark Rutland 2021-10-22 2:33 ` Guo Ren 2021-10-22 2:33 ` Guo Ren 2021-10-22 8:52 ` Mark Rutland 2021-10-22 8:52 ` Mark Rutland 2021-10-24 1:53 ` Guo Ren 2021-10-24 1:53 ` Guo Ren 2021-10-21 18:02 ` [PATCH 06/15] irq: arc: avoid CONFIG_HANDLE_DOMAIN_IRQ Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-21 18:02 ` [PATCH 07/15] irq: nds32: " Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 6:35 ` Greentime Hu 2021-10-22 6:35 ` Greentime Hu 2021-10-21 18:02 ` [PATCH 08/15] irq: add a (temporary) CONFIG_HANDLE_DOMAIN_IRQ_IRQENTRY Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-21 18:02 ` Mark Rutland [this message] 2021-10-21 18:02 ` [PATCH 09/15] irq: arm: perform irqentry in entry code Mark Rutland 2021-10-22 15:18 ` Vladimir Murzin 2021-10-22 15:18 ` Vladimir Murzin 2021-10-22 15:36 ` Mark Rutland 2021-10-22 15:36 ` Mark Rutland 2021-10-22 16:34 ` Vladimir Murzin 2021-10-22 16:34 ` Vladimir Murzin 2021-10-22 17:58 ` Mark Rutland 2021-10-22 17:58 ` Mark Rutland 2021-10-22 18:43 ` Marc Zyngier 2021-10-22 18:43 ` Marc Zyngier 2021-10-23 12:06 ` Vladimir Murzin 2021-10-23 12:06 ` Vladimir Murzin 2021-10-23 13:18 ` Marc Zyngier 2021-10-23 13:18 ` Marc Zyngier 2021-10-23 13:36 ` Vladimir Murzin 2021-10-23 13:36 ` Vladimir Murzin 2021-11-30 8:49 ` Vladimir Murzin 2021-11-30 8:49 ` Vladimir Murzin 2021-12-01 7:56 ` Marc Zyngier 2021-12-01 7:56 ` Marc Zyngier 2021-10-21 18:02 ` [PATCH 10/15] irq: arm64: " Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 1:57 ` Pingfan Liu 2021-10-22 1:57 ` Pingfan Liu 2021-10-25 18:00 ` Catalin Marinas 2021-10-25 18:00 ` Catalin Marinas 2021-10-21 18:02 ` [PATCH 11/15] irq: csky: " Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 2:19 ` Guo Ren 2021-10-22 2:19 ` Guo Ren 2021-10-22 2:26 ` Guo Ren 2021-10-22 2:26 ` Guo Ren 2021-10-21 18:02 ` [PATCH 12/15] irq: openrisc: " Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 20:40 ` Stafford Horne 2021-10-22 20:40 ` Stafford Horne 2021-10-21 18:02 ` [PATCH 13/15] irq: riscv: " Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 1:59 ` Guo Ren 2021-10-22 1:59 ` Guo Ren 2021-10-27 21:22 ` Palmer Dabbelt 2021-10-27 21:22 ` Palmer Dabbelt 2021-10-21 18:02 ` [PATCH 14/15] irq: remove CONFIG_HANDLE_DOMAIN_IRQ_IRQENTRY Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-21 18:02 ` [PATCH 15/15] irq: remove handle_domain_{irq,nmi}() Mark Rutland 2021-10-21 18:02 ` Mark Rutland 2021-10-22 10:05 ` Marc Zyngier 2021-10-22 10:05 ` Marc Zyngier 2021-10-22 15:06 ` Mark Rutland 2021-10-22 15:06 ` Mark Rutland 2021-10-22 1:26 ` [PATCH 00/15] " Linus Torvalds 2021-10-22 1:26 ` Linus Torvalds 2021-10-22 11:20 ` Marc Zyngier 2021-10-22 11:20 ` Marc Zyngier 2021-10-22 15:10 ` Mark Rutland 2021-10-22 15:10 ` Mark Rutland 2021-10-23 16:06 ` Marc Zyngier 2021-10-23 16:06 ` Marc Zyngier
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20211021180236.37428-10-mark.rutland@arm.com \ --to=mark.rutland@arm.com \ --cc=aou@eecs.berkeley.edu \ --cc=catalin.marinas@arm.com \ --cc=deanbo422@gmail.com \ --cc=green.hu@gmail.com \ --cc=guoren@kernel.org \ --cc=jonas@southpole.se \ --cc=kernelfans@gmail.com \ --cc=linux-arm-kernel@lists.infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux@armlinux.org.uk \ --cc=maz@kernel.org \ --cc=nickhu@andestech.com \ --cc=palmer@dabbelt.com \ --cc=paul.walmsley@sifive.com \ --cc=paulmck@kernel.org \ --cc=peterz@infradead.org \ --cc=shorne@gmail.com \ --cc=stefan.kristiansson@saunalahti.fi \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --cc=tsbogend@alpha.franken.de \ --cc=vgupta@kernel.org \ --cc=will@kernel.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
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.