• Marek Szyprowski's avatar
    s5p-mfc: Fix race between interrupt routine and device functions · d926ceaa
    Marek Szyprowski authored
    commit 0c32b8ec upstream.
    
    Interrupt routine must wake process waiting for given interrupt AFTER
    updating driver's internal structures and contexts. Doing it in-between
    is a serious bug. This patch moves all calls to the wake() function to
    the end of the interrupt processing block to avoid potential and real
    races, especially on multi-core platforms. This also fixes following issue
    reported from clock core (clocks were disabled in interrupt after being
    unprepared from the other place in the driver, the stack trace however
    points to the different place than s5p_mfc driver because of the race):
    
    WARNING: CPU: 1 PID: 18 at drivers/clk/clk.c:544 clk_core_unprepare+0xc8/0x108
    Modules linked in:
    CPU: 1 PID: 18 Comm: kworker/1:0 Not tainted 4.10.0-next-20170223-00070-g04e18bc99ab9-dirty #2154
    Hardware name: SAMSUNG EXYNOS (Flattened Device Tree)
    Workqueue: pm pm_runtime_work
    [<c010d8b0>] (unwind_backtrace) from [<c010a534>] (show_stack+0x10/0x14)
    [<c010a534>] (show_stack) from [<c033292c>] (dump_stack+0x74/0x94)
    [<c033292c>] (dump_stack) from [<c011cef4>] (__warn+0xd4/0x100)
    [<c011cef4>] (__warn) from [<c011cf40>] (warn_slowpath_null+0x20/0x28)
    [<c011cf40>] (warn_slowpath_null) from [<c0387a84>] (clk_core_unprepare+0xc8/0x108)
    [<c0387a84>] (clk_core_unprepare) from [<c0389d84>] (clk_unprepare+0x24/0x2c)
    [<c0389d84>] (clk_unprepare) from [<c03d4660>] (exynos_sysmmu_suspend+0x48/0x60)
    [<c03d4660>] (exynos_sysmmu_suspend) from [<c042b9b0>] (pm_generic_runtime_suspend+0x2c/0x38)
    [<c042b9b0>] (pm_generic_runtime_suspend) from [<c0437580>] (genpd_runtime_suspend+0x94/0x220)
    [<c0437580>] (genpd_runtime_suspend) from [<c042e240>] (__rpm_callback+0x134/0x208)
    [<c042e240>] (__rpm_callback) from [<c042e334>] (rpm_callback+0x20/0x80)
    [<c042e334>] (rpm_callback) from [<c042d3b8>] (rpm_suspend+0xdc/0x458)
    [<c042d3b8>] (rpm_suspend) from [<c042ea24>] (pm_runtime_work+0x80/0x90)
    [<c042ea24>] (pm_runtime_work) from [<c01322c4>] (process_one_work+0x120/0x318)
    [<c01322c4>] (process_one_work) from [<c0132520>] (worker_thread+0x2c/0x4ac)
    [<c0132520>] (worker_thread) from [<c0137ab0>] (kthread+0xfc/0x134)
    [<c0137ab0>] (kthread) from [<c0107978>] (ret_from_fork+0x14/0x3c)
    ---[ end trace 1ead49a7bb83f0d8 ]---
    
    Fixes: af935746 ("[media] MFC: Add MFC 5.1 V4L2 driver")
    Signed-off-by: default avatarMarek Szyprowski <m.szyprowski@samsung.com>
    Reviewed-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
    Signed-off-by: default avatarSylwester Nawrocki <s.nawrocki@samsung.com>
    Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    d926ceaa
s5p_mfc.c 42.7 KB