[<prev] [next>] [day] [month] [year] [list]
Message-ID: <CAMVG2svCF06KF0e8MDCVGGjxP-FM16UE1Fip-toHUcVs-kqBQA@mail.gmail.com>
Date: Sun, 28 Dec 2025 15:18:09 +0800
From: Daniel J Blueman <daniel@...ra.org>
To: Linus Walleij <linusw@...nel.org>, Bartosz Golaszewski <brgl@...nel.org>, linux-gpio@...r.kernel.org
Cc: Linux Kernel <linux-kernel@...r.kernel.org>
Subject: [6.19-rc2 arm64] sleeping while atomic in gpiod_configure_flags
Hi Linus, Bartosz et al,
When booting 6.19-rc2 [1, 2] with lockdep enabled on a Qualcomm X1
Lenovo Slim7x ARM64 laptop, I am seeing mutex usage while atomic
during gpiod driver registration:
BUG: sleeping function called from invalid context at kernel/locking/mutex.c:591
in_atomic(): 1, irqs_disabled(): 1, non_block: 0, pid: 170, name: kworker/u50:6
preempt_count: 1, expected: 0
6 locks held by kworker/u50:6/170:
#0: ffff000800206d48 ((wq_completion)events_unbound){+.+.}-{0:0}, at:
process_one_work (kernel/workqueue.c:3232)
#1: ffff8000824f3d90 (deferred_probe_work){+.+.}-{0:0}, at:
process_one_work (kernel/workqueue.c:3233)
#2: ffff0008059920e8 (&dev->mutex){....}-{4:4}, at: __device_attach
(drivers/base/dd.c:1007)
#3: ffff0008196a3ee8 (&gdev->srcu){.+.+}-{0:0}, at:
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2927)
#4: ffff0008197434b8 (&shared_desc->spinlock){....}-{3:3}, at:
gpio_shared_proxy_direction_output (drivers/gpio/gpiolib-shared.h:52
(discriminator 7) drivers/gpio/gpio-shared-proxy.c:181 (discriminator
7)) gpio_shared_proxy
#5: ffff000813758ee8 (&gdev->srcu){.+.+}-{0:0}, at:
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2927)
irq event stamp: 117306
hardirqs last enabled at (117305): _raw_spin_unlock_irqrestore
(./arch/arm64/include/asm/alternative-macros.h:254
./arch/arm64/include/asm/cpufeature.h:809
./arch/arm64/include/asm/irqflags.h:192
./include/linux/spinlock_api_smp.h:151 kernel/locking/spinlock.c:194)
hardirqs last disabled at (117306): _raw_spin_lock_irqsave
(./include/linux/spinlock_api_smp.h:108 (discriminator 7)
kernel/locking/spinlock.c:162 (discriminator 7))
softirqs last enabled at (117044): handle_softirqs
(./arch/arm64/include/asm/current.h:19
./arch/arm64/include/asm/preempt.h:12 kernel/softirq.c:469
kernel/softirq.c:650)
softirqs last disabled at (117033): __do_softirq (kernel/softirq.c:657)
CPU: 5 UID: 0 PID: 170 Comm: kworker/u50:6 Tainted: G E 6.19.0-rc2 #4
PREEMPTLAZY
Tainted: [E]=UNSIGNED_MODULE
Hardware name: LENOVO 83ED/LNVNB161216, BIOS NHCN60WW 09/11/2025
Workqueue: events_unbound deferred_probe_work_func
Call trace:
show_stack (arch/arm64/kernel/stacktrace.c:501) (C)
dump_stack_lvl (lib/dump_stack.c:122)
dump_stack (lib/dump_stack.c:130)
__might_resched (kernel/sched/core.c:8828)
__might_sleep (kernel/sched/core.c:8757)
__mutex_lock (kernel/locking/mutex.c:593 kernel/locking/mutex.c:776)
mutex_lock_nested (kernel/locking/mutex.c:829)
lpi_config_set (drivers/pinctrl/qcom/pinctrl-lpass-lpi.c:296) pinctrl_lpass_lpi
lpi_gpio_direction_output
(drivers/pinctrl/qcom/pinctrl-lpass-lpi.c:334) pinctrl_lpass_lpi
gpiochip_direction_output (drivers/gpio/gpiolib.c:2830)
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2973)
gpiod_direction_output_nonotify (drivers/gpio/gpiolib.c:3091)
gpiod_direction_output (drivers/gpio/gpiolib.c:3026 drivers/gpio/gpiolib.c:3019)
gpio_shared_proxy_direction_output
(drivers/gpio/gpio-shared-proxy.c:188) gpio_shared_proxy
gpiochip_direction_output (drivers/gpio/gpiolib.c:2830)
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2973)
gpiod_direction_output_nonotify (drivers/gpio/gpiolib.c:3091)
gpiod_configure_flags (drivers/gpio/gpiolib.c:4931)
gpiod_find_and_request (drivers/gpio/gpiolib.c:4752)
gpiod_get_index (drivers/gpio/gpiolib.c:4964)
devm_gpiod_get_index (drivers/gpio/gpiolib-devres.c:102)
devm_gpiod_get (drivers/gpio/gpiolib-devres.c:52)
reset_gpio_probe (drivers/reset/reset-gpio.c:81 (discriminator 1))
auxiliary_bus_probe (drivers/base/auxiliary.c:228 (discriminator 1))
really_probe (drivers/base/dd.c:581 drivers/base/dd.c:659)
__driver_probe_device (drivers/base/dd.c:801)
driver_probe_device (drivers/base/dd.c:831)
__device_attach_driver (drivers/base/dd.c:960)
bus_for_each_drv (drivers/base/bus.c:500)
__device_attach (drivers/base/dd.c:1033)
device_initial_probe (drivers/base/dd.c:1086)
bus_probe_device (drivers/base/bus.c:576)
deferred_probe_work_func (drivers/base/dd.c:125)
process_one_work (./arch/arm64/include/asm/jump_label.h:36
./include/trace/events/workqueue.h:110 kernel/workqueue.c:3262)
worker_thread (kernel/workqueue.c:3334 (discriminator 2)
kernel/workqueue.c:3421 (discriminator 2))
kthread (kernel/kthread.c:463)
ret_from_fork (arch/arm64/kernel/entry.S:861)
=============================
[ BUG: Invalid wait context ]
6.19.0-rc2 #4 Tainted: G W E
-----------------------------
kworker/u50:6/170 is trying to lock:
ffff000820e9fb78 (&pctrl->lock#2){+.+.}-{4:4}, at: lpi_config_set
(drivers/pinctrl/qcom/pinctrl-lpass-lpi.c:296) pinctrl_lpass_lpi
other info that might help us debug this:
context-{5:5}
6 locks held by kworker/u50:6/170:
#0: ffff000800206d48 ((wq_completion)events_unbound){+.+.}-{0:0}, at:
process_one_work (kernel/workqueue.c:3232)
#1: ffff8000824f3d90 (deferred_probe_work){+.+.}-{0:0}, at:
process_one_work (kernel/workqueue.c:3233)
#2: ffff0008059920e8 (&dev->mutex){....}-{4:4}, at: __device_attach
(drivers/base/dd.c:1007)
#3: ffff0008196a3ee8 (&gdev->srcu){.+.+}-{0:0}, at:
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2927)
#4: ffff0008197434b8 (&shared_desc->spinlock){....}-{3:3}, at:
gpio_shared_proxy_direction_output (drivers/gpio/gpiolib-shared.h:52
(discriminator 7) drivers/gpio/gpio-shared-proxy.c:181 (discriminator
7)) gpio_shared_proxy
#5: ffff000813758ee8 (&gdev->srcu){.+.+}-{0:0}, at:
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2927)
stack backtrace:
CPU: 5 UID: 0 PID: 170 Comm: kworker/u50:6 Tainted: G W E 6.19.0-rc2
#4 PREEMPTLAZY
Tainted: [W]=WARN, [E]=UNSIGNED_MODULE
Hardware name: LENOVO 83ED/LNVNB161216, BIOS NHCN60WW 09/11/2025
Workqueue: events_unbound deferred_probe_work_func
Call trace:
show_stack (arch/arm64/kernel/stacktrace.c:501) (C)
dump_stack_lvl (lib/dump_stack.c:122)
dump_stack (lib/dump_stack.c:130)
__lock_acquire (kernel/locking/lockdep.c:4832
kernel/locking/lockdep.c:4902 kernel/locking/lockdep.c:5187)
lock_acquire.part.0 (./arch/arm64/include/asm/percpu.h:40
kernel/locking/lockdep.c:470 kernel/locking/lockdep.c:5870)
lock_acquire (kernel/locking/lockdep.c:5872)
__mutex_lock (kernel/locking/mutex.c:616 kernel/locking/mutex.c:776)
mutex_lock_nested (kernel/locking/mutex.c:829)
lpi_config_set (drivers/pinctrl/qcom/pinctrl-lpass-lpi.c:296) pinctrl_lpass_lpi
lpi_gpio_direction_output
(drivers/pinctrl/qcom/pinctrl-lpass-lpi.c:334) pinctrl_lpass_lpi
gpiochip_direction_output (drivers/gpio/gpiolib.c:2830)
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2973)
gpiod_direction_output_nonotify (drivers/gpio/gpiolib.c:3091)
gpiod_direction_output (drivers/gpio/gpiolib.c:3026 drivers/gpio/gpiolib.c:3019)
gpio_shared_proxy_direction_output
(drivers/gpio/gpio-shared-proxy.c:188) gpio_shared_proxy
gpiochip_direction_output (drivers/gpio/gpiolib.c:2830)
gpiod_direction_output_raw_commit (drivers/gpio/gpiolib.c:2973)
gpiod_direction_output_nonotify (drivers/gpio/gpiolib.c:3091)
gpiod_configure_flags (drivers/gpio/gpiolib.c:4931)
gpiod_find_and_request (drivers/gpio/gpiolib.c:4752)
gpiod_get_index (drivers/gpio/gpiolib.c:4964)
devm_gpiod_get_index (drivers/gpio/gpiolib-devres.c:102)
devm_gpiod_get (drivers/gpio/gpiolib-devres.c:52)
reset_gpio_probe (drivers/reset/reset-gpio.c:81 (discriminator 1))
auxiliary_bus_probe (drivers/base/auxiliary.c:228 (discriminator 1))
really_probe (drivers/base/dd.c:581 drivers/base/dd.c:659)
__driver_probe_device (drivers/base/dd.c:801)
driver_probe_device (drivers/base/dd.c:831)
__device_attach_driver (drivers/base/dd.c:960)
bus_for_each_drv (drivers/base/bus.c:500)
__device_attach (drivers/base/dd.c:1033)
device_initial_probe (drivers/base/dd.c:1086)
bus_probe_device (drivers/base/bus.c:576)
deferred_probe_work_func (drivers/base/dd.c:125)
process_one_work (./arch/arm64/include/asm/jump_label.h:36
./include/trace/events/workqueue.h:110 kernel/workqueue.c:3262)
worker_thread (kernel/workqueue.c:3334 (discriminator 2)
kernel/workqueue.c:3421 (discriminator 2))
kthread (kernel/kthread.c:463)
ret_from_fork (arch/arm64/kernel/entry.S:861)
I can test any changes or get further debug as preferred.
Thanks,
Daniel
-- [1] full dmesg
https://htmlpreview.github.io/?https://gist.githubusercontent.com/dblueman/7e33be397278677c323b566140968f0d/raw/77058946593fa96a2a063cb3904456d286821de7/linux-6190rc2-lockdep-qualcomm-x1-dmesg.html
-- [2] .config
https://gist.githubusercontent.com/dblueman/7e33be397278677c323b566140968f0d/raw/77058946593fa96a2a063cb3904456d286821de7/linux-6190rc2-lockdep-qualcomm-x1-dmesg.config
--
Daniel J Blueman
Powered by blists - more mailing lists