drivers/gpio/gpio-sprd.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
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
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>
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;
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
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
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
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
© 2016 - 2026 Red Hat, Inc.