From: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
To: "Benoît Monin" <benoit.monin@bootlin.com>
Cc: "Daniel Lezcano" <daniel.lezcano@kernel.org>,
"Thomas Gleixner" <tglx@kernel.org>,
"Dragan Mladjenovic" <dragan.mladjenovic@syrmia.com>,
"Chao-ying Fu" <cfu@wavecomp.com>,
"Aleksandar Rikalo" <arikalo@gmail.com>,
"Paul Burton" <paulburton@kernel.org>,
"Radu Rendec" <radu@rendec.net>,
"Vladimir Kondratiev" <vladimir.kondratiev@mobileye.com>,
"Tawfik Bayouk" <tawfik.bayouk@mobileye.com>,
"Gregory CLEMENT" <gregory.clement@bootlin.com>,
"Théo Lebrun" <theo.lebrun@bootlin.com>,
"Thomas Petazzoni" <thomas.petazzoni@bootlin.com>,
linux-mips@vger.kernel.org, linux-kernel@vger.kernel.org
Subject: Re: [PATCH v3 2/5] irqchip/mips-gic: Fix recursive acquisition of gic_lock in gic_set_affinity()
Date: Mon, 28 Sep 2026 10:22:07 +0200 [thread overview]
Message-ID: <arojr46BtH7FEQOS@alpha.franken.de> (raw)
In-Reply-To: <20260907-sync-gic-counters-v3-2-3d891ddabdaf@bootlin.com>
On Mon, Sep 07, 2026 at 02:46:36PM +0200, Benoît Monin wrote:
> Commit 322a90638768 ("irqchip/mips-gic: Multi-cluster support")
> made gic_set_affinity() call gic_set_type() when an interrupt's
> affinity is moved between clusters. gic_set_type() takes gic_lock with
> raw_spin_lock_irqsave(), but gic_set_affinity() holds gic_lock at that
> point, so the same raw spinlock is acquired twice, triggering a deadlock.
>
> Split gic_set_type() into a gic_set_type_locked() helper that assumes
> gic_lock is already held. gic_set_type() takes gic_lock and calls the
> helper, and gic_set_affinity() calls gic_set_type_locked() directly,
> since it already holds gic_lock.
>
> Fixes: 322a90638768 ("irqchip/mips-gic: Multi-cluster support")
> Signed-off-by: Benoît Monin <benoit.monin@bootlin.com>
> ---
> drivers/irqchip/irq-mips-gic.c | 15 ++++++++++-----
> 1 file changed, 10 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/irqchip/irq-mips-gic.c b/drivers/irqchip/irq-mips-gic.c
> index 3b31cbcbed6f..f2ae60d39d66 100644
> --- a/drivers/irqchip/irq-mips-gic.c
> +++ b/drivers/irqchip/irq-mips-gic.c
> @@ -297,14 +297,14 @@ static void gic_ack_irq(struct irq_data *d)
> }
> }
>
> -static int gic_set_type(struct irq_data *d, unsigned int type)
> +static int gic_set_type_locked(struct irq_data *d, unsigned int type)
> {
> unsigned int irq, pol, trig, dual;
> - unsigned long flags;
> +
> + lockdep_assert_held(&gic_lock);
>
> irq = GIC_HWIRQ_TO_SHARED(d->hwirq);
>
> - raw_spin_lock_irqsave(&gic_lock, flags);
> switch (type & IRQ_TYPE_SENSE_MASK) {
> case IRQ_TYPE_EDGE_FALLING:
> pol = GIC_POL_FALLING_EDGE;
> @@ -351,11 +351,16 @@ static int gic_set_type(struct irq_data *d, unsigned int type)
> else
> irq_set_chip_handler_name_locked(d, &gic_level_irq_controller,
> handle_level_irq, NULL);
> - raw_spin_unlock_irqrestore(&gic_lock, flags);
>
> return 0;
> }
>
> +static int gic_set_type(struct irq_data *d, unsigned int type)
> +{
> + guard(raw_spinlock_irqsave)(&gic_lock);
> + return gic_set_type_locked(d, type);
> +}
> +
> #ifdef CONFIG_SMP
> static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
> bool force)
> @@ -407,7 +412,7 @@ static int gic_set_affinity(struct irq_data *d, const struct cpumask *cpumask,
> * trigger type in the new cluster.
> */
> if (cl != old_cl)
> - gic_set_type(d, irqd_get_trigger_type(d));
> + gic_set_type_locked(d, irqd_get_trigger_type(d));
>
> /* Route the interrupt to its new VP(E) */
> if (gic_irq_lock_cluster(d)) {
>
> --
> 2.55.0
Reviewed-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
--
Crap can work. Given enough thrust pigs will fly, but it's not necessarily a
good idea. [ RFC1925, 2.3 ]
next prev parent reply other threads:[~2026-09-28 8:38 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-07 12:46 [PATCH v3 0/5] MIPS: GIC clocksource/irqchip improvements and fixes for multi-cluster systems Benoît Monin
2026-09-07 12:46 ` [PATCH v3 1/5] irqchip/mips-gic: Fix unbalanced cm_core_lock in for_each_online_cpu_gic() Benoît Monin
2026-09-28 8:17 ` Thomas Bogendoerfer
2026-09-07 12:46 ` [PATCH v3 2/5] irqchip/mips-gic: Fix recursive acquisition of gic_lock in gic_set_affinity() Benoît Monin
2026-09-28 8:22 ` Thomas Bogendoerfer [this message]
2026-09-07 12:46 ` [PATCH v3 3/5] irqchip/mips-gic: Enable interrupt when moving affinity across clusters Benoît Monin
2026-09-28 8:35 ` Thomas Bogendoerfer
2026-09-28 13:21 ` Benoît Monin
2026-09-07 12:46 ` [PATCH v3 4/5] clocksource: mips-gic-timer: Simplify gic_next_event() for per-cpu timer Benoît Monin
2026-09-28 9:29 ` Thomas Bogendoerfer
2026-09-07 12:46 ` [PATCH v3 5/5] clocksource: mips-gic-timer: Use local counter on synced multi-cluster systems Benoît Monin
2026-09-28 10:26 ` Thomas Bogendoerfer
2026-09-28 14:56 ` Benoît Monin
2026-09-19 21:26 ` [PATCH v3 0/5] MIPS: GIC clocksource/irqchip improvements and fixes for " Thomas Gleixner
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=arojr46BtH7FEQOS@alpha.franken.de \
--to=tsbogend@alpha.franken.de \
--cc=arikalo@gmail.com \
--cc=benoit.monin@bootlin.com \
--cc=cfu@wavecomp.com \
--cc=daniel.lezcano@kernel.org \
--cc=dragan.mladjenovic@syrmia.com \
--cc=gregory.clement@bootlin.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mips@vger.kernel.org \
--cc=paulburton@kernel.org \
--cc=radu@rendec.net \
--cc=tawfik.bayouk@mobileye.com \
--cc=tglx@kernel.org \
--cc=theo.lebrun@bootlin.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.kondratiev@mobileye.com \
/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.