mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-26 16:41:25 +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
2 changed files with 7 additions and 6 deletions
|
@ -63,6 +63,8 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
|
||||||
i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
|
i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
|
||||||
GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
|
GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
|
||||||
i915_gem_object_set_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;
|
shrinkable = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -999,12 +999,11 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
|
||||||
obj->mm.madv = args->madv;
|
obj->mm.madv = args->madv;
|
||||||
|
|
||||||
if (i915_gem_object_has_pages(obj)) {
|
if (i915_gem_object_has_pages(obj)) {
|
||||||
struct list_head *list;
|
|
||||||
|
|
||||||
if (i915_gem_object_is_shrinkable(obj)) {
|
|
||||||
unsigned long flags;
|
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)
|
if (obj->mm.madv != I915_MADV_WILLNEED)
|
||||||
list = &i915->mm.purge_list;
|
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 = &i915->mm.shrink_list;
|
||||||
list_move_tail(&obj->mm.link, 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 */
|
/* if the object is no longer attached, discard its backing storage */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue