From 786ee2013dcd66fa898acce8b366e607057ab8ca Mon Sep 17 00:00:00 2001 From: Laurentiu Palcu Date: Fri, 26 Oct 2018 11:50:13 +0300 Subject: [PATCH] MLK-20098-1: imx/drm/dcss: Fix potential sleep in IRQ context Activating CONFIG_SLEEP_ATOMIC_SLEEP detected a couple of potential sleeps inside IRQ context: [ 23.609203] BUG: sleeping function called from invalid context at kernel/irq/manage.c:112 [ 23.617437] in_atomic(): 1, irqs_disabled(): 128, pid: 0, name: swapper/2 [ 23.624229] CPU: 2 PID: 0 Comm: swapper/2 Tainted: G W 4.14.62-05295-gf2fa7e6 #454 [ 23.632927] Hardware name: Freescale i.MX8MQ EVK (DT) [ 23.637980] Call trace: [ 23.640433] [] dump_backtrace+0x0/0x3d8 [ 23.645834] [] show_stack+0x14/0x20 [ 23.650891] [] dump_stack+0x9c/0xbc [ 23.655946] [] ___might_sleep+0xf4/0x118 [ 23.661433] [] __might_sleep+0x50/0x88 [ 23.666750] [] synchronize_irq+0x30/0x98 [ 23.672237] [] disable_irq+0x20/0x30 [ 23.677378] [] dcss_dpr_irq_enable+0x78/0x98 [ 23.683211] [] dcss_dtg_vblank_irq_enable+0x40/0x78 [ 23.689652] [] dcss_vblank_irq_enable+0xc/0x18 [ 23.695661] [] dcss_disable_vblank+0x30/0x50 [ 23.701496] [] drm_vblank_disable_and_save+0xd4/0xe8 [ 23.708023] [] vblank_disable_fn+0x88/0xa8 [ 23.713685] [] call_timer_fn.isra.5+0x24/0x80 [ 23.719603] [] expire_timers+0xa4/0xb0 [ 23.724914] [] run_timer_softirq+0xb8/0x170 [ 23.730660] [] __do_softirq+0x12c/0x228 [ 23.736062] [] irq_exit+0xc4/0x100 [ 23.741025] [] __handle_domain_irq+0x60/0xb8 [ 23.746857] [] gic_handle_irq+0x78/0x17c These sleep warnings were generated because disable_irq() may sleep. Use disable_irq_nosync() instead. Signed-off-by: Laurentiu Palcu --- drivers/gpu/imx/dcss/dcss-dpr.c | 6 +++--- drivers/gpu/imx/dcss/dcss-dtg.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/imx/dcss/dcss-dpr.c b/drivers/gpu/imx/dcss/dcss-dpr.c index f43089167520..e8c551e09efb 100644 --- a/drivers/gpu/imx/dcss/dcss-dpr.c +++ b/drivers/gpu/imx/dcss/dcss-dpr.c @@ -737,9 +737,9 @@ void dcss_dpr_irq_enable(struct dcss_soc *dcss, bool en) struct dcss_dpr_priv *dpr = dcss->dpr_priv; if (!en) { - disable_irq(dpr->ch[0].irq); - disable_irq(dpr->ch[1].irq); - disable_irq(dpr->ch[2].irq); + disable_irq_nosync(dpr->ch[0].irq); + disable_irq_nosync(dpr->ch[1].irq); + disable_irq_nosync(dpr->ch[2].irq); return; } diff --git a/drivers/gpu/imx/dcss/dcss-dtg.c b/drivers/gpu/imx/dcss/dcss-dtg.c index c83d66a5972c..afaad91f13ed 100644 --- a/drivers/gpu/imx/dcss/dcss-dtg.c +++ b/drivers/gpu/imx/dcss/dcss-dtg.c @@ -543,7 +543,7 @@ void dcss_dtg_ctxld_kick_irq_enable(struct dcss_soc *dcss, bool en) if (!dtg->ctxld_kick_irq_en) return; - disable_irq(dtg->ctxld_kick_irq); + disable_irq_nosync(dtg->ctxld_kick_irq); dtg->ctxld_kick_irq_en = false; } EXPORT_SYMBOL(dcss_dtg_ctxld_kick_irq_enable); -- 2.17.1