From patchwork Tue Dec 8 08:49:20 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Daniel Vetter X-Patchwork-Id: 7795751 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.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 501A9BEEE1 for ; Tue, 8 Dec 2015 08:49:42 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 6A8FB2034C for ; Tue, 8 Dec 2015 08:49:41 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 2583C204D6 for ; Tue, 8 Dec 2015 08:49:40 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 6475C6E526; Tue, 8 Dec 2015 00:49:36 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm0-f45.google.com (mail-wm0-f45.google.com [74.125.82.45]) by gabe.freedesktop.org (Postfix) with ESMTPS id 106AD6E4F8 for ; Tue, 8 Dec 2015 00:49:34 -0800 (PST) Received: by wmww144 with SMTP id w144so20442420wmw.0 for ; Tue, 08 Dec 2015 00:49:32 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=011w1XxiGG9/eY+l3ojcb97hgpf3papk9Fs94pS/PTw=; b=WA6fB0MlB3ZZD72ZQeIuP3yCzwLV6wnx2wRYqi/mnkVeeuRsJVZ51wg/BX2q1AU9Jj xSx+zUUnuD/YCxHy2iWz7o7mKQ+uSayVGkWkfYR/+OAaGqQZ7tbO617rF5jwlqt1vt45 Yskac1NTSDcb5+Eofj9HV0AXtOhVYrrzdRyak= 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:mime-version:content-type:content-transfer-encoding; bh=011w1XxiGG9/eY+l3ojcb97hgpf3papk9Fs94pS/PTw=; b=OW/+Nt1Qc6H5jBvpve4tChoeHp+aLrBj2wBRy9FAcXPyC5DAFzsHsfQvZwO7FgVlHM om99VfPAkSADmbBbH+796BUwsEJSVgRLCjhj27NMcVTBmpuuFpgE70C+cjndFnsbtCOO SpCzClYwjF11GjUiwAq4TutgClKA+cJmhDsVDvNj4jQE56pcJHeEY1w2sKKsvTmwUh6t RTdUqKCImOI3hvGyEbQ86lOKlYJ+TXHeQOdO6qWoBK/+dzNFUGQsJPCeGmsz4GnjIvig ZNxjTYCvAjeqQqIp8ivNdARWoEmTJtXm1ofgn1wv7rW7PHZiwoFhHa6t2wgCMTAi4cPA 925A== X-Gm-Message-State: ALoCoQk4mNarcvt2uA2xnSjejy6wNkJLUpumeqms7J1P8Tv7c6fLhqMm/wmSaGkekG3+uCsJSSAyTWFs89G5Ts+5+YXfgQIFlQ== X-Received: by 10.194.116.40 with SMTP id jt8mr2698480wjb.57.1449564572632; Tue, 08 Dec 2015 00:49:32 -0800 (PST) Received: from phenom.ffwll.local (212-51-149-109.fiber7.init7.net. [212.51.149.109]) by smtp.gmail.com with ESMTPSA id e83sm2393423wmc.23.2015.12.08.00.49.31 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 08 Dec 2015 00:49:32 -0800 (PST) From: Daniel Vetter To: DRI Development Subject: [PATCH 4/5] drm/atomic-helper: Reject legacy flips on a disabled pipe Date: Tue, 8 Dec 2015 09:49:20 +0100 Message-Id: <1449564561-3896-4-git-send-email-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 2.5.1 In-Reply-To: <1449564561-3896-1-git-send-email-daniel.vetter@ffwll.ch> References: <1449564561-3896-1-git-send-email-daniel.vetter@ffwll.ch> MIME-Version: 1.0 Cc: Daniel Vetter , Intel Graphics Development , Daniel Stone X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, 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 We want this for consistency with existing page_flip semantics. Since this spurred quite a discussion on IRC also document why we reject even generation when the pipe is off: It's not that it's hard to implement, but userspace has a track recording proofing that it's way too easy to accidentally abuse and cause havoc. We want to make sure userspace doesn't get away with that. v2: Somehow thought we do reject events already, but that code only existed in my imagination ... Also suggestions from Thierry. Cc: Daniel Stone Cc: Ville Syrjälä Cc: Thierry Reding Signed-off-by: Daniel Vetter Reviewed-by: Daniel Stone --- drivers/gpu/drm/drm_atomic.c | 16 ++++++++++++++++ drivers/gpu/drm/drm_atomic_helper.c | 9 +++++++++ include/drm/drm_crtc.h | 3 ++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/drm_atomic.c b/drivers/gpu/drm/drm_atomic.c index 07ab75e22b2b..029377513b1d 100644 --- a/drivers/gpu/drm/drm_atomic.c +++ b/drivers/gpu/drm/drm_atomic.c @@ -508,6 +508,22 @@ static int drm_atomic_crtc_check(struct drm_crtc *crtc, return -EINVAL; } + /* + * Reject event generation for when a CRTC is off and stays off. + * It wouldn't be hard to implement this, but userspace has a track + * record of happily burning through 100% cpu (or worse, crash) when the + * display pipe is suspended. To avoid all that fun just reject updates + * that ask for events since likely that indicates a bug in the + * compositor's drawing loop. This is consistent with the vblank IOCTL + * and legacy page_flip IOCTL which also reject service on a disabled + * pipe. + */ + if (state->event && !state->active && !crtc->state->active) { + DRM_DEBUG_ATOMIC("[CRTC:%d] requesting event but off\n", + crtc->base.id); + return -EINVAL; + } + return 0; } diff --git a/drivers/gpu/drm/drm_atomic_helper.c b/drivers/gpu/drm/drm_atomic_helper.c index 76c124b2a775..9eb367cad790 100644 --- a/drivers/gpu/drm/drm_atomic_helper.c +++ b/drivers/gpu/drm/drm_atomic_helper.c @@ -2282,6 +2282,15 @@ retry: goto fail; drm_atomic_set_fb_for_plane(plane_state, fb); + /* Make sure we don't accidentally do a full modeset. */ + state->allow_modeset = false; + if (!crtc_state->active) { + DRM_DEBUG_ATOMIC("[CRTC:%d] disabled, rejecting legacy flip\n", + crtc->base.id); + ret = -EINVAL; + goto fail; + } + ret = drm_atomic_async_commit(state); if (ret != 0) goto fail; diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 6fe14a773def..6da847a6cb2f 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h @@ -548,7 +548,8 @@ struct drm_crtc_funcs { * ->page_flip() operation is already pending the callback should return * -EBUSY. Pageflips on a disabled CRTC (either by setting a NULL mode * or just runtime disabled through DPMS respectively the new atomic - * "ACTIVE" state) should result in an -EINVAL error code. + * "ACTIVE" state) should result in an -EINVAL error code. Note that + * drm_atomic_helper_page_flip() checks this already for atomic drivers. */ int (*page_flip)(struct drm_crtc *crtc, struct drm_framebuffer *fb,