From patchwork Thu Feb 23 11:43:27 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Marek Szyprowski X-Patchwork-Id: 9588203 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id EFCB26057F for ; Thu, 23 Feb 2017 11:47:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id E3D9C2832F for ; Thu, 23 Feb 2017 11:47:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D89882841E; Thu, 23 Feb 2017 11:47:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EB0102841D for ; Thu, 23 Feb 2017 11:47:16 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751053AbdBWLqw (ORCPT ); Thu, 23 Feb 2017 06:46:52 -0500 Received: from mailout1.w1.samsung.com ([210.118.77.11]:34844 "EHLO mailout1.w1.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751099AbdBWLqu (ORCPT ); Thu, 23 Feb 2017 06:46:50 -0500 Received: from eucas1p1.samsung.com (unknown [182.198.249.206]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0OLT005OOSL1H2A0@mailout1.w1.samsung.com>; Thu, 23 Feb 2017 11:43:49 +0000 (GMT) Received: from eusmges2.samsung.com (unknown [203.254.199.241]) by eucas1p1.samsung.com (KnoxPortal) with ESMTP id 20170223114348eucas1p19a458735c679b09d79da0014c1bd60db~l5_ZOigDN2448324483eucas1p1P; Thu, 23 Feb 2017 11:43:48 +0000 (GMT) Received: from eucas1p1.samsung.com ( [182.198.249.206]) by eusmges2.samsung.com (EUCPMTA) with SMTP id 92.CA.30614.3FACEA85; Thu, 23 Feb 2017 11:43:47 +0000 (GMT) Received: from eusmgms1.samsung.com (unknown [182.198.249.179]) by eucas1p2.samsung.com (KnoxPortal) with ESMTP id 20170223114347eucas1p21e5aed393511b41e51aac1df2762db83~l5_Yiv7UZ0056700567eucas1p2U; Thu, 23 Feb 2017 11:43:47 +0000 (GMT) X-AuditID: cbfec7f1-f793f6d000007796-b7-58aecaf34559 Received: from eusync3.samsung.com ( [203.254.199.213]) by eusmgms1.samsung.com (EUCPMTA) with SMTP id 23.5F.06687.94BCEA85; Thu, 23 Feb 2017 11:45:13 +0000 (GMT) Received: from AMDC2765.digital.local ([106.116.147.25]) by eusync3.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0OLT00H4CSKVY180@eusync3.samsung.com>; Thu, 23 Feb 2017 11:43:47 +0000 (GMT) From: Marek Szyprowski To: linux-media@vger.kernel.org, linux-samsung-soc@vger.kernel.org Cc: Marek Szyprowski , Sylwester Nawrocki , Andrzej Hajda , Kamil Debski , Mauro Carvalho Chehab , Krzysztof Kozlowski , Javier Martinez Canillas , Inki Dae , stable@vger.kernel.org Subject: [PATCH] media: mfc: Fix race between interrupt routine and device functions Date: Thu, 23 Feb 2017 12:43:27 +0100 Message-id: <1487850219-6482-1-git-send-email-m.szyprowski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrPIsWRmVeSWpSXmKPExsWy7djPc7qfT62LMOicbmNxa905VotJ9yew WLx5u4bJYuaJdlaL8+c3sFv0bNjKajHj/D4mi7VH7rJbLNv0h8ni8Bug7IKNjxgduD02repk 89jSf5fdo2/LKkaPz5vkPK4caWQPYI3isklJzcksSy3St0vgyjiz7y97wRWViisd0xgbGHfK dzFyckgImEh8vbGLEcIWk7hwbz1bFyMXh5DAUkaJpzdWskM4nxklfm/pZILpWLHpAwtEYhmj xPfvZ5ghnAYmieav78Gq2AQMJbredrGB2CICThILZ/0FG8Us8IpJ4vWUXqAODg5hgTCJZ32m IDUsAqoSU5ZeYgGxeQXcJf4fb4LaJidx8thkVpBeCYHPbBINx56ygvRKCMhKbDrADFHjItE9 q5EVwhaWeHV8CzuELSPR2XEQak4/o0RTqzaEPYNR4txbXgjbWuLw8YtgvcwCfBKTtk1nhhjP K9HRJgRhekhMe2cFUe0ocWzLGbCvhARiJaat+8g4gVF6ASPDKkaR1NLi3PTUYiO94sTc4tK8 dL3k/NxNjMBoPv3v+McdjO9PWB1iFOBgVOLhPbBobYQQa2JZcWXuIUYJDmYlEd7KnesihHhT EiurUovy44tKc1KLDzFKc7AoifPuWXAlXEggPbEkNTs1tSC1CCbLxMEp1cAo2njq/P1K/quW Zq+MJLeZmDBFP7IzUtO94aeplP9/T7Nd+zaDv5JXqtuyGL3mNDEsM1XuYpp2OFIkYbu9g5G8 gUrN7pTK+wzepVZLXtVM2KA1o+uYpdGbXi/Vz2xmT7ZFTJz/Z05o9Nuo+4dlG5b4fFrHfeh2 i+fJg0+mqzR5HGYIF76kNk2JpTgj0VCLuag4EQCVLGED4gIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFnrCLMWRmVeSWpSXmKPExsVy+t/xq7qep9dFGFxZoWtxa905VotJ9yew WLx5u4bJYuaJdlaL8+c3sFv0bNjKajHj/D4mi7VH7rJbLNv0h8ni8Bug7IKNjxgduD02repk 89jSf5fdo2/LKkaPz5vkPK4caWQPYI1ys8lITUxJLVJIzUvOT8nMS7dVCg1x07VQUshLzE21 VYrQ9Q0JUlIoS8wpBfKMDNCAg3OAe7CSvl2CW8aZfX/ZC66oVFzpmMbYwLhTvouRk0NCwERi xaYPLBC2mMSFe+vZuhi5OIQEljBKfP23jh3CaWKSaG66yAZSxSZgKNH1tgvMFhFwklg46y87 iM0s8IZJ4tPmzC5GDg5hgTCJZ32mIGEWAVWJKUsvgS3gFXCX+H+8iQlimZzEyWOTWScwci9g ZFjFKJJaWpybnltsqFecmFtcmpeul5yfu4kRGMLbjv3cvIPx0sbgQ4wCHIxKPLwHFq2NEGJN LCuuzD3EKMHBrCTCW7lzXYQQb0piZVVqUX58UWlOavEhRlOg5ROZpUST84HxlVcSb2hiaG5p aGRsYWFuZKQkzlvy4Uq4kEB6YklqdmpqQWoRTB8TB6dUA2OCr0l+9q8Jl/o+TSvy072h+5m3 fwfXTbGHQnczbF/11Ji2aEtOMy3taXDbdtZD8tcNDr79ShtZZq898tE1Zr3d/tOBZU83WttP NWisv/evMuxcsvX19k0ZkitEPbg9CvQO54YX9ZVrNJmYBbfcKShbdvCZwK0t26VE85c+j+hU DvhSOveTlRJLcUaioRZzUXEiAC7cVyB3AgAA X-MTR: 20000000000000000@CPGS X-CMS-MailID: 20170223114347eucas1p21e5aed393511b41e51aac1df2762db83 X-Msg-Generator: CA X-Sender-IP: 182.198.249.179 X-Local-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRs=?= =?UTF-8?B?7IK87ISx7KCE7J6QG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Global-Sender: =?UTF-8?B?TWFyZWsgU3p5cHJvd3NraRtTUlBPTC1LZXJuZWwgKFRQKRtT?= =?UTF-8?B?YW1zdW5nIEVsZWN0cm9uaWNzG1NlbmlvciBTb2Z0d2FyZSBFbmdpbmVlcg==?= X-Sender-Code: =?UTF-8?B?QzEwG0VIURtDMTBDRDAyQ0QwMjczOTI=?= CMS-TYPE: 201P X-HopCount: 7 X-CMS-RootMailID: 20170223114347eucas1p21e5aed393511b41e51aac1df2762db83 X-RootMTR: 20170223114347eucas1p21e5aed393511b41e51aac1df2762db83 References: Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP 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 [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [] (show_stack) from [] (dump_stack+0x74/0x94) [] (dump_stack) from [] (__warn+0xd4/0x100) [] (__warn) from [] (warn_slowpath_null+0x20/0x28) [] (warn_slowpath_null) from [] (clk_core_unprepare+0xc8/0x108) [] (clk_core_unprepare) from [] (clk_unprepare+0x24/0x2c) [] (clk_unprepare) from [] (exynos_sysmmu_suspend+0x48/0x60) [] (exynos_sysmmu_suspend) from [] (pm_generic_runtime_suspend+0x2c/0x38) [] (pm_generic_runtime_suspend) from [] (genpd_runtime_suspend+0x94/0x220) [] (genpd_runtime_suspend) from [] (__rpm_callback+0x134/0x208) [] (__rpm_callback) from [] (rpm_callback+0x20/0x80) [] (rpm_callback) from [] (rpm_suspend+0xdc/0x458) [] (rpm_suspend) from [] (pm_runtime_work+0x80/0x90) [] (pm_runtime_work) from [] (process_one_work+0x120/0x318) [] (process_one_work) from [] (worker_thread+0x2c/0x4ac) [] (worker_thread) from [] (kthread+0xfc/0x134) [] (kthread) from [] (ret_from_fork+0x14/0x3c) ---[ end trace 1ead49a7bb83f0d8 ]--- Signed-off-by: Marek Szyprowski Fixes: af93574678108 ("[media] MFC: Add MFC 5.1 V4L2 driver") CC: stable@vger.kernel.org # v4.5+ Reviewed-by: Javier Martinez Canillas --- This issue was there from the beggining of the driver, but this patch applies only to v4.5+ kernels. --- drivers/media/platform/s5p-mfc/s5p_mfc.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/drivers/media/platform/s5p-mfc/s5p_mfc.c b/drivers/media/platform/s5p-mfc/s5p_mfc.c index 9e0685beb048..d6cb315dac60 100644 --- a/drivers/media/platform/s5p-mfc/s5p_mfc.c +++ b/drivers/media/platform/s5p-mfc/s5p_mfc.c @@ -657,9 +657,9 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv) break; } s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); - wake_up_ctx(ctx, reason, err); WARN_ON(test_and_clear_bit(0, &dev->hw_lock) == 0); s5p_mfc_clock_off(); + wake_up_ctx(ctx, reason, err); s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); } else { s5p_mfc_handle_frame(ctx, reason, err); @@ -673,15 +673,11 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv) case S5P_MFC_R2H_CMD_OPEN_INSTANCE_RET: ctx->inst_no = s5p_mfc_hw_call(dev->mfc_ops, get_inst_no, dev); ctx->state = MFCINST_GOT_INST; - clear_work_bit(ctx); - wake_up(&ctx->queue); goto irq_cleanup_hw; case S5P_MFC_R2H_CMD_CLOSE_INSTANCE_RET: - clear_work_bit(ctx); ctx->inst_no = MFC_NO_INSTANCE_SET; ctx->state = MFCINST_FREE; - wake_up(&ctx->queue); goto irq_cleanup_hw; case S5P_MFC_R2H_CMD_SYS_INIT_RET: @@ -691,9 +687,9 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv) if (ctx) clear_work_bit(ctx); s5p_mfc_hw_call(dev->mfc_ops, clear_int_flags, dev); - wake_up_dev(dev, reason, err); clear_bit(0, &dev->hw_lock); clear_bit(0, &dev->enter_suspend); + wake_up_dev(dev, reason, err); break; case S5P_MFC_R2H_CMD_INIT_BUFFERS_RET: @@ -708,9 +704,7 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv) break; case S5P_MFC_R2H_CMD_DPB_FLUSH_RET: - clear_work_bit(ctx); ctx->state = MFCINST_RUNNING; - wake_up(&ctx->queue); goto irq_cleanup_hw; default: @@ -729,6 +723,8 @@ static irqreturn_t s5p_mfc_irq(int irq, void *priv) mfc_err("Failed to unlock hw\n"); s5p_mfc_clock_off(); + clear_work_bit(ctx); + wake_up(&ctx->queue); s5p_mfc_hw_call(dev->mfc_ops, try_run, dev); spin_unlock(&dev->irqlock);