From patchwork Mon Dec 12 11:53:48 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Chris Wilson X-Patchwork-Id: 9470571 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 7F2D460760 for ; Mon, 12 Dec 2016 11:55:45 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 73FF128472 for ; Mon, 12 Dec 2016 11:55:45 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 68F2428478; Mon, 12 Dec 2016 11:55:45 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id E283928472 for ; Mon, 12 Dec 2016 11:55:44 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id AF0896E305; Mon, 12 Dec 2016 11:54:42 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from mail-wm0-x243.google.com (mail-wm0-x243.google.com [IPv6:2a00:1450:400c:c09::243]) by gabe.freedesktop.org (Postfix) with ESMTPS id 9780B6E2D2; Mon, 12 Dec 2016 11:54:32 +0000 (UTC) Received: by mail-wm0-x243.google.com with SMTP id g23so10772540wme.1; Mon, 12 Dec 2016 03:54:32 -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=Bx+U8haWdgIhq+MVXm2igVa8BCmQzRB1cdI6T40ysSg=; b=Rs7habJlGuiVsh4wiRG98X1X236gfKDJCXij0K5O28fiWdAbg6lQgh1IPJqIzEFNGp mTeNjD0dExfABO7LF7ftLDgTyiBwMJwDShz/Tb48rS0R3Uze7KLFMJ7cf2MCrcjx9D2I 1M2tCP4p/pPwwUnjTB2LpSlbd1UR1fS4eO2YbNpoxINwdjjRKx8yef9WSJRVU0Goe2MF sWZLrdpA+z7VjJLjCPVxtwSmQy19ZANlvQfdk5ZiS0bLkuNeLxvA6q91i29x4QEpRZ9O eLaui0nQ23SgUBBZaQenWOWRhF+le5L0KlPG2B74dOn9JWrDMaH9KPWP29ovR4ftJCeL ZSig== 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; bh=Bx+U8haWdgIhq+MVXm2igVa8BCmQzRB1cdI6T40ysSg=; b=UGk/yGNCNv7uVze0bxpxdsl4jrJ07F8VA+xrlxDqWQxym67OSwEfwSQVeq7cmLY+Kt u8rUNqMJhEKhfR2AIuxlslJ4i28PQSZ/bVXNNJ3O2uPhEFnJ7DZFOAW0e89PqgmLw+Nf pH0oprQ8So9sGMtUq+UzDJG7MIdr6bkGSxcnIcE5zDHsKNYSpaCvtFRDGSlqC1Zvf0UC Pa9kFz+jzzSl5DtvnMcyg6M/CAqqMeUsmXrISFNYLP+LIQnw6ixqH0A9yqpNd6KKXbwY yJ09uLtaXC930RwBlPFskBrxzYhe3qBDx8dBOFtaafmDpa1NNjcxyzRGFmHnA2rMT8wr bc3Q== X-Gm-Message-State: AKaTC01NsEAKo4rECakT7ezKhrv2e8pQWH3CEsuJRz8aRjP4oagg3SJ/pAin/mMpUFXxYg== X-Received: by 10.28.31.23 with SMTP id f23mr9656823wmf.94.1481543670512; Mon, 12 Dec 2016 03:54:30 -0800 (PST) Received: from haswell.alporthouse.com ([78.156.65.138]) by smtp.gmail.com with ESMTPSA id u81sm35077381wmu.10.2016.12.12.03.54.29 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 12 Dec 2016 03:54:29 -0800 (PST) From: Chris Wilson To: dri-devel@lists.freedesktop.org Subject: [PATCH 32/34] drm: Apply tight eviction scanning to color_adjust Date: Mon, 12 Dec 2016 11:53:48 +0000 Message-Id: <20161212115350.780-33-chris@chris-wilson.co.uk> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20161212115350.780-1-chris@chris-wilson.co.uk> References: <20161212115350.780-1-chris@chris-wilson.co.uk> Cc: intel-gfx@lists.freedesktop.org, joonas.lahtinen@linux.intel.com 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: , MIME-Version: 1.0 Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" X-Virus-Scanned: ClamAV using ClamSMTP Using mm->color_adjust makes the eviction scanner much tricker since we don't know the actual neighbours of the target hole until after it is created (after scanning is complete). To work out whether we need to evict the neighbours because they impact upon the hole, we have to then check the hole afterwards - requiring an extra step in the user of the eviction scanner when they apply color_adjust. Signed-off-by: Chris Wilson --- drivers/gpu/drm/drm_mm.c | 46 +++++++++++++++++++++------------ drivers/gpu/drm/i915/i915_gem_evict.c | 6 +++++ drivers/gpu/drm/selftests/test-drm_mm.c | 20 ++++++++++++++ include/drm/drm_mm.h | 1 + 4 files changed, 56 insertions(+), 17 deletions(-) diff --git a/drivers/gpu/drm/drm_mm.c b/drivers/gpu/drm/drm_mm.c index ba1a244fe6e5..b061066066d8 100644 --- a/drivers/gpu/drm/drm_mm.c +++ b/drivers/gpu/drm/drm_mm.c @@ -823,23 +823,8 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan, } } - if (mm->color_adjust) { - /* If allocations need adjusting due to neighbouring colours, - * we do not have enough information to decide if we need - * to evict nodes on either side of [adj_start, adj_end]. - * What almost works is - * hit_start = adj_start + (hole_start - col_start); - * hit_end = adj_start + scan->size + (hole_end - col_end); - * but because the decision is only made on the final hole, - * we may underestimate the required adjustments for an - * interior allocation. - */ - scan->hit_start = hole_start; - scan->hit_end = hole_end; - } else { - scan->hit_start = adj_start; - scan->hit_end = adj_start + scan->size; - } + scan->hit_start = adj_start; + scan->hit_end = adj_start + scan->size; DRM_MM_BUG_ON(scan->hit_start >= scan->hit_end); DRM_MM_BUG_ON(scan->hit_start < hole_start); @@ -887,6 +872,33 @@ bool drm_mm_scan_remove_block(struct drm_mm_scan *scan, } EXPORT_SYMBOL(drm_mm_scan_remove_block); +struct drm_mm_node *drm_mm_scan_color_evict(struct drm_mm_scan *scan) +{ + struct drm_mm *mm = scan->mm; + struct drm_mm_node *hole; + u64 hole_start, hole_end; + + if (!mm->color_adjust) + return NULL; + + hole = list_first_entry(&mm->hole_stack, typeof(*hole), hole_stack); + + hole_start = __drm_mm_hole_node_start(hole); + hole_end = __drm_mm_hole_node_end(hole); + + DRM_MM_BUG_ON(hole_start > scan->hit_start); + DRM_MM_BUG_ON(hole_end < scan->hit_end); + + mm->color_adjust(hole, scan->color, &hole_start, &hole_end); + if (hole_start > scan->hit_start) + return hole; + if (hole_end < scan->hit_end) + return list_next_entry(hole, node_list); + + return NULL; +} +EXPORT_SYMBOL(drm_mm_scan_color_evict); + /** * drm_mm_init - initialize a drm-mm allocator * @mm: the drm_mm structure to initialize diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c index 89da9225043f..e4987e354311 100644 --- a/drivers/gpu/drm/i915/i915_gem_evict.c +++ b/drivers/gpu/drm/i915/i915_gem_evict.c @@ -108,6 +108,7 @@ i915_gem_evict_something(struct i915_address_space *vm, NULL, }, **phase; struct i915_vma *vma, *next; + struct drm_mm_node *node; int ret; lockdep_assert_held(&vm->i915->drm.struct_mutex); @@ -212,6 +213,11 @@ i915_gem_evict_something(struct i915_address_space *vm, ret = i915_vma_unbind(vma); } + while (ret == 0 && (node = drm_mm_scan_color_evict(&scan))) { + vma = container_of(node, struct i915_vma, node); + ret = i915_vma_unbind(vma); + } + return ret; } diff --git a/drivers/gpu/drm/selftests/test-drm_mm.c b/drivers/gpu/drm/selftests/test-drm_mm.c index 09ead31a094d..73353f87f46a 100644 --- a/drivers/gpu/drm/selftests/test-drm_mm.c +++ b/drivers/gpu/drm/selftests/test-drm_mm.c @@ -1662,6 +1662,11 @@ static int igt_color_evict(void *ignored) list_for_each_entry(e, &evict_list, link) drm_mm_remove_node(&e->node); + while ((node = drm_mm_scan_color_evict(&scan))) { + e = container_of(node, struct evict_node, node); + drm_mm_remove_node(&e->node); + list_add(&e->link, &evict_list); + } memset(&tmp, 0, sizeof(tmp)); err = drm_mm_insert_node_generic(&mm, &tmp, nsize, n, c, @@ -1735,6 +1740,11 @@ static int igt_color_evict(void *ignored) list_for_each_entry(e, &evict_list, link) drm_mm_remove_node(&e->node); + while ((node = drm_mm_scan_color_evict(&scan))) { + e = container_of(node, struct evict_node, node); + drm_mm_remove_node(&e->node); + list_add(&e->link, &evict_list); + } memset(&tmp, 0, sizeof(tmp)); err = drm_mm_insert_node_generic(&mm, &tmp, nsize, n, c, @@ -1867,6 +1877,11 @@ static int igt_color_evict_range(void *ignored) list_for_each_entry(e, &evict_list, link) drm_mm_remove_node(&e->node); + while ((node = drm_mm_scan_color_evict(&scan))) { + e = container_of(node, struct evict_node, node); + drm_mm_remove_node(&e->node); + list_add(&e->link, &evict_list); + } memset(&tmp, 0, sizeof(tmp)); err = drm_mm_insert_node_in_range_generic(&mm, &tmp, nsize, n, c, @@ -1943,6 +1958,11 @@ static int igt_color_evict_range(void *ignored) list_for_each_entry(e, &evict_list, link) drm_mm_remove_node(&e->node); + while ((node = drm_mm_scan_color_evict(&scan))) { + e = container_of(node, struct evict_node, node); + drm_mm_remove_node(&e->node); + list_add(&e->link, &evict_list); + } memset(&tmp, 0, sizeof(tmp)); err = drm_mm_insert_node_in_range_generic(&mm, &tmp, nsize, n, c, diff --git a/include/drm/drm_mm.h b/include/drm/drm_mm.h index 4ff76d0ab849..884166b91e90 100644 --- a/include/drm/drm_mm.h +++ b/include/drm/drm_mm.h @@ -403,6 +403,7 @@ bool drm_mm_scan_add_block(struct drm_mm_scan *scan, struct drm_mm_node *node); bool drm_mm_scan_remove_block(struct drm_mm_scan *scan, struct drm_mm_node *node); +struct drm_mm_node *drm_mm_scan_color_evict(struct drm_mm_scan *scan); void drm_mm_debug_table(const struct drm_mm *mm, const char *prefix); #ifdef CONFIG_DEBUG_FS