Message ID | 20181124191238.28276-1-lyude@redhat.com (mailing list archive) |
---|---|
State | Mainlined |
Commit | 995b278e4723b26f8ebf0e7c119286d16c712747 |
Headers | show |
Series | drm/meson: Enable fast_io in meson_dw_hdmi_regmap_config | expand |
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@redhat.com> > Fixes: 3f68be7d8e96 ("drm/meson: Add support for HDMI encoder and DW-HDMI bridge + PHY") > Cc: Daniel Vetter <daniel.vetter@ffwll.ch> > Cc: Neil Armstrong <narmstrong@baylibre.com> > Cc: Carlo Caione <carlo@caione.org> > Cc: Kevin Hilman <khilman@baylibre.com> > Cc: dri-devel@lists.freedesktop.org > Cc: linux-amlogic@lists.infradead.org > Cc: linux-arm-kernel@lists.infradead.org > Cc: <stable@vger.kernel.org> # 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@baylibre.com> Applying to drm-misc-fixes Thanks, Neil
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)
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@redhat.com> Fixes: 3f68be7d8e96 ("drm/meson: Add support for HDMI encoder and DW-HDMI bridge + PHY") Cc: Daniel Vetter <daniel.vetter@ffwll.ch> Cc: Neil Armstrong <narmstrong@baylibre.com> Cc: Carlo Caione <carlo@caione.org> Cc: Kevin Hilman <khilman@baylibre.com> Cc: dri-devel@lists.freedesktop.org Cc: linux-amlogic@lists.infradead.org Cc: linux-arm-kernel@lists.infradead.org Cc: <stable@vger.kernel.org> # v4.12+ --- drivers/gpu/drm/meson/meson_dw_hdmi.c | 1 + 1 file changed, 1 insertion(+)