From 5cd57f676bb946a00275408f0dd0d75dbc466d25 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= Date: Tue, 15 Jun 2021 13:36:00 +0200 Subject: [PATCH] drm/i915: Perform execbuffer object locking as a separate step MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit To help avoid evicting already resident buffers from the batch we're processing, perform locking as a separate step. Signed-off-by: Thomas Hellström Reviewed-by: Ramalingam C Reviewed-by: Maarten Lankhorst Signed-off-by: Matthew Auld Link: https://patchwork.freedesktop.org/patch/msgid/20210615113600.30660-1-thomas.hellstrom@linux.intel.com --- .../gpu/drm/i915/gem/i915_gem_execbuffer.c | 25 ++++++++++++++++--- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c index 201fed19d120..394eb40c95b5 100644 --- a/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c +++ b/drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c @@ -922,6 +922,23 @@ static int eb_lookup_vmas(struct i915_execbuffer *eb) return err; } +static int eb_lock_vmas(struct i915_execbuffer *eb) +{ + unsigned int i; + int err; + + for (i = 0; i < eb->buffer_count; i++) { + struct eb_vma *ev = &eb->vma[i]; + struct i915_vma *vma = ev->vma; + + err = i915_gem_object_lock(vma->obj, &eb->ww); + if (err) + return err; + } + + return 0; +} + static int eb_validate_vmas(struct i915_execbuffer *eb) { unsigned int i; @@ -929,15 +946,15 @@ static int eb_validate_vmas(struct i915_execbuffer *eb) INIT_LIST_HEAD(&eb->unbound); + err = eb_lock_vmas(eb); + if (err) + return err; + for (i = 0; i < eb->buffer_count; i++) { struct drm_i915_gem_exec_object2 *entry = &eb->exec[i]; struct eb_vma *ev = &eb->vma[i]; struct i915_vma *vma = ev->vma; - err = i915_gem_object_lock(vma->obj, &eb->ww); - if (err) - return err; - err = eb_pin_vma(eb, entry, ev); if (err == -EDEADLK) return err;