* [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
@ 2026-01-26 9:42 Xuewen Yan
2026-01-26 9:50 ` Sebastian Andrzej Siewior
` (2 more replies)
0 siblings, 3 replies; 7+ messages in thread
From: Xuewen Yan @ 2026-01-26 9:42 UTC (permalink / raw)
To: linusw, brgl, orsonzhai, baolin.wang, zhang.lyra
Cc: bigeasy, clrkwllms, rostedt, linux-gpio, linux-kernel,
linux-rt-devel, ke.wang, wenhua.lin, xuewen.yan94
There was a lockdep warning in sprd_gpio:
[ 6.258269][T329@C6] [ BUG: Invalid wait context ]
[ 6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G W OE
[ 6.258272][T329@C6] -----------------------------
[ 6.258273][T329@C6] modprobe/329 is trying to lock:
[ 6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
[ 6.258282][T329@C6] other info that might help us debug this:
[ 6.258283][T329@C6] context-{5:5}
[ 6.258285][T329@C6] 3 locks held by modprobe/329:
[ 6.258286][T329@C6] #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
[ 6.258295][T329@C6] #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
[ 6.258304][T329@C6] #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
[ 6.258313][T329@C6] stack backtrace:
[ 6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G W OE 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT 3ad5b0f45741a16e5838da790706e16ceb6717df
[ 6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
[ 6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
[ 6.258318][T329@C6] Call trace:
[ 6.258318][T329@C6] show_stack+0x20/0x30 (C)
[ 6.258321][T329@C6] __dump_stack+0x28/0x3c
[ 6.258324][T329@C6] dump_stack_lvl+0xac/0xf0
[ 6.258326][T329@C6] dump_stack+0x18/0x3c
[ 6.258329][T329@C6] __lock_acquire+0x824/0x2c28
[ 6.258331][T329@C6] lock_acquire+0x148/0x2cc
[ 6.258333][T329@C6] _raw_spin_lock_irqsave+0x6c/0xb4
[ 6.258334][T329@C6] sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
[ 6.258337][T329@C6] irq_startup+0x238/0x350
[ 6.258340][T329@C6] __setup_irq+0x504/0x82c
[ 6.258342][T329@C6] request_threaded_irq+0x118/0x184
[ 6.258344][T329@C6] devm_request_threaded_irq+0x94/0x120
[ 6.258347][T329@C6] sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
[ 6.258352][T329@C6] sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
[ 6.258358][T329@C6] i2c_device_probe+0x2c8/0x350
[ 6.258361][T329@C6] really_probe+0x1a8/0x46c
[ 6.258363][T329@C6] __driver_probe_device+0xa4/0x10c
[ 6.258366][T329@C6] driver_probe_device+0x44/0x1b4
[ 6.258369][T329@C6] __driver_attach+0xd0/0x204
[ 6.258371][T329@C6] bus_for_each_dev+0x10c/0x168
[ 6.258373][T329@C6] driver_attach+0x2c/0x3c
[ 6.258376][T329@C6] bus_add_driver+0x154/0x29c
[ 6.258378][T329@C6] driver_register+0x70/0x10c
[ 6.258381][T329@C6] i2c_register_driver+0x48/0xc8
[ 6.258384][T329@C6] init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
[ 6.258389][T329@C6] do_one_initcall+0x128/0x42c
[ 6.258392][T329@C6] do_init_module+0x60/0x254
[ 6.258395][T329@C6] load_module+0x1054/0x1220
[ 6.258397][T329@C6] __arm64_sys_finit_module+0x240/0x35c
[ 6.258400][T329@C6] invoke_syscall+0x60/0xec
[ 6.258402][T329@C6] el0_svc_common+0xb0/0xe4
[ 6.258405][T329@C6] do_el0_svc+0x24/0x30
[ 6.258407][T329@C6] el0_svc+0x54/0x1c4
[ 6.258409][T329@C6] el0t_64_sync_handler+0x68/0xdc
[ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
however the sprd_gpio->lock would use in hard-irq, this is unsafe.
So change the spin_lock to raw_spin_lock to use the spinlock
in hard-irq.
Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
---
drivers/gpio/gpio-sprd.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/drivers/gpio/gpio-sprd.c b/drivers/gpio/gpio-sprd.c
index 413bcd0a4240..2cc8abe705cd 100644
--- a/drivers/gpio/gpio-sprd.c
+++ b/drivers/gpio/gpio-sprd.c
@@ -35,7 +35,7 @@
struct sprd_gpio {
struct gpio_chip chip;
void __iomem *base;
- spinlock_t lock;
+ raw_spinlock_t lock;
int irq;
};
@@ -54,7 +54,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
unsigned long flags;
u32 tmp;
- spin_lock_irqsave(&sprd_gpio->lock, flags);
+ raw_spin_lock_irqsave(&sprd_gpio->lock, flags);
tmp = readl_relaxed(base + reg);
if (val)
@@ -63,7 +63,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
tmp &= ~BIT(SPRD_GPIO_BIT(offset));
writel_relaxed(tmp, base + reg);
- spin_unlock_irqrestore(&sprd_gpio->lock, flags);
+ raw_spin_unlock_irqrestore(&sprd_gpio->lock, flags);
}
static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg)
@@ -236,7 +236,7 @@ static int sprd_gpio_probe(struct platform_device *pdev)
if (IS_ERR(sprd_gpio->base))
return PTR_ERR(sprd_gpio->base);
- spin_lock_init(&sprd_gpio->lock);
+ raw_spin_lock_init(&sprd_gpio->lock);
sprd_gpio->chip.label = dev_name(&pdev->dev);
sprd_gpio->chip.ngpio = SPRD_GPIO_NR;
--
2.25.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
2026-01-26 9:42 [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock Xuewen Yan
@ 2026-01-26 9:50 ` Sebastian Andrzej Siewior
2026-01-27 9:07 ` Bartosz Golaszewski
2026-01-26 9:52 ` Baolin Wang
2026-01-27 9:09 ` Bartosz Golaszewski
2 siblings, 1 reply; 7+ messages in thread
From: Sebastian Andrzej Siewior @ 2026-01-26 9:50 UTC (permalink / raw)
To: Xuewen Yan
Cc: linusw, brgl, orsonzhai, baolin.wang, zhang.lyra, clrkwllms,
rostedt, linux-gpio, linux-kernel, linux-rt-devel, ke.wang,
wenhua.lin, xuewen.yan94
On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
> There was a lockdep warning in sprd_gpio:
>
> [ 6.258269][T329@C6] [ BUG: Invalid wait context ]
> [ 6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G W OE
> [ 6.258272][T329@C6] -----------------------------
> [ 6.258273][T329@C6] modprobe/329 is trying to lock:
> [ 6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> [ 6.258282][T329@C6] other info that might help us debug this:
> [ 6.258283][T329@C6] context-{5:5}
> [ 6.258285][T329@C6] 3 locks held by modprobe/329:
> [ 6.258286][T329@C6] #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> [ 6.258295][T329@C6] #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> [ 6.258304][T329@C6] #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> [ 6.258313][T329@C6] stack backtrace:
> [ 6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G W OE 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT 3ad5b0f45741a16e5838da790706e16ceb6717df
> [ 6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [ 6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> [ 6.258318][T329@C6] Call trace:
> [ 6.258318][T329@C6] show_stack+0x20/0x30 (C)
> [ 6.258321][T329@C6] __dump_stack+0x28/0x3c
> [ 6.258324][T329@C6] dump_stack_lvl+0xac/0xf0
> [ 6.258326][T329@C6] dump_stack+0x18/0x3c
> [ 6.258329][T329@C6] __lock_acquire+0x824/0x2c28
> [ 6.258331][T329@C6] lock_acquire+0x148/0x2cc
> [ 6.258333][T329@C6] _raw_spin_lock_irqsave+0x6c/0xb4
> [ 6.258334][T329@C6] sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> [ 6.258337][T329@C6] irq_startup+0x238/0x350
> [ 6.258340][T329@C6] __setup_irq+0x504/0x82c
> [ 6.258342][T329@C6] request_threaded_irq+0x118/0x184
> [ 6.258344][T329@C6] devm_request_threaded_irq+0x94/0x120
> [ 6.258347][T329@C6] sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258352][T329@C6] sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258358][T329@C6] i2c_device_probe+0x2c8/0x350
> [ 6.258361][T329@C6] really_probe+0x1a8/0x46c
> [ 6.258363][T329@C6] __driver_probe_device+0xa4/0x10c
> [ 6.258366][T329@C6] driver_probe_device+0x44/0x1b4
> [ 6.258369][T329@C6] __driver_attach+0xd0/0x204
> [ 6.258371][T329@C6] bus_for_each_dev+0x10c/0x168
> [ 6.258373][T329@C6] driver_attach+0x2c/0x3c
> [ 6.258376][T329@C6] bus_add_driver+0x154/0x29c
> [ 6.258378][T329@C6] driver_register+0x70/0x10c
> [ 6.258381][T329@C6] i2c_register_driver+0x48/0xc8
> [ 6.258384][T329@C6] init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258389][T329@C6] do_one_initcall+0x128/0x42c
> [ 6.258392][T329@C6] do_init_module+0x60/0x254
> [ 6.258395][T329@C6] load_module+0x1054/0x1220
> [ 6.258397][T329@C6] __arm64_sys_finit_module+0x240/0x35c
> [ 6.258400][T329@C6] invoke_syscall+0x60/0xec
> [ 6.258402][T329@C6] el0_svc_common+0xb0/0xe4
> [ 6.258405][T329@C6] do_el0_svc+0x24/0x30
> [ 6.258407][T329@C6] el0_svc+0x54/0x1c4
> [ 6.258409][T329@C6] el0t_64_sync_handler+0x68/0xdc
> [ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
This could be reduced to "BUG: Invalid wait context". The other bits
provide to added value.
> This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> however the sprd_gpio->lock would use in hard-irq, this is unsafe.
>
> So change the spin_lock to raw_spin_lock to use the spinlock
spinlock_t to raw_spinlock_t
> in hard-irq.
>
> Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
Other than that
Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
2026-01-26 9:42 [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock Xuewen Yan
2026-01-26 9:50 ` Sebastian Andrzej Siewior
@ 2026-01-26 9:52 ` Baolin Wang
2026-01-27 9:09 ` Bartosz Golaszewski
2 siblings, 0 replies; 7+ messages in thread
From: Baolin Wang @ 2026-01-26 9:52 UTC (permalink / raw)
To: Xuewen Yan, linusw, brgl, orsonzhai, zhang.lyra
Cc: bigeasy, clrkwllms, rostedt, linux-gpio, linux-kernel,
linux-rt-devel, ke.wang, wenhua.lin, xuewen.yan94
On 1/26/26 5:42 PM, Xuewen Yan wrote:
> There was a lockdep warning in sprd_gpio:
>
> [ 6.258269][T329@C6] [ BUG: Invalid wait context ]
> [ 6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G W OE
> [ 6.258272][T329@C6] -----------------------------
> [ 6.258273][T329@C6] modprobe/329 is trying to lock:
> [ 6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> [ 6.258282][T329@C6] other info that might help us debug this:
> [ 6.258283][T329@C6] context-{5:5}
> [ 6.258285][T329@C6] 3 locks held by modprobe/329:
> [ 6.258286][T329@C6] #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> [ 6.258295][T329@C6] #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> [ 6.258304][T329@C6] #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> [ 6.258313][T329@C6] stack backtrace:
> [ 6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G W OE 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT 3ad5b0f45741a16e5838da790706e16ceb6717df
> [ 6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [ 6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> [ 6.258318][T329@C6] Call trace:
> [ 6.258318][T329@C6] show_stack+0x20/0x30 (C)
> [ 6.258321][T329@C6] __dump_stack+0x28/0x3c
> [ 6.258324][T329@C6] dump_stack_lvl+0xac/0xf0
> [ 6.258326][T329@C6] dump_stack+0x18/0x3c
> [ 6.258329][T329@C6] __lock_acquire+0x824/0x2c28
> [ 6.258331][T329@C6] lock_acquire+0x148/0x2cc
> [ 6.258333][T329@C6] _raw_spin_lock_irqsave+0x6c/0xb4
> [ 6.258334][T329@C6] sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> [ 6.258337][T329@C6] irq_startup+0x238/0x350
> [ 6.258340][T329@C6] __setup_irq+0x504/0x82c
> [ 6.258342][T329@C6] request_threaded_irq+0x118/0x184
> [ 6.258344][T329@C6] devm_request_threaded_irq+0x94/0x120
> [ 6.258347][T329@C6] sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258352][T329@C6] sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258358][T329@C6] i2c_device_probe+0x2c8/0x350
> [ 6.258361][T329@C6] really_probe+0x1a8/0x46c
> [ 6.258363][T329@C6] __driver_probe_device+0xa4/0x10c
> [ 6.258366][T329@C6] driver_probe_device+0x44/0x1b4
> [ 6.258369][T329@C6] __driver_attach+0xd0/0x204
> [ 6.258371][T329@C6] bus_for_each_dev+0x10c/0x168
> [ 6.258373][T329@C6] driver_attach+0x2c/0x3c
> [ 6.258376][T329@C6] bus_add_driver+0x154/0x29c
> [ 6.258378][T329@C6] driver_register+0x70/0x10c
> [ 6.258381][T329@C6] i2c_register_driver+0x48/0xc8
> [ 6.258384][T329@C6] init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258389][T329@C6] do_one_initcall+0x128/0x42c
> [ 6.258392][T329@C6] do_init_module+0x60/0x254
> [ 6.258395][T329@C6] load_module+0x1054/0x1220
> [ 6.258397][T329@C6] __arm64_sys_finit_module+0x240/0x35c
> [ 6.258400][T329@C6] invoke_syscall+0x60/0xec
> [ 6.258402][T329@C6] el0_svc_common+0xb0/0xe4
> [ 6.258405][T329@C6] do_el0_svc+0x24/0x30
> [ 6.258407][T329@C6] el0_svc+0x54/0x1c4
> [ 6.258409][T329@C6] el0t_64_sync_handler+0x68/0xdc
> [ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
>
> This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> however the sprd_gpio->lock would use in hard-irq, this is unsafe.
>
> So change the spin_lock to raw_spin_lock to use the spinlock
> in hard-irq.
>
> Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
LGTM. Thanks.
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
> ---
> drivers/gpio/gpio-sprd.c | 8 ++++----
> 1 file changed, 4 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpio/gpio-sprd.c b/drivers/gpio/gpio-sprd.c
> index 413bcd0a4240..2cc8abe705cd 100644
> --- a/drivers/gpio/gpio-sprd.c
> +++ b/drivers/gpio/gpio-sprd.c
> @@ -35,7 +35,7 @@
> struct sprd_gpio {
> struct gpio_chip chip;
> void __iomem *base;
> - spinlock_t lock;
> + raw_spinlock_t lock;
> int irq;
> };
>
> @@ -54,7 +54,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
> unsigned long flags;
> u32 tmp;
>
> - spin_lock_irqsave(&sprd_gpio->lock, flags);
> + raw_spin_lock_irqsave(&sprd_gpio->lock, flags);
> tmp = readl_relaxed(base + reg);
>
> if (val)
> @@ -63,7 +63,7 @@ static void sprd_gpio_update(struct gpio_chip *chip, unsigned int offset,
> tmp &= ~BIT(SPRD_GPIO_BIT(offset));
>
> writel_relaxed(tmp, base + reg);
> - spin_unlock_irqrestore(&sprd_gpio->lock, flags);
> + raw_spin_unlock_irqrestore(&sprd_gpio->lock, flags);
> }
>
> static int sprd_gpio_read(struct gpio_chip *chip, unsigned int offset, u16 reg)
> @@ -236,7 +236,7 @@ static int sprd_gpio_probe(struct platform_device *pdev)
> if (IS_ERR(sprd_gpio->base))
> return PTR_ERR(sprd_gpio->base);
>
> - spin_lock_init(&sprd_gpio->lock);
> + raw_spin_lock_init(&sprd_gpio->lock);
>
> sprd_gpio->chip.label = dev_name(&pdev->dev);
> sprd_gpio->chip.ngpio = SPRD_GPIO_NR;
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
2026-01-26 9:50 ` Sebastian Andrzej Siewior
@ 2026-01-27 9:07 ` Bartosz Golaszewski
2026-01-27 19:36 ` Andy Shevchenko
0 siblings, 1 reply; 7+ messages in thread
From: Bartosz Golaszewski @ 2026-01-27 9:07 UTC (permalink / raw)
To: Sebastian Andrzej Siewior
Cc: Xuewen Yan, linusw, orsonzhai, baolin.wang, zhang.lyra, clrkwllms,
rostedt, linux-gpio, linux-kernel, linux-rt-devel, ke.wang,
wenhua.lin, xuewen.yan94
On Mon, Jan 26, 2026 at 10:50 AM Sebastian Andrzej Siewior
<bigeasy@linutronix.de> wrote:
>
> On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
> > There was a lockdep warning in sprd_gpio:
> >
> > [ 6.258269][T329@C6] [ BUG: Invalid wait context ]
> > [ 6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G W OE
> > [ 6.258272][T329@C6] -----------------------------
> > [ 6.258273][T329@C6] modprobe/329 is trying to lock:
> > [ 6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> > [ 6.258282][T329@C6] other info that might help us debug this:
> > [ 6.258283][T329@C6] context-{5:5}
> > [ 6.258285][T329@C6] 3 locks held by modprobe/329:
> > [ 6.258286][T329@C6] #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> > [ 6.258295][T329@C6] #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> > [ 6.258304][T329@C6] #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> > [ 6.258313][T329@C6] stack backtrace:
> > [ 6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G W OE 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT 3ad5b0f45741a16e5838da790706e16ceb6717df
> > [ 6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> > [ 6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> > [ 6.258318][T329@C6] Call trace:
> > [ 6.258318][T329@C6] show_stack+0x20/0x30 (C)
> > [ 6.258321][T329@C6] __dump_stack+0x28/0x3c
> > [ 6.258324][T329@C6] dump_stack_lvl+0xac/0xf0
> > [ 6.258326][T329@C6] dump_stack+0x18/0x3c
> > [ 6.258329][T329@C6] __lock_acquire+0x824/0x2c28
> > [ 6.258331][T329@C6] lock_acquire+0x148/0x2cc
> > [ 6.258333][T329@C6] _raw_spin_lock_irqsave+0x6c/0xb4
> > [ 6.258334][T329@C6] sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> > [ 6.258337][T329@C6] irq_startup+0x238/0x350
> > [ 6.258340][T329@C6] __setup_irq+0x504/0x82c
> > [ 6.258342][T329@C6] request_threaded_irq+0x118/0x184
> > [ 6.258344][T329@C6] devm_request_threaded_irq+0x94/0x120
> > [ 6.258347][T329@C6] sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> > [ 6.258352][T329@C6] sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> > [ 6.258358][T329@C6] i2c_device_probe+0x2c8/0x350
> > [ 6.258361][T329@C6] really_probe+0x1a8/0x46c
> > [ 6.258363][T329@C6] __driver_probe_device+0xa4/0x10c
> > [ 6.258366][T329@C6] driver_probe_device+0x44/0x1b4
> > [ 6.258369][T329@C6] __driver_attach+0xd0/0x204
> > [ 6.258371][T329@C6] bus_for_each_dev+0x10c/0x168
> > [ 6.258373][T329@C6] driver_attach+0x2c/0x3c
> > [ 6.258376][T329@C6] bus_add_driver+0x154/0x29c
> > [ 6.258378][T329@C6] driver_register+0x70/0x10c
> > [ 6.258381][T329@C6] i2c_register_driver+0x48/0xc8
> > [ 6.258384][T329@C6] init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> > [ 6.258389][T329@C6] do_one_initcall+0x128/0x42c
> > [ 6.258392][T329@C6] do_init_module+0x60/0x254
> > [ 6.258395][T329@C6] load_module+0x1054/0x1220
> > [ 6.258397][T329@C6] __arm64_sys_finit_module+0x240/0x35c
> > [ 6.258400][T329@C6] invoke_syscall+0x60/0xec
> > [ 6.258402][T329@C6] el0_svc_common+0xb0/0xe4
> > [ 6.258405][T329@C6] do_el0_svc+0x24/0x30
> > [ 6.258407][T329@C6] el0_svc+0x54/0x1c4
> > [ 6.258409][T329@C6] el0t_64_sync_handler+0x68/0xdc
> > [ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
>
> This could be reduced to "BUG: Invalid wait context". The other bits
> provide to added value.
>
> > This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> > however the sprd_gpio->lock would use in hard-irq, this is unsafe.
> >
> > So change the spin_lock to raw_spin_lock to use the spinlock
>
> spinlock_t to raw_spinlock_t
>
I fixed this in git.
Bart
> > in hard-irq.
> >
> > Signed-off-by: Xuewen Yan <xuewen.yan@unisoc.com>
>
> Other than that
> Reviewed-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
>
> Sebastian
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
2026-01-26 9:42 [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock Xuewen Yan
2026-01-26 9:50 ` Sebastian Andrzej Siewior
2026-01-26 9:52 ` Baolin Wang
@ 2026-01-27 9:09 ` Bartosz Golaszewski
2 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2026-01-27 9:09 UTC (permalink / raw)
To: linusw, brgl, orsonzhai, baolin.wang, zhang.lyra, Xuewen Yan
Cc: Bartosz Golaszewski, bigeasy, clrkwllms, rostedt, linux-gpio,
linux-kernel, linux-rt-devel, ke.wang, wenhua.lin, xuewen.yan94
On Mon, 26 Jan 2026 17:42:09 +0800, Xuewen Yan wrote:
> There was a lockdep warning in sprd_gpio:
>
> [ 6.258269][T329@C6] [ BUG: Invalid wait context ]
> [ 6.258270][T329@C6] 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 Tainted: G W OE
> [ 6.258272][T329@C6] -----------------------------
> [ 6.258273][T329@C6] modprobe/329 is trying to lock:
> [ 6.258275][T329@C6] ffffff8081c91690 (&sprd_gpio->lock){....}-{3:3}, at: sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd]
> [ 6.258282][T329@C6] other info that might help us debug this:
> [ 6.258283][T329@C6] context-{5:5}
> [ 6.258285][T329@C6] 3 locks held by modprobe/329:
> [ 6.258286][T329@C6] #0: ffffff808baca108 (&dev->mutex){....}-{4:4}, at: __driver_attach+0xc4/0x204
> [ 6.258295][T329@C6] #1: ffffff80965e7240 (request_class#4){+.+.}-{4:4}, at: __setup_irq+0x1cc/0x82c
> [ 6.258304][T329@C6] #2: ffffff80965e70c8 (lock_class#4){....}-{2:2}, at: __setup_irq+0x21c/0x82c
> [ 6.258313][T329@C6] stack backtrace:
> [ 6.258314][T329@C6] CPU: 6 UID: 0 PID: 329 Comm: modprobe Tainted: G W OE 6.18.0-android17-0-g30527ad7aaae-ab00009-4k #1 PREEMPT 3ad5b0f45741a16e5838da790706e16ceb6717df
> [ 6.258316][T329@C6] Tainted: [W]=WARN, [O]=OOT_MODULE, [E]=UNSIGNED_MODULE
> [ 6.258317][T329@C6] Hardware name: Unisoc UMS9632-base Board (DT)
> [ 6.258318][T329@C6] Call trace:
> [ 6.258318][T329@C6] show_stack+0x20/0x30 (C)
> [ 6.258321][T329@C6] __dump_stack+0x28/0x3c
> [ 6.258324][T329@C6] dump_stack_lvl+0xac/0xf0
> [ 6.258326][T329@C6] dump_stack+0x18/0x3c
> [ 6.258329][T329@C6] __lock_acquire+0x824/0x2c28
> [ 6.258331][T329@C6] lock_acquire+0x148/0x2cc
> [ 6.258333][T329@C6] _raw_spin_lock_irqsave+0x6c/0xb4
> [ 6.258334][T329@C6] sprd_gpio_irq_unmask+0x4c/0xa4 [gpio_sprd 814535e93c6d8e0853c45c02eab0fa88a9da6487]
> [ 6.258337][T329@C6] irq_startup+0x238/0x350
> [ 6.258340][T329@C6] __setup_irq+0x504/0x82c
> [ 6.258342][T329@C6] request_threaded_irq+0x118/0x184
> [ 6.258344][T329@C6] devm_request_threaded_irq+0x94/0x120
> [ 6.258347][T329@C6] sc8546_init_irq+0x114/0x170 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258352][T329@C6] sc8546_charger_probe+0x53c/0x5a0 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258358][T329@C6] i2c_device_probe+0x2c8/0x350
> [ 6.258361][T329@C6] really_probe+0x1a8/0x46c
> [ 6.258363][T329@C6] __driver_probe_device+0xa4/0x10c
> [ 6.258366][T329@C6] driver_probe_device+0x44/0x1b4
> [ 6.258369][T329@C6] __driver_attach+0xd0/0x204
> [ 6.258371][T329@C6] bus_for_each_dev+0x10c/0x168
> [ 6.258373][T329@C6] driver_attach+0x2c/0x3c
> [ 6.258376][T329@C6] bus_add_driver+0x154/0x29c
> [ 6.258378][T329@C6] driver_register+0x70/0x10c
> [ 6.258381][T329@C6] i2c_register_driver+0x48/0xc8
> [ 6.258384][T329@C6] init_module+0x28/0xfd8 [sc8546_charger 223586ccafc27439f7db4f95b0c8e6e882349a99]
> [ 6.258389][T329@C6] do_one_initcall+0x128/0x42c
> [ 6.258392][T329@C6] do_init_module+0x60/0x254
> [ 6.258395][T329@C6] load_module+0x1054/0x1220
> [ 6.258397][T329@C6] __arm64_sys_finit_module+0x240/0x35c
> [ 6.258400][T329@C6] invoke_syscall+0x60/0xec
> [ 6.258402][T329@C6] el0_svc_common+0xb0/0xe4
> [ 6.258405][T329@C6] do_el0_svc+0x24/0x30
> [ 6.258407][T329@C6] el0_svc+0x54/0x1c4
> [ 6.258409][T329@C6] el0t_64_sync_handler+0x68/0xdc
> [ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
>
> [...]
Applied, thanks!
[1/1] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
commit: 62c7b1d6aa8b287c7554dd9abd3503fe4883e50e
Best regards,
--
Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
2026-01-27 9:07 ` Bartosz Golaszewski
@ 2026-01-27 19:36 ` Andy Shevchenko
2026-01-28 9:10 ` Bartosz Golaszewski
0 siblings, 1 reply; 7+ messages in thread
From: Andy Shevchenko @ 2026-01-27 19:36 UTC (permalink / raw)
To: Bartosz Golaszewski
Cc: Sebastian Andrzej Siewior, Xuewen Yan, linusw, orsonzhai,
baolin.wang, zhang.lyra, clrkwllms, rostedt, linux-gpio,
linux-kernel, linux-rt-devel, ke.wang, wenhua.lin, xuewen.yan94
On Tue, Jan 27, 2026 at 10:07:01AM +0100, Bartosz Golaszewski wrote:
> On Mon, Jan 26, 2026 at 10:50 AM Sebastian Andrzej Siewior
> <bigeasy@linutronix.de> wrote:
> > On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
...
> > > There was a lockdep warning in sprd_gpio:
> > > [ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
> >
> > This could be reduced to "BUG: Invalid wait context". The other bits
> > provide to added value.
> >
> > > This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
> > > however the sprd_gpio->lock would use in hard-irq, this is unsafe.
> > >
> > > So change the spin_lock to raw_spin_lock to use the spinlock
> >
> > spinlock_t to raw_spinlock_t
>
> I fixed this in git.
Not sure if you noticed the above comment by Sebastian and it's actually
documented in Submitting Patches that backtraces should only carry the
necessary information, so usually ~3-5 lines is enough and not two full pages
like in the commit as I see in the repository.
> Bart
>
> > > in hard-irq.
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 7+ messages in thread
* Re: [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock
2026-01-27 19:36 ` Andy Shevchenko
@ 2026-01-28 9:10 ` Bartosz Golaszewski
0 siblings, 0 replies; 7+ messages in thread
From: Bartosz Golaszewski @ 2026-01-28 9:10 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Sebastian Andrzej Siewior, Xuewen Yan, linusw, orsonzhai,
baolin.wang, zhang.lyra, clrkwllms, rostedt, linux-gpio,
linux-kernel, linux-rt-devel, ke.wang, wenhua.lin, xuewen.yan94,
Bartosz Golaszewski
On Tue, 27 Jan 2026 20:36:16 +0100, Andy Shevchenko
<andriy.shevchenko@intel.com> said:
> On Tue, Jan 27, 2026 at 10:07:01AM +0100, Bartosz Golaszewski wrote:
>> On Mon, Jan 26, 2026 at 10:50 AM Sebastian Andrzej Siewior
>> <bigeasy@linutronix.de> wrote:
>> > On 2026-01-26 17:42:09 [+0800], Xuewen Yan wrote:
>
> ...
>
>> > > There was a lockdep warning in sprd_gpio:
>
>> > > [ 6.258411][T329@C6] el0t_64_sync+0x1c4/0x1c8
>> >
>> > This could be reduced to "BUG: Invalid wait context". The other bits
>> > provide to added value.
>> >
>> > > This is because the spin_lock would change to rt_mutex in PREEMPT_RT,
>> > > however the sprd_gpio->lock would use in hard-irq, this is unsafe.
>> > >
>> > > So change the spin_lock to raw_spin_lock to use the spinlock
>> >
>> > spinlock_t to raw_spinlock_t
>>
>> I fixed this in git.
>
> Not sure if you noticed the above comment by Sebastian and it's actually
> documented in Submitting Patches that backtraces should only carry the
> necessary information, so usually ~3-5 lines is enough and not two full pages
> like in the commit as I see in the repository.
>
Noted for the future, thanks.
Bartosz
^ permalink raw reply [flat|nested] 7+ messages in thread
end of thread, other threads:[~2026-01-28 9:10 UTC | newest]
Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-01-26 9:42 [PATCH] gpio: sprd: Change sprd_gpio lock to raw_spin_lock Xuewen Yan
2026-01-26 9:50 ` Sebastian Andrzej Siewior
2026-01-27 9:07 ` Bartosz Golaszewski
2026-01-27 19:36 ` Andy Shevchenko
2026-01-28 9:10 ` Bartosz Golaszewski
2026-01-26 9:52 ` Baolin Wang
2026-01-27 9:09 ` Bartosz Golaszewski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox