On 24/11/2018 20:12, Lyude Paul wrote: > Seeing as we use this registermap in the context of our IRQ handlers, we > need to be using spinlocks for reading/writing registers so that we can > still read them from IRQ handlers without having to grab any mutexes and > accidentally sleep. We don't currently do this, as pointed out by > lockdep: > > [ 18.403770] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:908 > [ 18.406744] in_atomic(): 1, irqs_disabled(): 128, pid: 68, name: kworker/u17:0 > [ 18.413864] INFO: lockdep is turned off. > [ 18.417675] irq event stamp: 12 > [ 18.420778] hardirqs last enabled at (11): [<ffff000008a4f57c>] _raw_spin_unlock_irq+0x2c/0x60 > [ 18.429510] hardirqs last disabled at (12): [<ffff000008a48914>] __schedule+0xc4/0xa60 > [ 18.437345] softirqs last enabled at (0): [<ffff0000080b55e0>] copy_process.isra.4.part.5+0x4d8/0x1c50 > [ 18.446684] softirqs last disabled at (0): [<0000000000000000>] (null) > [ 18.453979] CPU: 0 PID: 68 Comm: kworker/u17:0 Tainted: G W O 4.20.0-rc3Lyude-Test+ #9 > [ 18.469839] Hardware name: amlogic khadas-vim2/khadas-vim2, BIOS 2018.07-rc2-armbian 09/11/2018 > [ 18.480037] Workqueue: hci0 hci_power_on [bluetooth] > [ 18.487138] Call trace: > [ 18.494192] dump_backtrace+0x0/0x1b8 > [ 18.501280] show_stack+0x14/0x20 > [ 18.508361] dump_stack+0xbc/0xf4 > [ 18.515427] ___might_sleep+0x140/0x1d8 > [ 18.522515] __might_sleep+0x50/0x88 > [ 18.529582] __mutex_lock+0x60/0x870 > [ 18.536621] mutex_lock_nested+0x1c/0x28 > [ 18.543660] regmap_lock_mutex+0x10/0x18 > [ 18.550696] regmap_read+0x38/0x70 > [ 18.557727] dw_hdmi_hardirq+0x58/0x138 [dw_hdmi] > [ 18.564804] __handle_irq_event_percpu+0xac/0x410 > [ 18.571891] handle_irq_event_percpu+0x34/0x88 > [ 18.578982] handle_irq_event+0x48/0x78 > [ 18.586051] handle_fasteoi_irq+0xac/0x160 > [ 18.593061] generic_handle_irq+0x24/0x38 > [ 18.599989] __handle_domain_irq+0x60/0xb8 > [ 18.606857] gic_handle_irq+0x50/0xa0 > [ 18.613659] el1_irq+0xb4/0x130 > [ 18.620394] debug_lockdep_rcu_enabled+0x2c/0x30 > [ 18.627111] schedule+0x38/0xa0 > [ 18.633781] schedule_timeout+0x3a8/0x510 > [ 18.640389] wait_for_common+0x15c/0x180 > [ 18.646905] wait_for_completion+0x14/0x20 > [ 18.653319] mmc_wait_for_req_done+0x28/0x168 > [ 18.659693] mmc_wait_for_req+0xa8/0xe8 > [ 18.665978] mmc_wait_for_cmd+0x64/0x98 > [ 18.672180] mmc_io_rw_direct_host+0x94/0x130 > [ 18.678385] mmc_io_rw_direct+0x10/0x18 > [ 18.684516] sdio_enable_func+0xe8/0x1d0 > [ 18.690627] btsdio_open+0x24/0xc0 [btsdio] > [ 18.696821] hci_dev_do_open+0x64/0x598 [bluetooth] > [ 18.703025] hci_power_on+0x50/0x270 [bluetooth] > [ 18.709163] process_one_work+0x2a0/0x6e0 > [ 18.715252] worker_thread+0x40/0x448 > [ 18.721310] kthread+0x12c/0x130 > [ 18.727326] ret_from_fork+0x10/0x1c > [ 18.735555] ------------[ cut here ]------------ > [ 18.741430] do not call blocking ops when !TASK_RUNNING; state=2 set at [<000000006265ec59>] wait_for_common+0x140/0x180 > [ 18.752417] WARNING: CPU: 0 PID: 68 at kernel/sched/core.c:6096 __might_sleep+0x7c/0x88 > [ 18.760553] Modules linked in: dm_mirror dm_region_hash dm_log dm_mod > btsdio bluetooth snd_soc_hdmi_codec dw_hdmi_i2s_audio ecdh_generic > brcmfmac brcmutil cfg80211 rfkill ir_nec_decoder meson_dw_hdmi(O) > dw_hdmi rc_geekbox meson_rng meson_ir ao_cec rng_core rc_core cec > leds_pwm efivars nfsd ip_tables x_tables crc32_generic f2fs uas > meson_gxbb_wdt pwm_meson efivarfs ipv6 > [ 18.799469] CPU: 0 PID: 68 Comm: kworker/u17:0 Tainted: G W O 4.20.0-rc3Lyude-Test+ #9 > [ 18.808858] Hardware name: amlogic khadas-vim2/khadas-vim2, BIOS 2018.07-rc2-armbian 09/11/2018 > [ 18.818045] Workqueue: hci0 hci_power_on [bluetooth] > [ 18.824088] pstate: 80000085 (Nzcv daIf -PAN -UAO) > [ 18.829891] pc : __might_sleep+0x7c/0x88 > [ 18.835722] lr : __might_sleep+0x7c/0x88 > [ 18.841256] sp : ffff000008003cb0 > [ 18.846751] x29: ffff000008003cb0 x28: 0000000000000000 > [ 18.852269] x27: ffff00000938e000 x26: ffff800010283000 > [ 18.857726] x25: ffff800010353280 x24: ffff00000868ef50 > [ 18.863166] x23: 0000000000000000 x22: 0000000000000000 > [ 18.868551] x21: 0000000000000000 x20: 000000000000038c > [ 18.873850] x19: ffff000008cd08c0 x18: 0000000000000010 > [ 18.879081] x17: ffff000008a68cb0 x16: 0000000000000000 > [ 18.884197] x15: 0000000000aaaaaa x14: 0e200e200e200e20 > [ 18.889239] x13: 0000000000000001 x12: 00000000ffffffff > [ 18.894261] x11: ffff000008adfa48 x10: 0000000000000001 > [ 18.899517] x9 : ffff0000092a0158 x8 : 0000000000000000 > [ 18.904674] x7 : ffff00000812136c x6 : 0000000000000000 > [ 18.909895] x5 : 0000000000000000 x4 : 0000000000000001 > [ 18.915080] x3 : 0000000000000007 x2 : 0000000000000007 > [ 18.920269] x1 : 99ab8e9ebb6c8500 x0 : 0000000000000000 > [ 18.925443] Call trace: > [ 18.929904] __might_sleep+0x7c/0x88 > [ 18.934311] __mutex_lock+0x60/0x870 > [ 18.938687] mutex_lock_nested+0x1c/0x28 > [ 18.943076] regmap_lock_mutex+0x10/0x18 > [ 18.947453] regmap_read+0x38/0x70 > [ 18.951842] dw_hdmi_hardirq+0x58/0x138 [dw_hdmi] > [ 18.956269] __handle_irq_event_percpu+0xac/0x410 > [ 18.960712] handle_irq_event_percpu+0x34/0x88 > [ 18.965176] handle_irq_event+0x48/0x78 > [ 18.969612] handle_fasteoi_irq+0xac/0x160 > [ 18.974058] generic_handle_irq+0x24/0x38 > [ 18.978501] __handle_domain_irq+0x60/0xb8 > [ 18.982938] gic_handle_irq+0x50/0xa0 > [ 18.987351] el1_irq+0xb4/0x130 > [ 18.991734] debug_lockdep_rcu_enabled+0x2c/0x30 > [ 18.996180] schedule+0x38/0xa0 > [ 19.000609] schedule_timeout+0x3a8/0x510 > [ 19.005064] wait_for_common+0x15c/0x180 > [ 19.009513] wait_for_completion+0x14/0x20 > [ 19.013951] mmc_wait_for_req_done+0x28/0x168 > [ 19.018402] mmc_wait_for_req+0xa8/0xe8 > [ 19.022809] mmc_wait_for_cmd+0x64/0x98 > [ 19.027177] mmc_io_rw_direct_host+0x94/0x130 > [ 19.031563] mmc_io_rw_direct+0x10/0x18 > [ 19.035922] sdio_enable_func+0xe8/0x1d0 > [ 19.040294] btsdio_open+0x24/0xc0 [btsdio] > [ 19.044742] hci_dev_do_open+0x64/0x598 [bluetooth] > [ 19.049228] hci_power_on+0x50/0x270 [bluetooth] > [ 19.053687] process_one_work+0x2a0/0x6e0 > [ 19.058143] worker_thread+0x40/0x448 > [ 19.062608] kthread+0x12c/0x130 > [ 19.067064] ret_from_fork+0x10/0x1c > [ 19.071513] irq event stamp: 12 > [ 19.075937] hardirqs last enabled at (11): [<ffff000008a4f57c>] _raw_spin_unlock_irq+0x2c/0x60 > [ 19.083560] hardirqs last disabled at (12): [<ffff000008a48914>] __schedule+0xc4/0xa60 > [ 19.091401] softirqs last enabled at (0): [<ffff0000080b55e0>] copy_process.isra.4.part.5+0x4d8/0x1c50 > [ 19.100801] softirqs last disabled at (0): [<0000000000000000>] (null) > [ 19.108135] ---[ end trace 38c4920787b88c75 ]--- > > So, fix this by enabling the fast_io option in our regmap config so that > regmap uses spinlocks for locking instead of mutexes. > > Signed-off-by: Lyude Paul <lyude@xxxxxxxxxx> > Fixes: 3f68be7d8e96 ("drm/meson: Add support for HDMI encoder and DW-HDMI bridge + PHY") > Cc: Daniel Vetter <daniel.vetter@xxxxxxxx> > Cc: Neil Armstrong <narmstrong@xxxxxxxxxxxx> > Cc: Carlo Caione <carlo@xxxxxxxxxx> > Cc: Kevin Hilman <khilman@xxxxxxxxxxxx> > Cc: dri-devel@xxxxxxxxxxxxxxxxxxxxx > Cc: linux-amlogic@xxxxxxxxxxxxxxxxxxx > Cc: linux-arm-kernel@xxxxxxxxxxxxxxxxxxx > Cc: <stable@xxxxxxxxxxxxxxx> # v4.12+ > --- > drivers/gpu/drm/meson/meson_dw_hdmi.c | 1 + > 1 file changed, 1 insertion(+) > > diff --git a/drivers/gpu/drm/meson/meson_dw_hdmi.c b/drivers/gpu/drm/meson/meson_dw_hdmi.c > index df7247cd93f9..2cb2ad26d716 100644 > --- a/drivers/gpu/drm/meson/meson_dw_hdmi.c > +++ b/drivers/gpu/drm/meson/meson_dw_hdmi.c > @@ -706,6 +706,7 @@ static const struct regmap_config meson_dw_hdmi_regmap_config = { > .reg_read = meson_dw_hdmi_reg_read, > .reg_write = meson_dw_hdmi_reg_write, > .max_register = 0x10000, > + .fast_io = true, > }; > > static bool meson_hdmi_connector_is_available(struct device *dev) > Acked-by: Neil Armstrong <narmstrong@xxxxxxxxxxxx> Applying to drm-misc-fixes Thanks, Neil