public inbox for linux-gpio@vger.kernel.org
 help / color / mirror / Atom feed
* [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