mirror of
https://github.com/torvalds/linux
synced 2024-10-20 18:28:21 +00:00
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:0175969e48
("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 commit8777d17b68
) Signed-off-by: Jani Nikula <jani.nikula@intel.com>
This commit is contained in:
parent
d07f6ca923
commit
036867e93e
|
@ -63,6 +63,8 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
|
|||
i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
|
||||
GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
|
||||
i915_gem_object_set_tiling_quirk(obj);
|
||||
GEM_BUG_ON(!list_empty(&obj->mm.link));
|
||||
atomic_inc(&obj->mm.shrink_pin);
|
||||
shrinkable = false;
|
||||
}
|
||||
|
||||
|
|
|
@ -999,12 +999,11 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
|
|||
obj->mm.madv = args->madv;
|
||||
|
||||
if (i915_gem_object_has_pages(obj)) {
|
||||
struct list_head *list;
|
||||
unsigned long flags;
|
||||
|
||||
if (i915_gem_object_is_shrinkable(obj)) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&i915->mm.obj_lock, flags);
|
||||
spin_lock_irqsave(&i915->mm.obj_lock, flags);
|
||||
if (!list_empty(&obj->mm.link)) {
|
||||
struct list_head *list;
|
||||
|
||||
if (obj->mm.madv != I915_MADV_WILLNEED)
|
||||
list = &i915->mm.purge_list;
|
||||
|
@ -1012,8 +1011,8 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
|
|||
list = &i915->mm.shrink_list;
|
||||
list_move_tail(&obj->mm.link, list);
|
||||
|
||||
spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
|
||||
}
|
||||
spin_unlock_irqrestore(&i915->mm.obj_lock, flags);
|
||||
}
|
||||
|
||||
/* if the object is no longer attached, discard its backing storage */
|
||||
|
|
Loading…
Reference in a new issue