drm/i915/gem: Move freeze/freeze_late next to suspend/suspend_late
authorChris Wilson <chris@chris-wilson.co.uk>
Sat, 23 Jan 2021 14:55:43 +0000 (14:55 +0000)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Mon, 8 Feb 2021 21:56:49 +0000 (16:56 -0500)
Push the hibernate pm routines next to the suspend pm routines in
gem/i915_gem_pm.c. This has the side-effect of putting the wbinvd()
abusers next to each other.

Reported-by: Guenter Roeck <linux@roeck-us.net>
Fixes: 30d2bfd09383 ("drm/i915/gem: Almagamate clflushes on freeze")
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Matthew Auld <matthew.auld@intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210123145543.10533-1-chris@chris-wilson.co.uk
(cherry picked from commit 6d8f02207420e76db693a00ccb44792474e297fc)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/gem/i915_gem_pm.c
drivers/gpu/drm/i915/gem/i915_gem_pm.h
drivers/gpu/drm/i915/i915_drv.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/selftests/i915_gem.c

index 215766c..000e1cd 100644 (file)
@@ -85,6 +85,47 @@ void i915_gem_suspend_late(struct drm_i915_private *i915)
                wbinvd_on_all_cpus();
 }
 
+int i915_gem_freeze(struct drm_i915_private *i915)
+{
+       /* Discard all purgeable objects, let userspace recover those as
+        * required after resuming.
+        */
+       i915_gem_shrink_all(i915);
+
+       return 0;
+}
+
+int i915_gem_freeze_late(struct drm_i915_private *i915)
+{
+       struct drm_i915_gem_object *obj;
+       intel_wakeref_t wakeref;
+
+       /*
+        * Called just before we write the hibernation image.
+        *
+        * We need to update the domain tracking to reflect that the CPU
+        * will be accessing all the pages to create and restore from the
+        * hibernation, and so upon restoration those pages will be in the
+        * CPU domain.
+        *
+        * To make sure the hibernation image contains the latest state,
+        * we update that state just before writing out the image.
+        *
+        * To try and reduce the hibernation image, we manually shrink
+        * the objects as well, see i915_gem_freeze()
+        */
+
+       with_intel_runtime_pm(&i915->runtime_pm, wakeref)
+               i915_gem_shrink(i915, -1UL, NULL, ~0);
+       i915_gem_drain_freed_objects(i915);
+
+       wbinvd_on_all_cpus();
+       list_for_each_entry(obj, &i915->mm.shrink_list, mm.link)
+               __start_cpu_write(obj);
+
+       return 0;
+}
+
 void i915_gem_resume(struct drm_i915_private *i915)
 {
        GEM_TRACE("%s\n", dev_name(i915->drm.dev));
index 26b78db..c9a6663 100644 (file)
@@ -19,4 +19,7 @@ void i915_gem_idle_work_handler(struct work_struct *work);
 void i915_gem_suspend(struct drm_i915_private *i915);
 void i915_gem_suspend_late(struct drm_i915_private *i915);
 
+int i915_gem_freeze(struct drm_i915_private *i915);
+int i915_gem_freeze_late(struct drm_i915_private *i915);
+
 #endif /* __I915_GEM_PM_H__ */
index 2febda5..8e9cb44 100644 (file)
@@ -65,6 +65,7 @@
 #include "gem/i915_gem_context.h"
 #include "gem/i915_gem_ioctls.h"
 #include "gem/i915_gem_mman.h"
+#include "gem/i915_gem_pm.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_pm.h"
 #include "gt/intel_rc6.h"
index 574f357..56cc919 100644 (file)
@@ -1800,8 +1800,6 @@ int i915_gem_init_userptr(struct drm_i915_private *dev_priv);
 void i915_gem_cleanup_userptr(struct drm_i915_private *dev_priv);
 void i915_gem_init_early(struct drm_i915_private *dev_priv);
 void i915_gem_cleanup_early(struct drm_i915_private *dev_priv);
-int i915_gem_freeze(struct drm_i915_private *dev_priv);
-int i915_gem_freeze_late(struct drm_i915_private *dev_priv);
 
 struct intel_memory_region *i915_gem_shmem_setup(struct drm_i915_private *i915);
 
index 9b04dff..aa44909 100644 (file)
@@ -1145,47 +1145,6 @@ void i915_gem_cleanup_early(struct drm_i915_private *dev_priv)
        drm_WARN_ON(&dev_priv->drm, dev_priv->mm.shrink_count);
 }
 
-int i915_gem_freeze(struct drm_i915_private *dev_priv)
-{
-       /* Discard all purgeable objects, let userspace recover those as
-        * required after resuming.
-        */
-       i915_gem_shrink_all(dev_priv);
-
-       return 0;
-}
-
-int i915_gem_freeze_late(struct drm_i915_private *i915)
-{
-       struct drm_i915_gem_object *obj;
-       intel_wakeref_t wakeref;
-
-       /*
-        * Called just before we write the hibernation image.
-        *
-        * We need to update the domain tracking to reflect that the CPU
-        * will be accessing all the pages to create and restore from the
-        * hibernation, and so upon restoration those pages will be in the
-        * CPU domain.
-        *
-        * To make sure the hibernation image contains the latest state,
-        * we update that state just before writing out the image.
-        *
-        * To try and reduce the hibernation image, we manually shrink
-        * the objects as well, see i915_gem_freeze()
-        */
-
-       with_intel_runtime_pm(&i915->runtime_pm, wakeref)
-               i915_gem_shrink(i915, -1UL, NULL, ~0);
-       i915_gem_drain_freed_objects(i915);
-
-       wbinvd_on_all_cpus();
-       list_for_each_entry(obj, &i915->mm.shrink_list, mm.link)
-               __start_cpu_write(obj);
-
-       return 0;
-}
-
 int i915_gem_open(struct drm_i915_private *i915, struct drm_file *file)
 {
        struct drm_i915_file_private *file_priv;
index 412e216..dc394fb 100644 (file)
@@ -8,6 +8,7 @@
 
 #include "gem/selftests/igt_gem_utils.h"
 #include "gem/selftests/mock_context.h"
+#include "gem/i915_gem_pm.h"
 #include "gt/intel_gt.h"
 #include "gt/intel_gt_pm.h"