From: Ben Widawsky <benjamin.widawsky@intel.com>
To: Intel GFX <intel-gfx@lists.freedesktop.org>
Cc: Ben Widawsky <ben@bwidawsk.net>,
Ben Widawsky <benjamin.widawsky@intel.com>
Subject: [PATCH 2/9] drm/i915: Extract node allocation from bind
Date: Tue, 6 May 2014 22:21:31 -0700 [thread overview]
Message-ID: <1399440098-17378-2-git-send-email-benjamin.widawsky@intel.com> (raw)
In-Reply-To: <1399440098-17378-1-git-send-email-benjamin.widawsky@intel.com>
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 <ben@bwidawsk.net>
---
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;
--
1.9.2
next prev parent reply other threads:[~2014-05-07 5:21 UTC|newest]
Thread overview: 23+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-05-07 5:21 [PATCH 1/9] drm/i915: Use topdown allocation for PPGTT PDEs on gen6/7 Ben Widawsky
2014-05-07 5:21 ` Ben Widawsky [this message]
2014-05-07 7:02 ` [PATCH 2/9] drm/i915: Extract node allocation from bind Chris Wilson
2014-05-07 15:45 ` Ben Widawsky
2014-05-07 15:53 ` Chris Wilson
2014-05-07 16:00 ` Ben Widawsky
2014-05-07 16:55 ` Chris Wilson
2014-05-07 17:30 ` Ben Widawsky
2014-05-07 5:21 ` [PATCH 3/9] drm/i915: WARN on unexpected return from drm_mm Ben Widawsky
2014-05-07 5:21 ` [PATCH 4/9] drm/i915: Limit the number of node allocation retries Ben Widawsky
2014-05-07 7:49 ` Daniel Vetter
2014-05-07 15:21 ` Ben Widawsky
2014-05-07 5:21 ` [PATCH 5/9] drm/i915: Use new drm node allocator for PPGTT Ben Widawsky
2014-05-07 5:21 ` [PATCH 6/9] drm/i915: Wrap VMA binding Ben Widawsky
2014-05-07 7:55 ` Daniel Vetter
2014-05-07 15:54 ` Ben Widawsky
2014-05-07 16:09 ` Daniel Vetter
2014-05-07 5:21 ` [PATCH 7/9] drm/i915: Make aliasing a 2nd class VM Ben Widawsky
2014-05-07 7:56 ` Daniel Vetter
2014-05-07 5:21 ` [PATCH 8/9] drm/i915: Make pin global flags explicit Ben Widawsky
2014-05-07 5:21 ` [PATCH 9/9] drm/i915: Split out aliasing binds Ben Widawsky
2014-05-07 7:59 ` Daniel Vetter
2014-05-07 7:44 ` [PATCH 1/9] drm/i915: Use topdown allocation for PPGTT PDEs on gen6/7 Daniel Vetter
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1399440098-17378-2-git-send-email-benjamin.widawsky@intel.com \
--to=benjamin.widawsky@intel.com \
--cc=ben@bwidawsk.net \
--cc=intel-gfx@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox