drm/i915: Restore all GGTT VMAs on resume
diff mbox

Message ID 1436192101-31564-1-git-send-email-tvrtko.ursulin@linux.intel.com
State New
Headers show

Commit Message

Tvrtko Ursulin July 6, 2015, 2:15 p.m. UTC
From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

When rotated and partial views were added no one spotted the resume
path which assumes only one GGTT VMA per object and hence is now
skipping rebind of alternative views.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
---
Similarly to my recent debugfs patch, it would seem quicker path could
be to walk GGTT active & inactive lists, but I assume we want to call
i915_gem_clflush_object only once per object which would make that
problematic.
---
 drivers/gpu/drm/i915/i915_gem_gtt.c | 23 ++++++++++++++++-------
 1 file changed, 16 insertions(+), 7 deletions(-)

Comments

Chris Wilson July 6, 2015, 3:19 p.m. UTC | #1
On Mon, Jul 06, 2015 at 03:15:01PM +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> 
> When rotated and partial views were added no one spotted the resume
> path which assumes only one GGTT VMA per object and hence is now
> skipping rebind of alternative views.
> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> ---
> Similarly to my recent debugfs patch, it would seem quicker path could
> be to walk GGTT active & inactive lists, but I assume we want to call
> i915_gem_clflush_object only once per object which would make that
> problematic.

It's a bit easier because there are no active entries after suspend, and
we may not care too much for over clflushing.

We should actually clear the GGTT of all but pinned entries on
hibernate (which would save a bunch of work on early resume), and there
are a bunch of non-objects inside the GGTT that should be evicted/restored
properly. (Would have been trivial had we made them all objects in the
first place.)

The patch is in the right direction and the other issues are present
irrespective of this patch.

I guess a begrudingly
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
-Chris
Tvrtko Ursulin July 6, 2015, 3:29 p.m. UTC | #2
On 07/06/2015 04:19 PM, Chris Wilson wrote:
> On Mon, Jul 06, 2015 at 03:15:01PM +0100, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>
>> When rotated and partial views were added no one spotted the resume
>> path which assumes only one GGTT VMA per object and hence is now
>> skipping rebind of alternative views.
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>> ---
>> Similarly to my recent debugfs patch, it would seem quicker path could
>> be to walk GGTT active & inactive lists, but I assume we want to call
>> i915_gem_clflush_object only once per object which would make that
>> problematic.
>
> It's a bit easier because there are no active entries after suspend, and
> we may not care too much for over clflushing.
>
> We should actually clear the GGTT of all but pinned entries on
> hibernate (which would save a bunch of work on early resume), and there
> are a bunch of non-objects inside the GGTT that should be evicted/restored
> properly. (Would have been trivial had we made them all objects in the
> first place.)

What are these non-objects and where do I find the code with restores 
them improperly?

> The patch is in the right direction and the other issues are present
> irrespective of this patch.
>
> I guess a begrudingly
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

Thanks!

Regards,

Tvrtko
Chris Wilson July 6, 2015, 3:39 p.m. UTC | #3
On Mon, Jul 06, 2015 at 04:29:12PM +0100, Tvrtko Ursulin wrote:
> 
> On 07/06/2015 04:19 PM, Chris Wilson wrote:
> >On Mon, Jul 06, 2015 at 03:15:01PM +0100, Tvrtko Ursulin wrote:
> >>From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> >>
> >>When rotated and partial views were added no one spotted the resume
> >>path which assumes only one GGTT VMA per object and hence is now
> >>skipping rebind of alternative views.
> >>
> >>Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> >>Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> >>Cc: Chris Wilson <chris@chris-wilson.co.uk>
> >>Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> >>---
> >>Similarly to my recent debugfs patch, it would seem quicker path could
> >>be to walk GGTT active & inactive lists, but I assume we want to call
> >>i915_gem_clflush_object only once per object which would make that
> >>problematic.
> >
> >It's a bit easier because there are no active entries after suspend, and
> >we may not care too much for over clflushing.
> >
> >We should actually clear the GGTT of all but pinned entries on
> >hibernate (which would save a bunch of work on early resume), and there
> >are a bunch of non-objects inside the GGTT that should be evicted/restored
> >properly. (Would have been trivial had we made them all objects in the
> >first place.)
> 
> What are these non-objects and where do I find the code with
> restores them improperly?

The PDEs are allocated directly in the GGTT and ignored completely
across hibernation. All we ideally need to do is evict them on freeze.
-Chris
Shuang He July 7, 2015, 4:50 p.m. UTC | #4
Tested-By: Intel Graphics QA PRTS (Patch Regression Test System Contact: shuang.he@intel.com)
Task id: 6731
-------------------------------------Summary-------------------------------------
Platform          Delta          drm-intel-nightly          Series Applied
ILK                                  302/302              302/302
SNB                                  312/316              312/316
IVB                                  345/345              345/345
BYT                 -2              289/289              287/289
HSW                                  382/382              382/382
-------------------------------------Detailed-------------------------------------
Platform  Test                                drm-intel-nightly          Series Applied
*BYT  igt@gem_partial_pwrite_pread@reads      PASS(1)      FAIL(1)
*BYT  igt@gem_partial_pwrite_pread@reads-uncached      PASS(1)      FAIL(1)
Note: You need to pay more attention to line start with '*'
Daniel Vetter July 8, 2015, 9:32 a.m. UTC | #5
On Mon, Jul 06, 2015 at 04:19:01PM +0100, Chris Wilson wrote:
> On Mon, Jul 06, 2015 at 03:15:01PM +0100, Tvrtko Ursulin wrote:
> > From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > 
> > When rotated and partial views were added no one spotted the resume
> > path which assumes only one GGTT VMA per object and hence is now
> > skipping rebind of alternative views.
> > 
> > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Chris Wilson <chris@chris-wilson.co.uk>
> > Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> > ---
> > Similarly to my recent debugfs patch, it would seem quicker path could
> > be to walk GGTT active & inactive lists, but I assume we want to call
> > i915_gem_clflush_object only once per object which would make that
> > problematic.

Patch is missing offending commit that introduce this issue and which
platforms are affected (I guess all due to partial view?). Also should be
cc: stable I presume?

Can you please supply this so I can ammend the commit message? Applied to
-fixes meanwhile, thanks.
-Daniel

> 
> It's a bit easier because there are no active entries after suspend, and
> we may not care too much for over clflushing.
> 
> We should actually clear the GGTT of all but pinned entries on
> hibernate (which would save a bunch of work on early resume), and there
> are a bunch of non-objects inside the GGTT that should be evicted/restored
> properly. (Would have been trivial had we made them all objects in the
> first place.)
> 
> The patch is in the right direction and the other issues are present
> irrespective of this patch.
> 
> I guess a begrudingly
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> -Chris
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre
Tvrtko Ursulin July 8, 2015, 9:45 a.m. UTC | #6
On 07/08/2015 10:32 AM, Daniel Vetter wrote:
> On Mon, Jul 06, 2015 at 04:19:01PM +0100, Chris Wilson wrote:
>> On Mon, Jul 06, 2015 at 03:15:01PM +0100, Tvrtko Ursulin wrote:
>>> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>>
>>> When rotated and partial views were added no one spotted the resume
>>> path which assumes only one GGTT VMA per object and hence is now
>>> skipping rebind of alternative views.
>>>
>>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>>> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>>> Cc: Chris Wilson <chris@chris-wilson.co.uk>
>>> Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
>>> ---
>>> Similarly to my recent debugfs patch, it would seem quicker path could
>>> be to walk GGTT active & inactive lists, but I assume we want to call
>>> i915_gem_clflush_object only once per object which would make that
>>> problematic.
>
> Patch is missing offending commit that introduce this issue and which
> platforms are affected (I guess all due to partial view?). Also should be
> cc: stable I presume?
>
> Can you please supply this so I can ammend the commit message? Applied to
> -fixes meanwhile, thanks.

Ha, "offending" commits. In the sense of that the bug only manifests
when they are present they are either of these two:

commit c5ad54cf7dd8922bd1cee2d5871aebf73dc9638e
Author: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Date:   Wed May 6 14:36:09 2015 +0300

     drm/i915: Use partial view in mmap fault handler

commit 3b7a5119b5d2def1161226a4c6a643db537dff7e
Author: Sonika Jindal <sonika.jindal@intel.com>
Date:   Fri Apr 10 14:37:29 2015 +0530

     drm/i915/skl: Support for 90/270 rotation

But they are just the tips of two longish streams of developments
so they should not necessarily be viewed as offending towards the 
respective authors. They are just final feature enablements.

All platforms are affected due to partial views I suppose, although I am 
not sure if they are actually used/triggered in the field. That's why I 
was not sure should stable be copied.

Regards,

Tvrtko
Daniel Vetter July 8, 2015, 9:57 a.m. UTC | #7
On Wed, Jul 08, 2015 at 10:45:23AM +0100, Tvrtko Ursulin wrote:
> 
> On 07/08/2015 10:32 AM, Daniel Vetter wrote:
> >On Mon, Jul 06, 2015 at 04:19:01PM +0100, Chris Wilson wrote:
> >>On Mon, Jul 06, 2015 at 03:15:01PM +0100, Tvrtko Ursulin wrote:
> >>>From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> >>>
> >>>When rotated and partial views were added no one spotted the resume
> >>>path which assumes only one GGTT VMA per object and hence is now
> >>>skipping rebind of alternative views.
> >>>
> >>>Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> >>>Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> >>>Cc: Chris Wilson <chris@chris-wilson.co.uk>
> >>>Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> >>>---
> >>>Similarly to my recent debugfs patch, it would seem quicker path could
> >>>be to walk GGTT active & inactive lists, but I assume we want to call
> >>>i915_gem_clflush_object only once per object which would make that
> >>>problematic.
> >
> >Patch is missing offending commit that introduce this issue and which
> >platforms are affected (I guess all due to partial view?). Also should be
> >cc: stable I presume?
> >
> >Can you please supply this so I can ammend the commit message? Applied to
> >-fixes meanwhile, thanks.
> 
> Ha, "offending" commits. In the sense of that the bug only manifests
> when they are present they are either of these two:
> 
> commit c5ad54cf7dd8922bd1cee2d5871aebf73dc9638e
> Author: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
> Date:   Wed May 6 14:36:09 2015 +0300
> 
>     drm/i915: Use partial view in mmap fault handler
> 
> commit 3b7a5119b5d2def1161226a4c6a643db537dff7e
> Author: Sonika Jindal <sonika.jindal@intel.com>
> Date:   Fri Apr 10 14:37:29 2015 +0530
> 
>     drm/i915/skl: Support for 90/270 rotation
> 
> But they are just the tips of two longish streams of developments
> so they should not necessarily be viewed as offending towards the respective
> authors. They are just final feature enablements.
> 
> All platforms are affected due to partial views I suppose, although I am not
> sure if they are actually used/triggered in the field. That's why I was not
> sure should stable be copied.

Well commits are only in 4.2, so -fixes is ok.

Thanks, Daniel

Patch
diff mbox

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 8cfa3906f440..5742a2a74cf8 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2543,6 +2543,8 @@  void i915_gem_restore_gtt_mappings(struct drm_device *dev)
 	struct drm_i915_private *dev_priv = dev->dev_private;
 	struct drm_i915_gem_object *obj;
 	struct i915_address_space *vm;
+	struct i915_vma *vma;
+	bool flush;
 
 	i915_check_and_clear_faults(dev);
 
@@ -2552,16 +2554,23 @@  void i915_gem_restore_gtt_mappings(struct drm_device *dev)
 				       dev_priv->gtt.base.total,
 				       true);
 
+	/* Cache flush objects bound into GGTT and rebind them. */
+	vm = &dev_priv->gtt.base;
 	list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
-		struct i915_vma *vma = i915_gem_obj_to_vma(obj,
-							   &dev_priv->gtt.base);
-		if (!vma)
-			continue;
+		flush = false;
+		list_for_each_entry(vma, &obj->vma_list, vma_link) {
+			if (vma->vm != vm)
+				continue;
 
-		i915_gem_clflush_object(obj, obj->pin_display);
-		WARN_ON(i915_vma_bind(vma, obj->cache_level, PIN_UPDATE));
-	}
+			WARN_ON(i915_vma_bind(vma, obj->cache_level,
+					      PIN_UPDATE));
 
+			flush = true;
+		}
+
+		if (flush)
+			i915_gem_clflush_object(obj, obj->pin_display);
+	}
 
 	if (INTEL_INFO(dev)->gen >= 8) {
 		if (IS_CHERRYVIEW(dev) || IS_BROXTON(dev))