From patchwork Wed May 7 05:21:31 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ben Widawsky X-Patchwork-Id: 4125561 Return-Path: X-Original-To: patchwork-intel-gfx@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id CEE12C0ACC for ; Wed, 7 May 2014 05:21:44 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 05A1020165 for ; Wed, 7 May 2014 05:21:44 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) by mail.kernel.org (Postfix) with ESMTP id 2DCAB2018B for ; Wed, 7 May 2014 05:21:43 +0000 (UTC) Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 3D0F06EC22; Tue, 6 May 2014 22:21:42 -0700 (PDT) X-Original-To: intel-gfx@lists.freedesktop.org Delivered-To: intel-gfx@lists.freedesktop.org Received: from mga03.intel.com (mga03.intel.com [143.182.124.21]) by gabe.freedesktop.org (Postfix) with ESMTP id D1C096EC1C for ; Tue, 6 May 2014 22:21:40 -0700 (PDT) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by azsmga101.ch.intel.com with ESMTP; 06 May 2014 22:21:40 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos; i="4.97,1001,1389772800"; d="scan'208"; a="527541080" Received: from unknown (HELO ironside.intel.com) ([10.255.12.78]) by fmsmga001.fm.intel.com with ESMTP; 06 May 2014 22:21:39 -0700 From: Ben Widawsky To: Intel GFX Date: Tue, 6 May 2014 22:21:31 -0700 Message-Id: <1399440098-17378-2-git-send-email-benjamin.widawsky@intel.com> X-Mailer: git-send-email 1.9.2 In-Reply-To: <1399440098-17378-1-git-send-email-benjamin.widawsky@intel.com> References: <1399440098-17378-1-git-send-email-benjamin.widawsky@intel.com> Cc: Ben Widawsky , Ben Widawsky Subject: [Intel-gfx] [PATCH 2/9] drm/i915: Extract node allocation from bind X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.15 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.8 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, 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 The DRM node allocation code was already a bit of an ugly bit of code within a complex function. Removing it serves the purpose of cleaning the function up. More importantly, it provides a way to have a preallocated (address space) VMA to easily skip this code. Something we're very likely to need. This is essentially a wrapper for DRM node allocation with an eviction + retry. It is something which could be moved to core DRM eventually, if other drivers had similar eviction semantics. This removes a goto used for something other than error unwinding, a generally reviled (I am neutral) practice, and replaces it with a function call to itself that should have the same effect. Note that it's not a recursive function as all the problem set reduction is done in the eviction code. Some might say this change is worse than before because we are using stack for each subsequent call. Frankly, I'd rather overflow the stack and blow it up than loop forever. In either case, this is addressed in the next patch. I believe, and intend, that other than the stack usage, there is no functional change here. Signed-off-by: Ben Widawsky --- drivers/gpu/drm/i915/i915_gem.c | 45 +++++++++++++++++++++++++++++------------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index dae51c3..2a07fa1 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c @@ -3216,6 +3216,34 @@ static void i915_gem_verify_gtt(struct drm_device *dev) #endif } +static int +i915_gem_find_vm_space(struct i915_address_space *vm, + struct drm_mm_node *node, + unsigned long size, + unsigned long align, + unsigned long color, + unsigned long start, + unsigned long end, + uint32_t flags) +{ + int ret; + ret = drm_mm_insert_node_in_range_generic(&vm->mm, node, + size, align, color, + start, end, + DRM_MM_SEARCH_DEFAULT, + DRM_MM_CREATE_DEFAULT); + if (ret) { + ret = i915_gem_evict_something(vm->dev, vm, size, align, color, + flags); + if (ret == 0) + return i915_gem_find_vm_space(vm, node, + size, align, color, + start, end, flags); + } + + return ret; +} + /** * Finds free space in the GTT aperture and binds the object there. */ @@ -3275,20 +3303,11 @@ i915_gem_object_bind_to_vm(struct drm_i915_gem_object *obj, if (IS_ERR(vma)) goto err_unpin; -search_free: - ret = drm_mm_insert_node_in_range_generic(&vm->mm, &vma->node, - size, alignment, - obj->cache_level, 0, gtt_max, - DRM_MM_SEARCH_DEFAULT, - DRM_MM_CREATE_DEFAULT); - if (ret) { - ret = i915_gem_evict_something(dev, vm, size, alignment, - obj->cache_level, flags); - if (ret == 0) - goto search_free; - + ret = i915_gem_find_vm_space(vm, &vma->node, size, alignment, + obj->cache_level, 0, gtt_max, flags); + if (ret) goto err_free_vma; - } + if (WARN_ON(!i915_gem_valid_gtt_space(dev, &vma->node, obj->cache_level))) { ret = -EINVAL;