From patchwork Mon Jan 11 10:45:25 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 8001641 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 C38639F8AA for ; Mon, 11 Jan 2016 10:50:22 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E3BF220295 for ; Mon, 11 Jan 2016 10:50:21 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id C93762028D for ; Mon, 11 Jan 2016 10:50:20 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5CEA46E452; Mon, 11 Jan 2016 02:50:19 -0800 (PST) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by gabe.freedesktop.org (Postfix) with ESMTPS id 3FF086E2E3 for ; Mon, 11 Jan 2016 02:47:31 -0800 (PST) Received: by mail-wm0-f65.google.com with SMTP id b14so25706035wmb.1 for ; Mon, 11 Jan 2016 02:47:31 -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; bh=5Xi++DUUdYleyAwO237SDdDRw5wPizNz1NiN6YT1IjU=; b=RhIqfI4JbJ45YXk9ZsXBXsm6nwXabSSYZr+3tM6cXUog5KJ1cAGroqWn9ENE61PQB1 iIwIi614GOLl50mBtVHxZrLEVQIbPBs3BHk9NRGAfy233QCNLB7UtBtTDrTUa4zjHwxx VaYV1z6wCzKVpIJLUjbWMUsdL0SKBp5swwspyNn+/qUgTsJ4C/iRWpGhdSmykpLHiwss B5mU4EI9k1vLCkTDYp8FxL7unkdPI6G8j4MUEZZMGbjbPqT+xktjJXS8RiFrj+JGjA7p /w7BFUpcL/oaDqGDAJ1MRCQ5jAYOgY3PxgpbNSVIpwgZ7yN5xGMjksJ8fHPakPjfxlm8 xzaw== X-Received: by 10.28.54.65 with SMTP id d62mr12350609wma.35.1452509249937; Mon, 11 Jan 2016 02:47:29 -0800 (PST) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id t3sm118879383wjz.11.2016.01.11.02.47.28 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Mon, 11 Jan 2016 02:47:28 -0800 (PST) From: Chris Wilson To: intel-gfx@lists.freedesktop.org Date: Mon, 11 Jan 2016 10:45:25 +0000 Message-Id: <1452509174-16671-55-git-send-email-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.7.0.rc3 In-Reply-To: <1452509174-16671-1-git-send-email-chris@chris-wilson.co.uk> References: <1452503961-14837-1-git-send-email-chris@chris-wilson.co.uk> <1452509174-16671-1-git-send-email-chris@chris-wilson.co.uk> Subject: [Intel-gfx] [PATCH 141/190] drm/i915: Choose not to evict faultable objects from the GGTT 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: , MIME-Version: 1.0 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 Often times we do not want to evict mapped objects from the GGTT as these are quite expensive to teardown and frequently reused (causing an equally, if not more so, expensive setup). In particular, when faulting in a new object we want to avoid evicting an active object, or else we may trigger a page-fault-of-doom as we ping-pong between evicting two objects. Signed-off-by: Chris Wilson --- drivers/gpu/drm/i915/i915_drv.h | 7 ++++--- drivers/gpu/drm/i915/i915_gem.c | 4 +++- drivers/gpu/drm/i915/i915_gem_evict.c | 7 +++++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index bb0f750bb5b5..45b8cbdfab55 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h @@ -2709,9 +2709,10 @@ i915_vma_pin(struct i915_vma *vma, #define PIN_MAPPABLE (1<<3) #define PIN_ZONE_4G (1<<4) #define PIN_NONBLOCK (1<<5) -#define PIN_HIGH (1<<6) -#define PIN_OFFSET_BIAS (1<<7) -#define PIN_OFFSET_FIXED (1<<8) +#define PIN_NOFAULT (1<<6) +#define PIN_HIGH (1<<7) +#define PIN_OFFSET_BIAS (1<<8) +#define PIN_OFFSET_FIXED (1<<9) #define PIN_OFFSET_MASK (~4095) static inline void __i915_vma_unpin(struct i915_vma *vma) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index a8f4d4633bdb..60dfee56f6ef 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -1483,7 +1483,9 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf) /* Use a partial view if the object is bigger than the aperture. */ /* Now pin it into the GTT if needed */ ggtt = i915_gem_object_ggtt_pin(obj, NULL, 0, 0, - PIN_MAPPABLE | PIN_NONBLOCK); + PIN_MAPPABLE | + PIN_NONBLOCK | + PIN_NOFAULT); if (IS_ERR(ggtt)) { static const unsigned int chunk_size = 256; // 1 MiB struct i915_ggtt_view partial; diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index 679b7dd3a312..fdc4941be15a 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -64,7 +64,7 @@ static int switch_to_pinned_context(struct drm_i915_private *dev_priv) } static bool -mark_free(struct i915_vma *vma, struct list_head *unwind) +mark_free(struct i915_vma *vma, unsigned flags, struct list_head *unwind) { if (vma->pin_count) return false; @@ -72,6 +72,9 @@ mark_free(struct i915_vma *vma, struct list_head *unwind) if (WARN_ON(!list_empty(&vma->exec_list))) return false; + if (flags & PIN_NOFAULT && vma->obj->fault_mappable) + return false; + list_add(&vma->exec_list, unwind); return drm_mm_scan_add_block(&vma->node); } @@ -146,7 +149,7 @@ search_again: phase = phases; do { list_for_each_entry(vma, *phase, vm_link) - if (mark_free(vma, &eviction_list)) + if (mark_free(vma, flags, &eviction_list)) goto found; } while (*++phase);