drm/i915: Use i915_gem_object_ggtt_pin_ww for reloc_iomap
authorMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 11 May 2022 11:52:19 +0000 (13:52 +0200)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Wed, 18 May 2022 11:36:05 +0000 (13:36 +0200)
When removing short term pins, I've changed the the batch buffer
pinning for relocation to use __i915_vma_pin, because
i915_gem_object_ggtt_pin_ww was destroying the old vma. This
caused regressions, because the functions are not identical.

Fix the regressions by calling i915_gem_object_ggtt_pin_ww() again
on ggtt-only platforms, but only if the batch can be pinned without
being moved.

Fixes: b5cfe6f7a6e1 ("drm/i915: Remove short-term pins from execbuf, v6.")
Cc: Matthew Auld <matthew.auld@intel.com>
Reported-by: Mateusz Jończyk <mat.jonczyk@o2.pl>
Tested-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Acked-by: Matthew Auld <matthew.auld@intel.com>
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/5806
Link: https://patchwork.freedesktop.org/patch/msgid/20220511115219.46507-1-maarten.lankhorst@linux.intel.com
drivers/gpu/drm/i915/gem/i915_gem_execbuffer.c

index b3383e047505b05e0996fd8dd557b580ba899486..c326bd2b444fc50cb350a2e6d3ff8184e117d97c 100644 (file)
@@ -1251,14 +1251,12 @@ static void *reloc_iomap(struct i915_vma *batch,
                 * Only attempt to pin the batch buffer to ggtt if the current batch
                 * is not inside ggtt, or the batch buffer is not misplaced.
                 */
-               if (!i915_is_ggtt(batch->vm)) {
+               if (!i915_is_ggtt(batch->vm) ||
+                   !i915_vma_misplaced(batch, 0, 0, PIN_MAPPABLE)) {
                        vma = i915_gem_object_ggtt_pin_ww(obj, &eb->ww, NULL, 0, 0,
                                                          PIN_MAPPABLE |
                                                          PIN_NONBLOCK /* NOWARN */ |
                                                          PIN_NOEVICT);
-               } else if (i915_vma_is_map_and_fenceable(batch)) {
-                       __i915_vma_pin(batch);
-                       vma = batch;
                }
 
                if (vma == ERR_PTR(-EDEADLK))