From patchwork Fri Jan 22 18:32:31 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 8092341 Return-Path: X-Original-To: patchwork-intel-gfx@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 AACF59F744 for ; Fri, 22 Jan 2016 18:32:48 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BC0C620462 for ; Fri, 22 Jan 2016 18:32:47 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 7117B202DD for ; Fri, 22 Jan 2016 18:32:46 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id D630D6ECB3; Fri, 22 Jan 2016 10:32:45 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-f67.google.com (mail-wm0-f67.google.com [74.125.82.67]) by gabe.freedesktop.org (Postfix) with ESMTPS id 993106ECB3 for ; Fri, 22 Jan 2016 10:32:44 -0800 (PST) Received: by mail-wm0-f67.google.com with SMTP id l65so19020488wmf.3 for ; Fri, 22 Jan 2016 10:32:44 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=IQ/EBoMws6E0nDwxBLKZM4T+9nKj5ms/hFhSSAdIvB0=; b=PTRG9dBzBnyJBGfNy3S81/aef+ITcAEsXlwOdR7DZ8efto6L83CI968TgfDh1zRvlZ 39Ba6lgIifSkoiaPkqk4HfkWYhSqTu7oFnTWbD+nar/5HnM5AKIDoh9OnZJEc/RFpuLq S3fNC7E0TW+fLYxunnSRYPKump030iWGSPB+OLBcjDanzINVk2AYSa2b7QUnNabGnn/L Ft04qSov85ivEmGq3otKWC2Y7VCeoqzg2KcmlqylkgFzw4ZFlcG3abcZN1+6YcvSCcQA aV15327mqYm73DDfwYy6Kl1JDY+pkvHn8C2n1Arnp1BQKtyu9V87UkPk0ngBxaBIoIQr HGrQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to:references:mime-version:content-type :content-transfer-encoding; bh=IQ/EBoMws6E0nDwxBLKZM4T+9nKj5ms/hFhSSAdIvB0=; b=LvgDnPfWyXkZMx8TsFUHvHo+ablYeA4eUIRjqXzvHVmuKrkCS9yGqf6uoTEh5MxL9b D7krbsBWIoTC/oQvxyg35uv7gEI6Iiqpo1pFMJSLAI9LuUt4b82Le2Z8JaJ7B9SFy1ln 30twppKrJNjJHs7hHGiBpQX8TLJ+KRQeJOWFVLMBuOMQBJcQ+53HeJyIPpZCUoaymqZu BfLdZCGG7t6HZYtDy0Ym2y0a6rOEPzNV46RLBc68OTJDBycTlWJAJktLL48fBl9omn8B eZhQTCf6hU4k8YZT0mBXCIyDjdWfXT7s01NqgECpw17r3mfPAtxJPuuSg6hZ28tOVk2W 959g== X-Gm-Message-State: AG10YOTdxTbuo9zGBbTdj1pm7VzDK937De+D0kR7mZevUbmfGlzc/67rLOaEcjQJTmRX8w== X-Received: by 10.28.132.74 with SMTP id g71mr5351312wmd.100.1453487563167; Fri, 22 Jan 2016 10:32:43 -0800 (PST) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id lc3sm7088750wjb.7.2016.01.22.10.32.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Fri, 22 Jan 2016 10:32:41 -0800 (PST) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Fri, 22 Jan 2016 18:32:31 +0000 Message-Id: <1453487551-16799-1-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.7.0 In-Reply-To: <1452642006-23393-1-git-send-email-chris@chris-wilson.co.uk> References: <1452642006-23393-1-git-send-email-chris@chris-wilson.co.uk> MIME-Version: 1.0 Cc: Daniel Vetter Subject: [Intel-gfx] [PATCH v2] drm/i915: Allow i915_gem_object_get_page() on userptr as well X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,RP_MATCHES_RCVD,T_DKIM_INVALID,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 commit 033908aed5a596f6202c848c6bbc8a40fb1a8490 Author: Dave Gordon Date: Thu Dec 10 18:51:23 2015 +0000 drm/i915: mark GEM object pages dirty when mapped & written by the CPU introduced a check into i915_gem_object_get_dirty_pages() that returned a NULL pointer when called with a bad object, one that was not backed by shmemfs. This WARN was too strict as we can work on all struct page backed objects, and resulted in a WARN + GPF for existing userspace. In order to differentiate the various types of objects, add a new flags field to the i915_gem_object_ops struct to describe their capabilities, with the first flag being whether the object has struct pages. v2: Drop silly const before an integer in the structure declaration. Testcase: igt/gem_userptr_blits/relocations Reported-and-tested-by: Kristian Høgsberg Kristensen Signed-off-by: Chris Wilson Cc: Dave Gordon Cc: Kristian Høgsberg Kristensen Cc: Daniel Vetter Reviewed-by: Dave Gordon Reviewed-by: Kristian Høgsberg Kristensen --- drivers/gpu/drm/i915/i915_drv.h | 4 ++++ drivers/gpu/drm/i915/i915_gem.c | 3 ++- drivers/gpu/drm/i915/i915_gem_userptr.c | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 204661f9873d..bbaa177df4b5 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -1993,6 +1993,9 @@ enum hdmi_force_audio { #define I915_GTT_OFFSET_NONE ((u32)-1) struct drm_i915_gem_object_ops { + unsigned int flags; +#define I915_GEM_OBJECT_HAS_STRUCT_PAGE 0x1 + /* Interface between the GEM object and its backing storage. * get_pages() is called once prior to the use of the associated set * of pages before to binding them into the GTT, and put_pages() is @@ -2008,6 +2011,7 @@ struct drm_i915_gem_object_ops { */ int (*get_pages)(struct drm_i915_gem_object *); void (*put_pages)(struct drm_i915_gem_object *); + int (*dmabuf_export)(struct drm_i915_gem_object *); void (*release)(struct drm_i915_gem_object *); }; diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 371bbb28c471..906e5b7c67b4 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -4465,6 +4465,7 @@ void i915_gem_object_init(struct drm_i915_gem_object *obj, } static const struct drm_i915_gem_object_ops i915_gem_object_ops = { + .flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE, .get_pages = i915_gem_object_get_pages_gtt, .put_pages = i915_gem_object_put_pages_gtt, }; @@ -5302,7 +5303,7 @@ i915_gem_object_get_dirty_page(struct drm_i915_gem_object *obj, int n) struct page *page; /* Only default objects have per-page dirty tracking */ - if (WARN_ON(obj->ops != &i915_gem_object_ops)) + if (WARN_ON((obj->ops->flags & I915_GEM_OBJECT_HAS_STRUCT_PAGE) == 0)) return NULL; page = i915_gem_object_get_page(obj, n); diff --git a/drivers/gpu/drm/i915/i915_gem_userptr.c b/drivers/gpu/drm/i915/i915_gem_userptr.c index 19fb0bddc1cd..59e45b3a6937 100644 --- a/drivers/gpu/drm/i915/i915_gem_userptr.c +++ b/drivers/gpu/drm/i915/i915_gem_userptr.c @@ -789,9 +789,10 @@ i915_gem_userptr_dmabuf_export(struct drm_i915_gem_object *obj) } static const struct drm_i915_gem_object_ops i915_gem_userptr_ops = { - .dmabuf_export = i915_gem_userptr_dmabuf_export, + .flags = I915_GEM_OBJECT_HAS_STRUCT_PAGE, .get_pages = i915_gem_userptr_get_pages, .put_pages = i915_gem_userptr_put_pages, + .dmabuf_export = i915_gem_userptr_dmabuf_export, .release = i915_gem_userptr_release, };