mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
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


  parent reply	other threads:[~2021-10-21 18:03 UTC|newest]

Thread overview: 54+ 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 ` [PATCH 01/15] irq: mips: avoid nested irq_enter() Mark Rutland
2021-10-22 10:38   ` Marc Zyngier
2021-10-22 15:05     ` Mark Rutland
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-24 15:30   ` Thomas Bogendoerfer
2021-10-21 18:02 ` [PATCH 03/15] irq: mips: simplify do_domain_IRQ() Mark Rutland
2021-10-24 15:31   ` Thomas Bogendoerfer
2021-10-28 17:07   ` Guenter Roeck
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-22 10:52   ` Marc Zyngier
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-22  2:10   ` Pingfan Liu
2021-10-22  9:02     ` Mark Rutland
2021-10-22  2:33   ` Guo Ren
2021-10-22  8:52     ` Mark Rutland
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 ` [PATCH 07/15] irq: nds32: " Mark Rutland
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 [this message]
2021-10-22 15:18   ` [PATCH 09/15] irq: arm: perform irqentry in entry code Vladimir Murzin
2021-10-22 15:36     ` Mark Rutland
2021-10-22 16:34       ` Vladimir Murzin
2021-10-22 17:58         ` Mark Rutland
2021-10-22 18:43           ` Marc Zyngier
2021-10-23 12:06             ` Vladimir Murzin
2021-10-23 13:18               ` Marc Zyngier
2021-10-23 13:36                 ` Vladimir Murzin
2021-11-30  8:49                   ` Vladimir Murzin
2021-12-01  7:56                     ` Marc Zyngier
2021-10-21 18:02 ` [PATCH 10/15] irq: arm64: " Mark Rutland
2021-10-22  1:57   ` Pingfan Liu
2021-10-25 18:00   ` Catalin Marinas
2021-10-21 18:02 ` [PATCH 11/15] irq: csky: " Mark Rutland
2021-10-22  2:19   ` Guo Ren
2021-10-22  2:26     ` Guo Ren
2021-10-21 18:02 ` [PATCH 12/15] irq: openrisc: " Mark Rutland
2021-10-22 20:40   ` Stafford Horne
2021-10-21 18:02 ` [PATCH 13/15] irq: riscv: " Mark Rutland
2021-10-22  1:59   ` Guo Ren
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 ` [PATCH 15/15] irq: remove handle_domain_{irq,nmi}() Mark Rutland
2021-10-22 10:05   ` Marc Zyngier
2021-10-22 15:06     ` Mark Rutland
2021-10-22  1:26 ` [PATCH 00/15] " Linus Torvalds
2021-10-22 11:20 ` Marc Zyngier
2021-10-22 15:10   ` Mark Rutland
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: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®