Skip to content

Commit 036867e

Browse files
icklejnikula
authored andcommitted
drm/i915/gem: Pin the L-shape quirked object as unshrinkable
When instantiating a tiled object on an L-shaped memory machine, we mark the object as unshrinkable to prevent the shrinker from trying to swap out the pages. We have to do this as we do not know the swizzling on the individual pages, and so the data will be scrambled across swap out/in. Not only do we need to move the object off the shrinker list, we need to mark the object with shrink_pin so that the counter is consistent across calls to madvise. v2: in the madvise ioctl we need to check if the object is currently shrinkable/purgeable, not if the object type supports shrinking Fixes: 0175969 ("drm/i915/gem: Use shrinkable status for unknown swizzle quirks") References: https://gitlab.freedesktop.org/drm/intel/-/issues/3293 References: https://gitlab.freedesktop.org/drm/intel/-/issues/3450 Reported-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Tested-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Signed-off-by: Matthew Auld <matthew.auld@intel.com> Cc: <stable@vger.kernel.org> # v5.12+ Link: https://patchwork.freedesktop.org/patch/msgid/20210517084640.18862-1-matthew.auld@intel.com (cherry picked from commit 8777d17) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
1 parent d07f6ca commit 036867e

2 files changed

Lines changed: 7 additions & 6 deletions

File tree

drivers/gpu/drm/i915/gem/i915_gem_pages.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
6363
i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
6464
GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
6565
i915_gem_object_set_tiling_quirk(obj);
66+
GEM_BUG_ON(!list_empty(&obj->mm.link));
67+
atomic_inc(&obj->mm.shrink_pin);
6668
shrinkable = false;
6769
}
6870

drivers/gpu/drm/i915/i915_gem.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -999,21 +999,20 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
999999
obj->mm.madv = args->madv;
10001000

10011001
if (i915_gem_object_has_pages(obj)) {
1002-
struct list_head *list;
1002+
unsigned long flags;
10031003

1004-
if (i915_gem_object_is_shrinkable(obj)) {
1005-
unsigned long flags;
1006-
1007-
spin_lock_irqsave(&i915->mm.obj_lock, flags);
1004+
spin_lock_irqsave(&i915->mm.obj_lock, flags);
1005+
if (!list_empty(&obj->mm.link)) {
1006+
struct list_head *list;
10081007

10091008
if (obj->mm.madv != I915_MADV_WILLNEED)
10101009
list = &i915->mm.purge_list;
10111010
else
10121011
list = &i915->mm.shrink_list;
10131012
list_move_tail(&obj->mm.link, list);
10141013

1015-
spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
10161014
}
1015+
spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
10171016
}
10181017

10191018
/* if the object is no longer attached, discard its backing storage */

0 commit comments

Comments
 (0)