All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: James Morse <james.morse@arm.com>
Cc: Sumit Garg <sumit.garg@linaro.org>,
	Florian Fainelli <f.fainelli@gmail.com>,
	Russell King <linux@arm.linux.org.uk>,
	Jason Cooper <jason@lakedaemon.net>,
	Saravana Kannan <saravanak@google.com>,
	Andrew Lunn <andrew@lunn.ch>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Gregory Clement <gregory.clement@bootlin.com>,
	linux-kernel@vger.kernel.org, jonathanh@nvidia.com,
	Will Deacon <will@kernel.org>,
	Thomas Gleixner <tglx@linutronix.de>,
	kernel-team@android.com,
	Valentin Schneider <valentin.schneider@arm.com>,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH v3 08/16] irqchip/gic: Configure SGIs as standard interrupts
Date: Fri, 18 Sep 2020 11:21:59 +0100	[thread overview]
Message-ID: <87h7rvqta0.wl-maz@kernel.org> (raw)
In-Reply-To: <f3af8930-b61d-4945-475c-b49e326cd24f@arm.com>

Hi James,

On Fri, 18 Sep 2020 10:58:45 +0100,
James Morse <james.morse@arm.com> wrote:
> 
> Hi Marc,
> 
> (CC: +Jon)
> 
> On 01/09/2020 15:43, Marc Zyngier wrote:
> > Change the way we deal with GIC SGIs by turning them into proper
> > IRQs, and calling into the arch code to register the interrupt range
> > instead of a callback.
> 
> Your comment "This only works because we don't nest SGIs..." on this
> thread tripped some bad memories from adding the irq-stack. Softirq
> causes us to nest irqs, but only once.
> 
> 
> (I've messed with the below diff to remove the added stuff:)
> 
> > diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
> > index 4ffd62af888f..4be2b62f816f 100644
> > --- a/drivers/irqchip/irq-gic.c
> > +++ b/drivers/irqchip/irq-gic.c
> > @@ -335,31 +335,22 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
> >  		irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);
> >  		irqnr = irqstat & GICC_IAR_INT_ID_MASK;
> >  
> > -		if (likely(irqnr > 15 && irqnr < 1020)) {
> > -			if (static_branch_likely(&supports_deactivate_key))
> > -				writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
> > -			isb();
> > -			handle_domain_irq(gic->domain, irqnr, regs);
> > -			continue;
> > -		}
> > -		if (irqnr < 16) {
> >  			writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
> > -			if (static_branch_likely(&supports_deactivate_key))
> > -				writel_relaxed(irqstat, cpu_base + GIC_CPU_DEACTIVATE);
> > -#ifdef CONFIG_SMP
> > -			/*
> > -			 * Ensure any shared data written by the CPU sending
> > -			 * the IPI is read after we've read the ACK register
> > -			 * on the GIC.
> > -			 *
> > -			 * Pairs with the write barrier in gic_raise_softirq
> > -			 */
> >  			smp_rmb();
> > -			handle_IPI(irqnr, regs);
> 
> If I read this right, previously we would EOI the interrupt before
> calling handle_IPI().  Where as now with the version of this series
> in your tree, we stuff the to-be-EOId value in a percpu variable,
> which is only safe if these don't nest.
> 
> Hidden in irq_exit(), kernel/softirq.c::__irq_exit_rcu() has this:
> |	preempt_count_sub(HARDIRQ_OFFSET);
> |	if (!in_interrupt() && local_softirq_pending())
> |		invoke_softirq();
> 
> The arch code doesn't raise the preempt counter by HARDIRQ, so once
> __irq_exit_rcu() has dropped it, in_interrupt() returns false, and
> we invoke_softirq().
> 
> invoke_softirq() -> __do_softirq() -> local_irq_enable()!
> 
> Fortunately, __do_softirq() raises the softirq count first using
> __local_bh_disable_ip(), which in-interrupt() checks too, so this
> can only happen once per IRQ.
> 
> Now the irq_exit() has moved from handle_IPI(), which ran after EOI,
> into handle_domain_irq(), which runs before. I think its possible
> SGIs nest, and the new percpu variable becomes corrupted.

I can't see how. The interrupt is active until we EOI/deactivate it,
and thus cannot be observed again by the CPU interface until this
happens.

Furthermore, irq_exit() in __handle_domain_irq() is *after* the EOI
anyway (generic_handle_irq_() directly calls the flow, which
immediately EOIs the interrupt). The only material change is that
irq_enter() happens before EOI. Is that what you are referring to?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: James Morse <james.morse@arm.com>
Cc: jonathanh@nvidia.com, linux-arm-kernel@lists.infradead.org,
	linux-kernel@vger.kernel.org, Sumit Garg <sumit.garg@linaro.org>,
	kernel-team@android.com, Florian Fainelli <f.fainelli@gmail.com>,
	Russell King <linux@arm.linux.org.uk>,
	Jason Cooper <jason@lakedaemon.net>,
	Saravana Kannan <saravanak@google.com>,
	Andrew Lunn <andrew@lunn.ch>,
	Catalin Marinas <catalin.marinas@arm.com>,
	Gregory Clement <gregory.clement@bootlin.com>,
	Thomas Gleixner <tglx@linutronix.de>,
	Will Deacon <will@kernel.org>,
	Valentin Schneider <valentin.schneider@arm.com>
Subject: Re: [PATCH v3 08/16] irqchip/gic: Configure SGIs as standard interrupts
Date: Fri, 18 Sep 2020 11:21:59 +0100	[thread overview]
Message-ID: <87h7rvqta0.wl-maz@kernel.org> (raw)
In-Reply-To: <f3af8930-b61d-4945-475c-b49e326cd24f@arm.com>

Hi James,

On Fri, 18 Sep 2020 10:58:45 +0100,
James Morse <james.morse@arm.com> wrote:
> 
> Hi Marc,
> 
> (CC: +Jon)
> 
> On 01/09/2020 15:43, Marc Zyngier wrote:
> > Change the way we deal with GIC SGIs by turning them into proper
> > IRQs, and calling into the arch code to register the interrupt range
> > instead of a callback.
> 
> Your comment "This only works because we don't nest SGIs..." on this
> thread tripped some bad memories from adding the irq-stack. Softirq
> causes us to nest irqs, but only once.
> 
> 
> (I've messed with the below diff to remove the added stuff:)
> 
> > diff --git a/drivers/irqchip/irq-gic.c b/drivers/irqchip/irq-gic.c
> > index 4ffd62af888f..4be2b62f816f 100644
> > --- a/drivers/irqchip/irq-gic.c
> > +++ b/drivers/irqchip/irq-gic.c
> > @@ -335,31 +335,22 @@ static void __exception_irq_entry gic_handle_irq(struct pt_regs *regs)
> >  		irqstat = readl_relaxed(cpu_base + GIC_CPU_INTACK);
> >  		irqnr = irqstat & GICC_IAR_INT_ID_MASK;
> >  
> > -		if (likely(irqnr > 15 && irqnr < 1020)) {
> > -			if (static_branch_likely(&supports_deactivate_key))
> > -				writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
> > -			isb();
> > -			handle_domain_irq(gic->domain, irqnr, regs);
> > -			continue;
> > -		}
> > -		if (irqnr < 16) {
> >  			writel_relaxed(irqstat, cpu_base + GIC_CPU_EOI);
> > -			if (static_branch_likely(&supports_deactivate_key))
> > -				writel_relaxed(irqstat, cpu_base + GIC_CPU_DEACTIVATE);
> > -#ifdef CONFIG_SMP
> > -			/*
> > -			 * Ensure any shared data written by the CPU sending
> > -			 * the IPI is read after we've read the ACK register
> > -			 * on the GIC.
> > -			 *
> > -			 * Pairs with the write barrier in gic_raise_softirq
> > -			 */
> >  			smp_rmb();
> > -			handle_IPI(irqnr, regs);
> 
> If I read this right, previously we would EOI the interrupt before
> calling handle_IPI().  Where as now with the version of this series
> in your tree, we stuff the to-be-EOId value in a percpu variable,
> which is only safe if these don't nest.
> 
> Hidden in irq_exit(), kernel/softirq.c::__irq_exit_rcu() has this:
> |	preempt_count_sub(HARDIRQ_OFFSET);
> |	if (!in_interrupt() && local_softirq_pending())
> |		invoke_softirq();
> 
> The arch code doesn't raise the preempt counter by HARDIRQ, so once
> __irq_exit_rcu() has dropped it, in_interrupt() returns false, and
> we invoke_softirq().
> 
> invoke_softirq() -> __do_softirq() -> local_irq_enable()!
> 
> Fortunately, __do_softirq() raises the softirq count first using
> __local_bh_disable_ip(), which in-interrupt() checks too, so this
> can only happen once per IRQ.
> 
> Now the irq_exit() has moved from handle_IPI(), which ran after EOI,
> into handle_domain_irq(), which runs before. I think its possible
> SGIs nest, and the new percpu variable becomes corrupted.

I can't see how. The interrupt is active until we EOI/deactivate it,
and thus cannot be observed again by the CPU interface until this
happens.

Furthermore, irq_exit() in __handle_domain_irq() is *after* the EOI
anyway (generic_handle_irq_() directly calls the flow, which
immediately EOIs the interrupt). The only material change is that
irq_enter() happens before EOI. Is that what you are referring to?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

  reply	other threads:[~2020-09-18 10:25 UTC|newest]

Thread overview: 170+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-09-01 14:43 [PATCH v3 00/16] arm/arm64: Turning IPIs into normal interrupts Marc Zyngier
2020-09-01 14:43 ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 01/16] genirq: Add fasteoi IPI flow Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 02/16] genirq: Allow interrupts to be excluded from /proc/interrupts Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 03/16] arm64: Allow IPIs to be handled as normal interrupts Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-11 15:05   ` Catalin Marinas
2020-09-11 15:05     ` Catalin Marinas
2020-10-19 12:42   ` Vincent Guittot
2020-10-19 12:42     ` Vincent Guittot
2020-10-19 13:04     ` Marc Zyngier
2020-10-19 13:04       ` Marc Zyngier
2020-10-19 15:43       ` Vincent Guittot
2020-10-19 15:43         ` Vincent Guittot
2020-10-19 16:00         ` Valentin Schneider
2020-10-19 16:00           ` Valentin Schneider
2020-10-27 10:12         ` Vincent Guittot
2020-10-27 10:12           ` Vincent Guittot
2020-10-27 10:37           ` Marc Zyngier
2020-10-27 10:37             ` Marc Zyngier
2020-10-27 10:50             ` Vincent Guittot
2020-10-27 10:50               ` Vincent Guittot
2020-10-27 11:21               ` Vincent Guittot
2020-10-27 11:21                 ` Vincent Guittot
2020-10-27 12:06                 ` Marc Zyngier
2020-10-27 12:06                   ` Marc Zyngier
2020-10-27 13:17                   ` Vincent Guittot
2020-10-27 13:17                     ` Vincent Guittot
     [not found]                     ` <c66367b0-e8a0-2b7b-13c3-c9413462357c@huawei.com>
2021-05-06 11:44                       ` Marc Zyngier
2021-05-06 11:44                         ` Marc Zyngier
2021-05-07  7:30                         ` He Ying
2021-05-07  7:30                           ` He Ying
2021-05-07  8:56                           ` Marc Zyngier
2021-05-07  8:56                             ` Marc Zyngier
2021-05-07  9:31                             ` He Ying
2021-05-07  9:31                               ` He Ying
2020-09-01 14:43 ` [PATCH v3 04/16] ARM: " Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 05/16] irqchip/gic-v3: Describe the SGI range Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 06/16] irqchip/gic-v3: Configure SGIs as standard interrupts Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 07/16] irqchip/gic: Refactor SMP configuration Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 08/16] irqchip/gic: Configure SGIs as standard interrupts Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-14 13:06   ` Marek Szyprowski
2020-09-14 13:06     ` Marek Szyprowski
2020-09-14 13:13     ` Marc Zyngier
2020-09-14 13:13       ` Marc Zyngier
2020-09-14 13:26       ` Marek Szyprowski
2020-09-14 13:26         ` Marek Szyprowski
2020-09-14 15:09         ` Marc Zyngier
2020-09-14 15:09           ` Marc Zyngier
2020-09-15  6:48           ` Marek Szyprowski
2020-09-15  6:48             ` Marek Szyprowski
2020-09-15  8:07             ` Marc Zyngier
2020-09-15  8:07               ` Marc Zyngier
2020-09-15  8:35               ` Marek Szyprowski
2020-09-15  8:35                 ` Marek Szyprowski
2020-09-15  9:48                 ` Marc Zyngier
2020-09-15  9:48                   ` Marc Zyngier
2020-09-16 14:16     ` Jon Hunter
2020-09-16 14:16       ` Jon Hunter
2020-09-16 15:10       ` Marc Zyngier
2020-09-16 15:10         ` Marc Zyngier
2020-09-16 15:46         ` Jon Hunter
2020-09-16 15:46           ` Jon Hunter
2020-09-16 15:55           ` Marc Zyngier
2020-09-16 15:55             ` Marc Zyngier
2020-09-16 15:58             ` Jon Hunter
2020-09-16 15:58               ` Jon Hunter
2020-09-16 16:22               ` Marc Zyngier
2020-09-16 16:22                 ` Marc Zyngier
2020-09-16 16:28                 ` Marc Zyngier
2020-09-16 16:28                   ` Marc Zyngier
2020-09-16 19:08                   ` Jon Hunter
2020-09-16 19:08                     ` Jon Hunter
2020-09-16 19:06                 ` Jon Hunter
2020-09-16 19:06                   ` Jon Hunter
2020-09-16 19:26                   ` Mikko Perttunen
2020-09-16 19:26                     ` Mikko Perttunen
2020-09-16 19:39                     ` Jon Hunter
2020-09-16 19:39                       ` Jon Hunter
2020-09-17  7:40         ` Linus Walleij
2020-09-17  7:40           ` Linus Walleij
2020-09-17  7:50           ` Marc Zyngier
2020-09-17  7:50             ` Marc Zyngier
2020-09-17  7:54             ` Jon Hunter
2020-09-17  7:54               ` Jon Hunter
2020-09-17  8:45               ` Marc Zyngier
2020-09-17  8:45                 ` Marc Zyngier
2020-09-17  8:49                 ` Jon Hunter
2020-09-17  8:49                   ` Jon Hunter
2020-09-17  8:54                   ` Marek Szyprowski
2020-09-17  8:54                     ` Marek Szyprowski
2020-09-17  9:09                     ` Jon Hunter
2020-09-17  9:09                       ` Jon Hunter
2020-09-17  9:13                       ` Marek Szyprowski
2020-09-17  9:13                         ` Marek Szyprowski
2020-09-17  9:29                         ` Marc Zyngier
2020-09-17  9:29                           ` Marc Zyngier
2020-09-17 14:53                     ` Jon Hunter
2020-09-17 14:53                       ` Jon Hunter
2020-09-17 18:24                       ` Jon Hunter
2020-09-17 18:24                         ` Jon Hunter
2020-09-18  8:24                         ` Marc Zyngier
2020-09-18  8:24                           ` Marc Zyngier
2020-09-17  8:56                   ` Marc Zyngier
2020-09-17  8:56                     ` Marc Zyngier
2020-09-17 10:11                   ` Linus Walleij
2020-09-17 10:11                     ` Linus Walleij
2020-09-16 14:03   ` Linus Walleij
2020-09-16 14:03     ` Linus Walleij
2020-09-16 14:14     ` Marc Zyngier
2020-09-16 14:14       ` Marc Zyngier
2020-09-18  9:58   ` James Morse
2020-09-18  9:58     ` James Morse
2020-09-18 10:21     ` Marc Zyngier [this message]
2020-09-18 10:21       ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 09/16] irqchip/gic-common: Don't enable SGIs by default Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 10/16] irqchip/bcm2836: Configure mailbox interrupts as standard interrupts Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-14 14:32   ` Marek Szyprowski
2020-09-14 14:32     ` Marek Szyprowski
2020-09-14 16:10     ` Marc Zyngier
2020-09-14 16:10       ` Marc Zyngier
2020-09-14 19:13       ` Marek Szyprowski
2020-09-14 19:13         ` Marek Szyprowski
2020-09-01 14:43 ` [PATCH v3 11/16] irqchip/hip04: Configure IPIs " Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 12/16] irqchip/armada-370-xp: " Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 13/16] arm64: Kill __smp_cross_call and co Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-11 15:06   ` Catalin Marinas
2020-09-11 15:06     ` Catalin Marinas
2020-09-01 14:43 ` [PATCH v3 14/16] arm64: Remove custom IRQ stat accounting Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-11 15:06   ` Catalin Marinas
2020-09-11 15:06     ` Catalin Marinas
2020-09-01 14:43 ` [PATCH v3 15/16] ARM: Kill __smp_cross_call and co Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-01 14:43 ` [PATCH v3 16/16] ARM: Remove custom IRQ stat accounting Marc Zyngier
2020-09-01 14:43   ` Marc Zyngier
2020-09-02  7:41   ` kernel test robot
2020-09-02  7:41     ` kernel test robot
2020-09-02  7:41     ` kernel test robot
2020-09-02 20:20     ` Marc Zyngier
2020-09-02 20:20       ` Marc Zyngier
2020-09-02 20:20       ` Marc Zyngier
2020-09-24  9:00   ` Guillaume Tucker
2020-09-24  9:00     ` Guillaume Tucker
2020-09-24  9:29     ` Marc Zyngier
2020-09-24  9:29       ` Marc Zyngier
2020-09-24 13:09       ` Guillaume Tucker
2020-09-24 13:09         ` Guillaume Tucker
2020-09-28  9:00         ` Guillaume Tucker
2020-09-28  9:00           ` Guillaume Tucker
2020-09-24 13:34     ` Fabio Estevam
2020-09-24 13:34       ` Fabio Estevam
2020-09-24 14:19       ` Guillaume Tucker
2020-09-24 14:19         ` Guillaume Tucker
2020-09-07  6:06 ` [PATCH v3 00/16] arm/arm64: Turning IPIs into normal interrupts hasegawa-hitomi
2020-09-07  6:06   ` hasegawa-hitomi
2020-09-16 16:54 ` Florian Fainelli
2020-09-16 16:54   ` Florian Fainelli

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=87h7rvqta0.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=andrew@lunn.ch \
    --cc=catalin.marinas@arm.com \
    --cc=f.fainelli@gmail.com \
    --cc=gregory.clement@bootlin.com \
    --cc=james.morse@arm.com \
    --cc=jason@lakedaemon.net \
    --cc=jonathanh@nvidia.com \
    --cc=kernel-team@android.com \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@arm.linux.org.uk \
    --cc=saravanak@google.com \
    --cc=sumit.garg@linaro.org \
    --cc=tglx@linutronix.de \
    --cc=valentin.schneider@arm.com \
    --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 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.