drm/i915: Perform execbuffer object locking as a separate step
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Tue, 15 Jun 2021 11:36:00 +0000 (13:36 +0200)
committerMatthew Auld <matthew.auld@intel.com>
Thu, 17 Jun 2021 13:39:58 +0000 (14:39 +0100)
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 <thomas.hellstrom@linux.intel.com>
Reviewed-by: Ramalingam C <ramalingam.c@intel.com>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210615113600.30660-1-thomas.hellstrom@linux.intel.com
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c

index 201fed1..394eb40 100644 (file)
@@ -922,21 +922,38 @@ err:
        return err;
 }
 
-static int eb_validate_vmas(struct i915_execbuffer *eb)
+static int eb_lock_vmas(struct i915_execbuffer *eb)
 {
        unsigned int i;
        int err;
 
-       INIT_LIST_HEAD(&eb->unbound);
-
        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;
+       }
+
+       return 0;
+}
+
+static int eb_validate_vmas(struct i915_execbuffer *eb)
+{
+       unsigned int i;
+       int err;
+
+       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 = eb_pin_vma(eb, entry, ev);
                if (err == -EDEADLK)