From patchwork Fri Jan 8 08:46:00 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Inki Dae X-Patchwork-Id: 7983361 Return-Path: X-Original-To: patchwork-linux-samsung-soc@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 773539F859 for ; Fri, 8 Jan 2016 08:46:13 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9953B20107 for ; Fri, 8 Jan 2016 08:46:12 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A9F2E201C8 for ; Fri, 8 Jan 2016 08:46:09 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754421AbcAHIqI (ORCPT ); Fri, 8 Jan 2016 03:46:08 -0500 Received: from mailout4.samsung.com ([203.254.224.34]:56474 "EHLO mailout4.samsung.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754221AbcAHIqG (ORCPT ); Fri, 8 Jan 2016 03:46:06 -0500 Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout4.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTP id <0O0M029UBLORM000@mailout4.samsung.com> for linux-samsung-soc@vger.kernel.org; Fri, 08 Jan 2016 17:46:03 +0900 (KST) Received: from epcpsbgm1new.samsung.com ( [172.20.52.113]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 1C.BB.04972.B477F865; Fri, 8 Jan 2016 17:46:03 +0900 (KST) X-AuditID: cbfee68e-f793c6d00000136c-26-568f774bcec7 Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1new.samsung.com (EPCPMTA) with SMTP id 21.EC.13906.B477F865; Fri, 8 Jan 2016 17:46:03 +0900 (KST) Received: from localhost.localdomain ([10.113.62.206]) by mmp2.samsung.com (Oracle Communications Messaging Server 7.0.5.31.0 64bit (built May 5 2014)) with ESMTPA id <0O0M00KE6LOQSU80@mmp2.samsung.com>; Fri, 08 Jan 2016 17:46:03 +0900 (KST) From: Inki Dae To: dri-devel@lists.freedesktop.org Cc: linux-samsung-soc@vger.kernel.org, Inki Dae Subject: [PATCH v3] drm/exynos: fix kernel panic issue at drm releasing Date: Fri, 08 Jan 2016 17:46:00 +0900 Message-id: <1452242760-20298-2-git-send-email-inki.dae@samsung.com> X-Mailer: git-send-email 1.9.1 In-reply-to: <1452242760-20298-1-git-send-email-inki.dae@samsung.com> References: <1452242760-20298-1-git-send-email-inki.dae@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrNLMWRmVeSWpSXmKPExsWyRsSkUNe7vD/MYOc/PYsrX9+zWUy6P4HF Ysb5fUwOzB73u48zefRtWcXo8XmTXABzFJdNSmpOZllqkb5dAlfG3Lt+Bb2SFbfWf2ZtYNwr 2sXIySEhYCLx+85+VghbTOLCvfVsXYxcHEICKxgllt+bxdLFyAFWdOARI0R8FqPE3tdnoJwf jBLzNzWwg3SzCahKTFxxnw3EFhFQlvg7cRUjiM0s4Cax+PRyFhBbWMBd4uLSLWDbWIDqW38d YARZwCvgInG83RviCDmJk8cmg5VwCrhKHHq8gwnEFgIq+Xb1OdheCYHPbBLPV35nh5gjIPFt 8iGoQ2UlNh1ghpgjKXFwxQ2WCYzCCxgZVjGKphYkFxQnpRcZ6RUn5haX5qXrJefnbmIEhunp f8/6djDePGB9iFGAg1GJh5djR1+YEGtiWXFl7iFGU6ANE5mlRJPzgdGQVxJvaGxmZGFqYmps ZG5ppiTOmyD1M1hIID2xJDU7NbUgtSi+qDQntfgQIxMHp1QDY73L6dM6r9JzuPIn7mw4/l35 ZfRztd0Pqj2vblNY+HFR4u9rRz9s5GXR1Drx3qHrQ5XK2vBJU/9Xh30OT7kZ2sCp2hGWIH/6 jfX7KTmL1TSYkhOOy23/u25vX4H39z2RZ7oY9/1iyJ/o/upqrOl34+AjsjZ//Tff/XGP6/rS dXJxAplTTjZLJimxFGckGmoxFxUnAgBZP2GaTgIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFupgkeLIzCtJLcpLzFFi42I5/e+xoK53eX+YwcYbWhZXvr5ns5h0fwKL xYzz+5gcmD3udx9n8ujbsorR4/MmuQDmqAZGm4zUxJTUIoXUvOT8lMy8dFsl7+B453hTMwND XUNLC3MlhbzE3FRbJRefAF23zBygTUoKZYk5pUChgMTiYiV9O0wTQkPcdC1gGiN0fUOC4HqM DNBAwhrGjLl3/Qp6JSturf/M2sC4V7SLkYNDQsBE4sAjxi5GTiBTTOLCvfVsXYxcHEICsxgl 9r4+wwjh/GCUmL+pgR2kik1AVWLiivtsILaIgLLE34mrwLqZBdwkFp9ezgJiCwu4S1xcuoUV xGYBqm/9dYARZBmvgIvE8XZviGVyEiePTQYr4RRwlTj0eAcTiC0EVPLt6nPGCYy8CxgZVjFK pBYkFxQnpeca5qWW6xUn5haX5qXrJefnbmIEx8IzqR2MB3e5H2IU4GBU4uFN2NUXJsSaWFZc mXuIUYKDWUmEd1Fxf5gQb0piZVVqUX58UWlOavEhRlOguyYyS4km5wPjNK8k3tDYxMzI0sjc 0MLI2FxJnLf2UmSYkEB6YklqdmpqQWoRTB8TB6dUA2PGLInNFjqme1xUP6RftPo/wTyFlc0q s+Pa/73i777veNRyQaCpavkHd6n1/Rosd0s+qeSt6+7uuWyq9u9GfdvC2P16m95GS9zt8Jxr fjXK7O+GJZY/vF3upZUknG225ZLXrrB+ULTaY5aARtfvykcrDB6yFEsxPDgpGCb3If7GcoHD Bmemn1NiKc5INNRiLipOBABey0hAmwIAAA== DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected Sender: linux-samsung-soc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-samsung-soc@vger.kernel.org X-Spam-Status: No, score=-6.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, 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 This patch fixes a kernel panic issue which happened when drm driver is closed while modetest. This issue could be reproduced easily by launching modetest with page flip repeatedly. The reason is that invalid drm_file object could be accessed by send_vblank_event function when finishing page flip if the drm_file object was removed by drm_release and there was a pended page flip event which was already committed to hardware. So this patch makes the pended page flip event to be cancelled by preclose callback which is called at front of drm_release function. Changelog v2: - free vblank event objects belonging to the request process, increment event space and decrease pending_update when cancelling the event Changelog v3: - initialize only device specific things. Each page flip event object is created by DRM core so DRM core should release the object including incrementing event space. Signed-off-by: Inki Dae Reviewed-by: Daniel Stone --- drivers/gpu/drm/exynos/exynos_drm_crtc.c | 15 +++++++++++++++ drivers/gpu/drm/exynos/exynos_drm_crtc.h | 3 +++ drivers/gpu/drm/exynos/exynos_drm_drv.c | 5 +++++ 3 files changed, 23 insertions(+) diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.c b/drivers/gpu/drm/exynos/exynos_drm_crtc.c index cd94981..8b503a0 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.c +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.c @@ -226,3 +226,18 @@ void exynos_drm_crtc_te_handler(struct drm_crtc *crtc) if (exynos_crtc->ops->te_handler) exynos_crtc->ops->te_handler(exynos_crtc); } + +void exynos_drm_crtc_cancel_page_flip(struct drm_crtc *crtc) +{ + struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc); + struct drm_pending_vblank_event *e; + unsigned long flags; + + spin_lock_irqsave(&crtc->dev->event_lock, flags); + e = exynos_crtc->event; + if (e) { + exynos_crtc->event = NULL; + atomic_dec(&exynos_crtc->pending_update); + } + spin_unlock_irqrestore(&crtc->dev->event_lock, flags); +} diff --git a/drivers/gpu/drm/exynos/exynos_drm_crtc.h b/drivers/gpu/drm/exynos/exynos_drm_crtc.h index 6a581a8..b4def6e 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_crtc.h +++ b/drivers/gpu/drm/exynos/exynos_drm_crtc.h @@ -40,4 +40,7 @@ int exynos_drm_crtc_get_pipe_from_type(struct drm_device *drm_dev, */ void exynos_drm_crtc_te_handler(struct drm_crtc *crtc); +/* This function cancels a page flip request. */ +void exynos_drm_crtc_cancel_page_flip(struct drm_crtc *crtc); + #endif diff --git a/drivers/gpu/drm/exynos/exynos_drm_drv.c b/drivers/gpu/drm/exynos/exynos_drm_drv.c index 9756797a..57c0e7d 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_drv.c +++ b/drivers/gpu/drm/exynos/exynos_drm_drv.c @@ -330,7 +330,12 @@ err_file_priv_free: static void exynos_drm_preclose(struct drm_device *dev, struct drm_file *file) { + struct drm_crtc *crtc; + exynos_drm_subdrv_close(dev, file); + + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) + exynos_drm_crtc_cancel_page_flip(crtc); } static void exynos_drm_postclose(struct drm_device *dev, struct drm_file *file)