From patchwork Tue Dec 8 11:22:47 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Whitcroft X-Patchwork-Id: 553870 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from huckleberry.canonical.com (huckleberry.canonical.com [91.189.94.19]) by ozlabs.org (Postfix) with ESMTP id 8B768140518; Tue, 8 Dec 2015 22:23:01 +1100 (AEDT) Received: from localhost ([127.0.0.1] helo=huckleberry.canonical.com) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1a6GMF-0003lF-ID; Tue, 08 Dec 2015 11:22:59 +0000 Received: from mail-wm0-f49.google.com ([74.125.82.49]) by huckleberry.canonical.com with esmtp (Exim 4.76) (envelope-from ) id 1a6GM6-0003jI-0i for kernel-team@lists.ubuntu.com; Tue, 08 Dec 2015 11:22:50 +0000 Received: by wmuu63 with SMTP id u63so176970598wmu.0 for ; Tue, 08 Dec 2015 03:22:49 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=60aGHW66tJ0dD4qUjO9sjUIf8bjABVunAj+M9DgiJyI=; b=h25cD67oiD+kBEjmrQvjVXmy80T6cqWoiLhvtjJyiVNGNpIOwiNTSobHCb0fYFiikj f/LziQSGLPAxklGbQD8+6so5juX/+1xQ51c1l76xJMCnju5crt7QP9Trdo+MAuKjaQ9w sbzcTlJivrtVYex5LgnsmhEOcXFqVzOsvTuzrU/d2+98wXQeuZOr1HwbW7/Iu8O0iPZr +xD7qinA5vrjgHsXVcT3yW6TIvAkWnHAaNy3gSib/fTY0y/XJ5bKdiT/O+FQ+US/teOa XYFGPpp9vD5zGZ73aMb+dFLYL7ayXXP3J178C4llmF4WjXJHEgCX7A2eULNUlIVPasC0 aSPg== X-Gm-Message-State: ALoCoQlqJC5kKOKpfvz80xScIbAt88dmoeZA9wlqt0OiDofT/EDM7k8cYb1oCj8WkQh3cm4MWTF8CyLaYxxeIbyjzQ5Wn/pz0A== X-Received: by 10.28.186.138 with SMTP id k132mr4048099wmf.75.1449573769844; Tue, 08 Dec 2015 03:22:49 -0800 (PST) Received: from localhost ([2001:470:6973:2:c685:8ff:fe03:779e]) by smtp.gmail.com with ESMTPSA id u4sm2559959wjz.4.2015.12.08.03.22.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 Dec 2015 03:22:49 -0800 (PST) From: Andy Whitcroft To: kernel-team@lists.ubuntu.com Subject: [vivid/master-next 1/1] drm/fbdev: Return -EBUSY when oopsing Date: Tue, 8 Dec 2015 11:22:47 +0000 Message-Id: <1449573767-27545-2-git-send-email-apw@canonical.com> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1449573767-27545-1-git-send-email-apw@canonical.com> References: <8082FF9BCB2B054996454E47167FF4EC0B0F3193@SHSMSX104.ccr.corp.intel.com> <1449573767-27545-1-git-send-email-apw@canonical.com> Cc: Andy Whitcroft X-BeenThere: kernel-team@lists.ubuntu.com X-Mailman-Version: 2.1.14 Precedence: list List-Id: Kernel team discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: kernel-team-bounces@lists.ubuntu.com Sender: kernel-team-bounces@lists.ubuntu.com From: Daniel Vetter Trying to do anything with kms drivers when oopsing has become a failing proposition. But since we can end up in the fbdev code simply due to the console unblanking that's done unconditionally just removing our panic handler isn't enough. We need to block all fbdev callbacks when oopsing. There was already one in the blank handler, but it failed silently. That makes it impossible for drivers (like i915) who subclass these functions to figure this out. Instead consistently return -EBUSY so that everyone knows that we really don't want to be bothered right now. This also allows us to remove a pile of FIXMEs from the i915 fbdev code (since due to the failure code they now won't attempt to grab dangerous locks any more). Cc: Dave Airlie Cc: Rodrigo Vivi Reviewed-by: Rob Clark Signed-off-by: Daniel Vetter (backported from commit c50bfd08d60cefbe1714c4a53b1c325982858549) BugLink: http://bugs.launchpad.net/bugs/1520427 Signed-off-by: Andy Whitcroft --- drivers/gpu/drm/drm_fb_helper.c | 24 ++++++++++++------------ drivers/gpu/drm/i915/intel_fbdev.c | 7 ------- 2 files changed, 12 insertions(+), 19 deletions(-) diff --git a/drivers/gpu/drm/drm_fb_helper.c b/drivers/gpu/drm/drm_fb_helper.c index dc386eb..f64dfa1 100644 --- a/drivers/gpu/drm/drm_fb_helper.c +++ b/drivers/gpu/drm/drm_fb_helper.c @@ -504,14 +504,6 @@ static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode) int i, j; /* - * fbdev->blank can be called from irq context in case of a panic. - * Since we already have our own special panic handler which will - * restore the fbdev console mode completely, just bail out early. - */ - if (oops_in_progress) - return; - - /* * For each CRTC in this fb, turn the connectors on/off. */ drm_modeset_lock_all(dev); @@ -544,6 +536,9 @@ static void drm_fb_helper_dpms(struct fb_info *info, int dpms_mode) */ int drm_fb_helper_blank(int blank, struct fb_info *info) { + if (oops_in_progress) + return -EBUSY; + switch (blank) { /* Display: On; HSync: On, VSync: On */ case FB_BLANK_UNBLANK: @@ -771,9 +766,10 @@ int drm_fb_helper_setcmap(struct fb_cmap *cmap, struct fb_info *info) int i, j, rc = 0; int start; - if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { + if (oops_in_progress) return -EBUSY; - } + + drm_modeset_lock_all(dev); if (!drm_fb_helper_is_bound(fb_helper)) { drm_modeset_unlock_all(dev); return -EBUSY; @@ -922,6 +918,9 @@ int drm_fb_helper_set_par(struct fb_info *info) struct drm_fb_helper *fb_helper = info->par; struct fb_var_screeninfo *var = &info->var; + if (oops_in_progress) + return -EBUSY; + if (var->pixclock != 0) { DRM_ERROR("PIXEL CLOCK SET\n"); return -EINVAL; @@ -947,9 +946,10 @@ int drm_fb_helper_pan_display(struct fb_var_screeninfo *var, int ret = 0; int i; - if (__drm_modeset_lock_all(dev, !!oops_in_progress)) { + if (oops_in_progress) return -EBUSY; - } + + drm_modeset_lock_all(dev); if (!drm_fb_helper_is_bound(fb_helper)) { drm_modeset_unlock_all(dev); return -EBUSY; diff --git a/drivers/gpu/drm/i915/intel_fbdev.c b/drivers/gpu/drm/i915/intel_fbdev.c index 850cf7d..a178d27 100644 --- a/drivers/gpu/drm/i915/intel_fbdev.c +++ b/drivers/gpu/drm/i915/intel_fbdev.c @@ -55,13 +55,6 @@ static int intel_fbdev_set_par(struct fb_info *info) ret = drm_fb_helper_set_par(info); if (ret == 0) { - /* - * FIXME: fbdev presumes that all callbacks also work from - * atomic contexts and relies on that for emergency oops - * printing. KMS totally doesn't do that and the locking here is - * by far not the only place this goes wrong. Ignore this for - * now until we solve this for real. - */ mutex_lock(&fb_helper->dev->struct_mutex); ret = i915_gem_object_set_to_gtt_domain(ifbdev->fb->obj, true);