From patchwork Mon Jun 30 13:25:44 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Krzysztof Kozlowski X-Patchwork-Id: 4453681 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 42206BEECB for ; Mon, 30 Jun 2014 18:08:51 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1E44F203DA for ; Mon, 30 Jun 2014 18:08:50 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 639D720382 for ; Mon, 30 Jun 2014 18:08:44 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 8D3FC6E490; Mon, 30 Jun 2014 11:08:41 -0700 (PDT) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mailout1.w1.samsung.com (mailout1.w1.samsung.com [210.118.77.11]) by gabe.freedesktop.org (Postfix) with ESMTP id 553956E40A for ; Mon, 30 Jun 2014 06:29:00 -0700 (PDT) Received: from eucpsbgm1.samsung.com (unknown [203.254.199.244]) by mailout1.w1.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0N7Z007Y8HG41660@mailout1.w1.samsung.com> for dri-devel@lists.freedesktop.org; Mon, 30 Jun 2014 14:28:52 +0100 (BST) X-AuditID: cbfec7f4-b7fac6d000006cfe-27-53b166184594 Received: from eusync1.samsung.com ( [203.254.199.211]) by eucpsbgm1.samsung.com (EUCPMTA) with SMTP id 75.D5.27902.81661B35; Mon, 30 Jun 2014 14:28:56 +0100 (BST) Received: from AMDC1943.digital.local ([106.116.151.171]) by eusync1.samsung.com (Oracle Communications Messaging Server 7u4-23.01(7.0.4.23.0) 64bit (built Aug 10 2011)) with ESMTPA id <0N7Z00D0IHG4MY40@eusync1.samsung.com>; Mon, 30 Jun 2014 14:28:56 +0100 (BST) From: Krzysztof Kozlowski To: Inki Dae , Joonyoung Shim , Seung-Woo Kim , Kyungmin Park , David Airlie , Kukjin Kim , dri-devel@lists.freedesktop.org, linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH] drm/exynos: Fix NULL pointer exception when suspending without components Date: Mon, 30 Jun 2014 15:25:44 +0200 Message-id: <1404134744-15852-1-git-send-email-k.kozlowski@samsung.com> X-Mailer: git-send-email 1.9.1 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmphluLIzCtJLcpLzFFi42I5/e/4ZV2JtI3BBmseqVjcWneO1aL33Ekm i40z1rNaXPn6ns1i0v0JLBYv7l1ksXj9wtCid8FVNouzTW/YLTY9vsZqcXnXHDaLGef3MVms PXKX3WLBxkeMFjMmv2Rz4PfY/u0Bq8f97uNMHpuX1Hv0bVnF6PF5k1wAaxSXTUpqTmZZapG+ XQJXxsefr1gKpttW/N5o28C4xLiLkZNDQsBEYv6qFhYIW0ziwr31bF2MXBxCAksZJQ4/2M4K 4fQxSZzrvsQKUsUmYCyxefkSsCoRge9MElOerGcHcZgFrjNK7Nj6kw2kSlggRmLd54dANgcH i4CqxNPOfJAwr4C7xJdVxxkh1slJnDw2mXUCI/cCRoZVjKKppckFxUnpuYZ6xYm5xaV56XrJ +bmbGCEh92UH4+JjVocYBTgYlXh4G1dsCBZiTSwrrsw9xCjBwawkwnvTZ2OwEG9KYmVValF+ fFFpTmrxIUYmDk6pBkbtyH6jSfpLM3W/qfc3LVvG0R+YtW7qrhXuu85uyRcoy1lyo9tV48Pf 1xpLrzvv+Hy4/aVC1cnrXJf9XTL2TDsb0LGM7bnPWeHM+7GHr2S//PJFh3NXfsTjB4uOGtgm L8+4qHqJP7zI5PGXIvEjf7MOFOype3Fp78XWmcph3LP1+jXstfQabvkqsRRnJBpqMRcVJwIA ocaOdhcCAAA= X-Mailman-Approved-At: Mon, 30 Jun 2014 11:08:40 -0700 Cc: Andrzej Hajda , Krzysztof Kozlowski , Bartlomiej Zolnierkiewicz , stable@vger.kernel.org, Marek Szyprowski X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, T_RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Fix a NULL pointer exception when main exynos drm driver was probed successfully but no components were added (e.g. by incomplete DTS). In such case the exynos_drm_load() is never called and drvdata is NULL. The NULL pointer exception may theoretically also happen as a effect of race between adding components and main driver: if suspend of the driver happens before adding components. Trace: [ 1.190295] [drm] Initialized drm 1.1.0 20060810 [ 1.195209] exynos-drm-ipp exynos-drm-ipp: drm ipp registered successfully. (...) [ 24.001743] PM: Syncing filesystems ... done. [ 24.002177] Freezing user space processes ... (elapsed 0.000 seconds) done. [ 24.007403] Freezing remaining freezable tasks ... (elapsed 0.001 seconds) done. [ 24.032559] Unable to handle kernel NULL pointer dereference at virtual address 00000134 [ 24.035007] pgd = dedd8000 [ 24.037734] [00000134] *pgd=5ee13831, *pte=00000000, *ppte=00000000 [ 24.043953] Internal error: Oops: 17 [#1] PREEMPT SMP ARM [ 24.049329] Modules linked in: [ 24.052371] CPU: 0 PID: 1 Comm: sh Not tainted 3.16.0-rc3-00035-geba20bbdde04-dirty #51 [ 24.060354] task: df478000 ti: df480000 task.ti: df480000 [ 24.065743] PC is at mutex_lock+0x10/0x50 [ 24.069733] LR is at drm_modeset_lock_all+0x30/0xbc [ 24.074590] pc : [] lr : [] psr: a0000013 [ 24.074590] sp : df481db8 ip : 00000000 fp : c05e524c [ 24.086045] r10: 00000002 r9 : c02c1fe4 r8 : deca5e44 [ 24.091253] r7 : 00000000 r6 : 00000000 r5 : 0000014c r4 : 00000134 [ 24.097763] r3 : 00000000 r2 : 00000000 r1 : 00000000 r0 : 00000134 [ 24.104275] Flags: NzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user [ 24.111391] Control: 10c53c7d Table: 5edd806a DAC: 00000015 [ 24.117120] Process sh (pid: 1, stack limit = 0xdf480240) [ 24.122502] Stack: (0xdf481db8 to 0xdf482000) [ 24.126843] 1da0: dee01d80 c02a14b4 [ 24.135004] 1dc0: 00000000 00000000 c07aff98 c02aec7c 00000002 00000000 00000000 c07aff98 [ 24.143164] 1de0: deca5e10 c02aecf4 c02aecd4 c02c2010 00000000 c02c9470 00000000 00000000 [ 24.151322] 1e00: 00000000 00000000 deca5e10 deca5e10 00000000 c07aff98 00000002 deca5e44 [ 24.159482] 1e20: c06d8f78 c06fb800 deca5e78 c02ca660 df7baf00 007b0aa0 deca5e10 c06fb7c8 [ 24.167641] 1e40: c07aff98 00000000 00000002 c02cbe18 9757aec5 00000005 9757aec5 00000005 [ 24.175801] 1e60: ded1d380 00000003 00000003 c05c74d8 ded1d380 c07209d4 c05c7514 c07105d8 [ 24.183960] 1e80: 01e2a738 c0068a74 00000000 c05c7514 ded1d380 c071c6e0 00000004 c07105d8 [ 24.192119] 1ea0: 01e2a738 c047f1e0 c0600cc0 df481ec4 00000003 00000000 00000003 c05c74d8 [ 24.200278] 1ec0: ded1d380 c071c6e0 c05c7514 c07105d8 01e2a738 c0069444 c06d905c 00000003 [ 24.208438] 1ee0: 00000003 ded1d380 c06d9064 00000004 c05c3fc0 c0067d4c df535ab0 ded1d380 [ 24.216596] 1f00: df481f80 ded1d380 00000004 ded1d1cc ded1d1c0 c0221724 00000004 c016ca6c [ 24.224756] 1f20: c016ca28 00000000 00000000 c016c1d4 00000000 00000000 b6f37000 df481f80 [ 24.232915] 1f40: decedd80 00000004 df480000 df480000 b6f37000 c0110920 df47839c 60000013 [ 24.241074] 1f60: 00000000 00000000 decedd80 decedd80 00000004 df480000 b6f37000 c0110da8 [ 24.249233] 1f80: 00000000 00000000 00000004 b6edf5d8 00000004 b6f37000 00000004 c000f2a8 [ 24.257393] 1fa0: 00001000 c000f0e0 b6edf5d8 00000004 00000001 b6f37000 00000004 00000000 [ 24.265551] 1fc0: b6edf5d8 00000004 b6f37000 00000004 00000004 00000001 00000000 01e2a738 [ 24.273711] 1fe0: 00000000 beba0a20 b6e1f4f0 b6e7022c 60000010 00000001 ffffffff ffffffff [ 24.281885] [] (mutex_lock) from [] (drm_modeset_lock_all+0x30/0xbc) [ 24.289950] [] (drm_modeset_lock_all) from [] (exynos_drm_suspend+0xc/0x64) [ 24.298627] [] (exynos_drm_suspend) from [] (exynos_drm_sys_suspend+0x20/0x34) [ 24.307568] [] (exynos_drm_sys_suspend) from [] (platform_pm_suspend+0x2c/0x54) [ 24.316597] [] (platform_pm_suspend) from [] (dpm_run_callback+0x48/0x170) [ 24.325188] [] (dpm_run_callback) from [] (__device_suspend+0x128/0x39c) [ 24.333606] [] (__device_suspend) from [] (dpm_suspend+0x5c/0x314) [ 24.341506] [] (dpm_suspend) from [] (suspend_devices_and_enter+0x8c/0x598) [ 24.350185] [] (suspend_devices_and_enter) from [] (pm_suspend+0x4c4/0x5d0) [ 24.358862] [] (pm_suspend) from [] (state_store+0x70/0xd4) [ 24.366156] [] (state_store) from [] (kobj_attr_store+0x14/0x20) [ 24.373885] [] (kobj_attr_store) from [] (sysfs_kf_write+0x44/0x48) [ 24.381867] [] (sysfs_kf_write) from [] (kernfs_fop_write+0xc0/0x17c) [ 24.390027] [] (kernfs_fop_write) from [] (vfs_write+0xa0/0x1c4) [ 24.397750] [] (vfs_write) from [] (SyS_write+0x40/0x8c) [ 24.404782] [] (SyS_write) from [] (ret_fast_syscall+0x0/0x3c) [ 24.412332] Code: e92d4010 e1a04000 f57ff05b f590f000 (e1903f9f) [ 24.418448] ---[ end trace cfa06690eabe8dd5 ]--- [ 24.423032] Kernel panic - not syncing: Fatal exception [ 24.428220] CPU1: stopping [ 24.430905] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G D 3.16.0-rc3-00035-geba20bbdde04-dirty #51 [ 24.440549] [] (unwind_backtrace) from [] (show_stack+0x10/0x14) [ 24.448269] [] (show_stack) from [] (dump_stack+0x80/0xcc) [ 24.455472] [] (dump_stack) from [] (handle_IPI+0x130/0x15c) [ 24.462850] [] (handle_IPI) from [] (gic_handle_irq+0x60/0x68) [ 24.470400] [] (gic_handle_irq) from [] (__irq_svc+0x40/0x70) [ 24.477860] Exception stack(0xdf4bdf88 to 0xdf4bdfd0) [ 24.482898] df80: ffffffed 00000000 00000000 00000000 df4bc000 c06d042c [ 24.491058] dfa0: 00000000 ffffffed c06d03c0 00000000 c070c288 00000000 00000000 df4bdfd0 [ 24.499214] dfc0: c0010324 c0010328 60000013 ffffffff [ 24.504254] [] (__irq_svc) from [] (arch_cpu_idle+0x28/0x30) [ 24.511634] [] (arch_cpu_idle) from [] (cpu_startup_entry+0x2c4/0x3f0) [ 24.519878] [] (cpu_startup_entry) from [<400086c4>] (0x400086c4) [ 24.526821] ---[ end Kernel panic - not syncing: Fatal exception Signed-off-by: Krzysztof Kozlowski Cc: Andrzej Hajda Cc: Inki Dae Fixes: af65c8048770 ("drm/exynos: Consolidate suspend/resume in drm_drv") Cc: --- Probably other DRM drivers may be also affected by this issue (e.g. msm). --- drivers/gpu/drm/exynos/exynos_drm_drv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index ab7d182063c3..e98a882c1bba 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -362,7 +362,7 @@ static int exynos_drm_sys_suspend(struct device *dev) struct drm_device *drm_dev = dev_get_drvdata(dev); pm_message_t message; - if (pm_runtime_suspended(dev)) + if (pm_runtime_suspended(dev) || !drm_dev) return 0; message.event = PM_EVENT_SUSPEND; @@ -373,7 +373,7 @@ static int exynos_drm_sys_resume(struct device *dev) { struct drm_device *drm_dev = dev_get_drvdata(dev); - if (pm_runtime_suspended(dev)) + if (pm_runtime_suspended(dev) || !drm_dev) return 0; return exynos_drm_resume(drm_dev);