drm/i915/gem: Move freeze/freeze_late next to suspend/suspend_late
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: 30d2bfd093
("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>
This commit is contained in:
parent
54fd4b9a4a
commit
29d88083d6
@ -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));
|
||||
|
@ -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__ */
|
||||
|
@ -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"
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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"
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user