]> git.baikalelectronics.ru Git - kernel.git/commitdiff
drm/i915/gem: Use shrinkable status for unknown swizzle quirks
authorChris Wilson <chris@chris-wilson.co.uk>
Tue, 19 Jan 2021 21:43:34 +0000 (21:43 +0000)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 20 Jan 2021 21:01:33 +0000 (21:01 +0000)
Give obj->mm.quirked a name much more reflective of its purpose
(i915_gem_object_has_tiling_quirk) and move it from the obj->mm field as
it doesn't denote a quirk of the backing store, but a quirk in the
object in its treatment of the backing pages, similar to tiling modes.

Then instead of abusing the pinned status of the buffer to protect it
from the shrinker, we can instead hide the buffer from the shrinker so
it is never considered for being swapped.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210119214336.1463-4-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_object.h
drivers/gpu/drm/i915/gem/i915_gem_object_types.h
drivers/gpu/drm/i915/gem/i915_gem_pages.c
drivers/gpu/drm/i915/gem/i915_gem_phys.c
drivers/gpu/drm/i915/gem/i915_gem_tiling.c
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/selftests/i915_gem_evict.c

index 689b61c28754e8b585edfccc342c26e0a3ae0bbf..0450795e0d803e31c7946d405cafcb8c5dae7d14 100644 (file)
@@ -187,6 +187,24 @@ i915_gem_object_set_volatile(struct drm_i915_gem_object *obj)
        obj->flags |= I915_BO_ALLOC_VOLATILE;
 }
 
+static inline bool
+i915_gem_object_has_tiling_quirk(struct drm_i915_gem_object *obj)
+{
+       return test_bit(I915_TILING_QUIRK_BIT, &obj->flags);
+}
+
+static inline void
+i915_gem_object_set_tiling_quirk(struct drm_i915_gem_object *obj)
+{
+       set_bit(I915_TILING_QUIRK_BIT, &obj->flags);
+}
+
+static inline void
+i915_gem_object_clear_tiling_quirk(struct drm_i915_gem_object *obj)
+{
+       clear_bit(I915_TILING_QUIRK_BIT, &obj->flags);
+}
+
 static inline bool
 i915_gem_object_type_has(const struct drm_i915_gem_object *obj,
                         unsigned long flags)
index 217151c18d49ff081255fdcc175bf779173f00c5..0438e00d4ca7d91a4b5100085453d18d6f21f63d 100644 (file)
@@ -173,6 +173,7 @@ struct drm_i915_gem_object {
 #define I915_BO_ALLOC_VOLATILE   BIT(1)
 #define I915_BO_ALLOC_FLAGS (I915_BO_ALLOC_CONTIGUOUS | I915_BO_ALLOC_VOLATILE)
 #define I915_BO_READONLY         BIT(2)
+#define I915_TILING_QUIRK_BIT    3 /* unknown swizzling; do not release! */
 
        /*
         * Is the object to be mapped as read-only to the GPU
@@ -281,12 +282,6 @@ struct drm_i915_gem_object {
                 * pages were last acquired.
                 */
                bool dirty:1;
-
-               /**
-                * This is set if the object has been pinned due to unknown
-                * swizzling.
-                */
-               bool quirked:1;
        } mm;
 
        /** Record of address bit 17 of each page at last unbind. */
index 3db3c667c486fd60f4f5e120a037dc5921f10619..43028f3539a6dc22e69e30a0709327ba0fcc8020 100644 (file)
@@ -16,6 +16,7 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
 {
        struct drm_i915_private *i915 = to_i915(obj->base.dev);
        unsigned long supported = INTEL_INFO(i915)->page_sizes;
+       bool shrinkable;
        int i;
 
        lockdep_assert_held(&obj->mm.lock);
@@ -38,13 +39,6 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
 
        obj->mm.pages = pages;
 
-       if (i915_gem_object_is_tiled(obj) &&
-           i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
-               GEM_BUG_ON(obj->mm.quirked);
-               __i915_gem_object_pin_pages(obj);
-               obj->mm.quirked = true;
-       }
-
        GEM_BUG_ON(!sg_page_sizes);
        obj->mm.page_sizes.phys = sg_page_sizes;
 
@@ -63,7 +57,16 @@ void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
        }
        GEM_BUG_ON(!HAS_PAGE_SIZES(i915, obj->mm.page_sizes.sg));
 
-       if (i915_gem_object_is_shrinkable(obj)) {
+       shrinkable = i915_gem_object_is_shrinkable(obj);
+
+       if (i915_gem_object_is_tiled(obj) &&
+           i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
+               GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
+               i915_gem_object_set_tiling_quirk(obj);
+               shrinkable = false;
+       }
+
+       if (shrinkable) {
                struct list_head *list;
                unsigned long flags;
 
index 3bb65a1b1d936edd49ea096503739408016a23c1..3c0b157e2a355dd25945e73b52706cc2fee4c131 100644 (file)
@@ -227,7 +227,7 @@ int i915_gem_object_attach_phys(struct drm_i915_gem_object *obj, int align)
                goto err_unlock;
        }
 
-       if (obj->mm.quirked) {
+       if (i915_gem_object_has_tiling_quirk(obj)) {
                err = -EFAULT;
                goto err_unlock;
        }
index ffcaee74a2493beec3d58fb2b224ca75b711118f..d589d3d81085dc4c1e524708d412e533fbbe01dc 100644 (file)
@@ -270,14 +270,14 @@ i915_gem_object_set_tiling(struct drm_i915_gem_object *obj,
            obj->mm.madv == I915_MADV_WILLNEED &&
            i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
                if (tiling == I915_TILING_NONE) {
-                       GEM_BUG_ON(!obj->mm.quirked);
-                       __i915_gem_object_unpin_pages(obj);
-                       obj->mm.quirked = false;
+                       GEM_BUG_ON(!i915_gem_object_has_tiling_quirk(obj));
+                       i915_gem_object_clear_tiling_quirk(obj);
+                       i915_gem_object_make_shrinkable(obj);
                }
                if (!i915_gem_object_is_tiled(obj)) {
-                       GEM_BUG_ON(obj->mm.quirked);
-                       __i915_gem_object_pin_pages(obj);
-                       obj->mm.quirked = true;
+                       GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
+                       i915_gem_object_make_unshrinkable(obj);
+                       i915_gem_object_set_tiling_quirk(obj);
                }
        }
        mutex_unlock(&obj->mm.lock);
index d3a287bf56c5cd9a8d78c094a7284054871ce9c5..9b04dff5eb325e10c220c1b3e63701e4f7058130 100644 (file)
@@ -957,14 +957,14 @@ i915_gem_madvise_ioctl(struct drm_device *dev, void *data,
            i915_gem_object_is_tiled(obj) &&
            i915->quirks & QUIRK_PIN_SWIZZLED_PAGES) {
                if (obj->mm.madv == I915_MADV_WILLNEED) {
-                       GEM_BUG_ON(!obj->mm.quirked);
-                       __i915_gem_object_unpin_pages(obj);
-                       obj->mm.quirked = false;
+                       GEM_BUG_ON(!i915_gem_object_has_tiling_quirk(obj));
+                       i915_gem_object_clear_tiling_quirk(obj);
+                       i915_gem_object_make_shrinkable(obj);
                }
                if (args->madv == I915_MADV_WILLNEED) {
-                       GEM_BUG_ON(obj->mm.quirked);
-                       __i915_gem_object_pin_pages(obj);
-                       obj->mm.quirked = true;
+                       GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
+                       i915_gem_object_make_unshrinkable(obj);
+                       i915_gem_object_set_tiling_quirk(obj);
                }
        }
 
index 3512bb8433cf280c90fe4d9afe1e2e78967239e3..f99bb0113726a976ae45d5f68772630d82a290ed 100644 (file)
@@ -38,8 +38,8 @@ static void quirk_add(struct drm_i915_gem_object *obj,
                      struct list_head *objects)
 {
        /* quirk is only for live tiled objects, use it to declare ownership */
-       GEM_BUG_ON(obj->mm.quirked);
-       obj->mm.quirked = true;
+       GEM_BUG_ON(i915_gem_object_has_tiling_quirk(obj));
+       i915_gem_object_set_tiling_quirk(obj);
        list_add(&obj->st_link, objects);
 }
 
@@ -85,7 +85,7 @@ static void unpin_ggtt(struct i915_ggtt *ggtt)
        struct i915_vma *vma;
 
        list_for_each_entry(vma, &ggtt->vm.bound_list, vm_link)
-               if (vma->obj->mm.quirked)
+               if (i915_gem_object_has_tiling_quirk(vma->obj))
                        i915_vma_unpin(vma);
 }
 
@@ -94,8 +94,8 @@ static void cleanup_objects(struct i915_ggtt *ggtt, struct list_head *list)
        struct drm_i915_gem_object *obj, *on;
 
        list_for_each_entry_safe(obj, on, list, st_link) {
-               GEM_BUG_ON(!obj->mm.quirked);
-               obj->mm.quirked = false;
+               GEM_BUG_ON(!i915_gem_object_has_tiling_quirk(obj));
+               i915_gem_object_set_tiling_quirk(obj);
                i915_gem_object_put(obj);
        }