diff mbox series

drm/meson: Enable fast_io in meson_dw_hdmi_regmap_config

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

Commit Message

Lyude Paul Nov. 24, 2018, 7:12 p.m. UTC
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(+)

Comments

Neil Armstrong Nov. 26, 2018, 8:49 a.m. UTC | #1
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 mbox series

Patch

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)