From patchwork Thu Jan 10 20:48:07 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniel Vetter X-Patchwork-Id: 1962671 Return-Path: X-Original-To: patchwork-dri-devel@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by patchwork2.kernel.org (Postfix) with ESMTP id 39C3ADF264 for ; Thu, 10 Jan 2013 21:14:53 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 10916E65AE for ; Thu, 10 Jan 2013 13:14:53 -0800 (PST) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wi0-f175.google.com (mail-wi0-f175.google.com [209.85.212.175]) by gabe.freedesktop.org (Postfix) with ESMTP id 89DE5E6375 for ; Thu, 10 Jan 2013 12:48:53 -0800 (PST) Received: by mail-wi0-f175.google.com with SMTP id hm11so1527161wib.14 for ; Thu, 10 Jan 2013 12:48:52 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ffwll.ch; s=google; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=QCknYRRPGclQDyH4Dzcf+RXZQ3PutZd+V8Y3Z42jdA8=; b=M2JDcuZK8OTStDTbB/rbbI36U+hlhET3RbyEuzQNuihDzZcyNSx94Ukh1y+A3yMlep FFvABWWBGxrWQdAo1Eo1cwp1OKR+eayMHOsGcPmFXS94MChnJX2v2XaS9SRB7xlgCGNn ZseD+W4C9sp29X1MWJXxF78QTd3gAv1NLSA2M= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=QCknYRRPGclQDyH4Dzcf+RXZQ3PutZd+V8Y3Z42jdA8=; b=nSnJfGOhv44Eo1iJhcXWBCsvadhYraaJm9fgImLjuBc3d8AGZQ3LN7omZh1+rEVAKC sXbJG3XRGcGmPD13mrFjRj8CVzUcrgpKlUENVzxyyOMW0pwH0p+5zD+fv3Dqw82RThEE 6et5zFM3kpJ5AatIXpRRS2NgdEuy48G2lyrZVjB5tpwRgQ60qa0mZyMDaAnop9GHxJdI oBlgINtmugxf1VDM38RIHpLxmmIreXpi1A0mKOSWyCZDfMfOOdafq+V3+efMCEQK/agV WPe/mLJ9uZveahNkLPfHuqRKaIr8rw6he11PR/+/YfADZWT08cQ/M3NLQeYz3o+4XAr6 rrIg== X-Received: by 10.194.119.5 with SMTP id kq5mr116703314wjb.48.1357850932839; Thu, 10 Jan 2013 12:48:52 -0800 (PST) Received: from biers.ffwll.local (178-83-130-250.dynamic.hispeed.ch. [178.83.130.250]) by mx.google.com with ESMTPS id hu8sm9975655wib.6.2013.01.10.12.48.52 (version=TLSv1.2 cipher=ECDHE-RSA-RC4-SHA bits=128/128); Thu, 10 Jan 2013 12:48:52 -0800 (PST) From: Daniel Vetter To: DRI Development Subject: [PATCH 26/35] drm: fb refcounting for dirtyfb_ioctl Date: Thu, 10 Jan 2013 21:48:07 +0100 Message-Id: <1357850897-27102-27-git-send-email-daniel.vetter@ffwll.ch> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1357850897-27102-1-git-send-email-daniel.vetter@ffwll.ch> References: <1357850897-27102-1-git-send-email-daniel.vetter@ffwll.ch> X-Gm-Message-State: ALoCoQlWouRQ37jJagfajWzsX5OKvBlVvMSBiCv8kDx+jZTegR6MlmPIazwBZWO+mIzgom3Sjwu4 Cc: Daniel Vetter X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org Errors-To: dri-devel-bounces+patchwork-dri-devel=patchwork.kernel.org@lists.freedesktop.org We only need to ensure that the fb stays around for long enough. While at it, only grab the modeset locks when we need them (since most drivers don't implement the dirty callback, this should help jitter and stalls when using the generic modeset driver). Signed-off-by: Daniel Vetter --- drivers/gpu/drm/drm_crtc.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 8003063..ed0108e 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c @@ -2580,14 +2580,9 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, if (!drm_core_check_feature(dev, DRIVER_MODESET)) return -EINVAL; - drm_modeset_lock_all(dev); fb = drm_framebuffer_lookup(dev, r->fb_id); - if (!fb) { - ret = -EINVAL; - goto out_err1; - } - /* fb is protect by the mode_config lock, so drop the ref immediately */ - drm_framebuffer_unreference(fb); + if (!fb) + return -EINVAL; num_clips = r->num_clips; clips_ptr = (struct drm_clip_rect __user *)(unsigned long)r->clips_ptr; @@ -2625,17 +2620,19 @@ int drm_mode_dirtyfb_ioctl(struct drm_device *dev, } if (fb->funcs->dirty) { + drm_modeset_lock_all(dev); ret = fb->funcs->dirty(fb, file_priv, flags, r->color, clips, num_clips); + drm_modeset_unlock_all(dev); } else { ret = -ENOSYS; - goto out_err2; } out_err2: kfree(clips); out_err1: - drm_modeset_unlock_all(dev); + drm_framebuffer_unreference(fb); + return ret; }