All of lore.kernel.org
 help / color / mirror / Atom feed
From: Daniel Vetter <daniel.vetter@ffwll.ch>
To: Intel Graphics Development <intel-gfx@lists.freedesktop.org>
Cc: Daniel Vetter <daniel.vetter@intel.com>,
	Daniel Vetter <daniel.vetter@ffwll.ch>
Subject: [PATCH 1/2] drm/i915: Clean up pinned bo capture
Date: Tue,  2 Dec 2014 16:19:43 +0100	[thread overview]
Message-ID: <1417533584-2011-1-git-send-email-daniel.vetter@ffwll.ch> (raw)

Somewhere between removing the pinned bo list and adding full ppgtt
support we've started to no longer filter the active buffers out of
the captured pinned buffers. I've tried to dig out exactly where but
didn't spot it.

At first I've thought (checked, but without warning about it) array
overrun. But we have the same issue when counting the pinned bo.

Still not pretty, so switch over to walking the inactive per-vm list,
which will naturally filter out all active buffers.

v2: While at it only capture pinned bo for the global gtt, we don't
care about them for real ppgtt (since only execbuf pins those, and
only temporarily).

v3: Don't WARN_ON about overruns, this code is still racy. So just
debug output instead.

Cc: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
---
 drivers/gpu/drm/i915/i915_gpu_error.c | 43 ++++++++++++++++-------------------
 1 file changed, 20 insertions(+), 23 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
index c4536e185b75..b76443778e8e 100644
--- a/drivers/gpu/drm/i915/i915_gpu_error.c
+++ b/drivers/gpu/drm/i915/i915_gpu_error.c
@@ -696,35 +696,33 @@ static u32 capture_active_bo(struct drm_i915_error_buffer *err,
 
 	list_for_each_entry(vma, head, mm_list) {
 		capture_bo(err++, vma);
-		if (++i == count)
+		if (++i == count) {
+			DRM_DEBUG("Capture array overrun\n");
 			break;
+		}
 	}
 
 	return i;
 }
 
 static u32 capture_pinned_bo(struct drm_i915_error_buffer *err,
-			     int count, struct list_head *head,
-			     struct i915_address_space *vm)
+			     int count, struct list_head *head)
 {
-	struct drm_i915_gem_object *obj;
-	struct drm_i915_error_buffer * const first = err;
-	struct drm_i915_error_buffer * const last = err + count;
-
-	list_for_each_entry(obj, head, global_list) {
-		struct i915_vma *vma;
+	struct i915_vma *vma;
+	int i = 0;
 
-		if (err == last)
+	list_for_each_entry(vma, head, mm_list) {
+		if (vma->pin_count == 0)
 			break;
 
-		list_for_each_entry(vma, &obj->vma_list, vma_link)
-			if (vma->vm == vm && vma->pin_count > 0) {
-				capture_bo(err++, vma);
-				break;
-			}
+		capture_bo(err++, vma);
+		if (++i == count) {
+			DRM_DEBUG("Capture array overrun\n");
+			break;
+		}
 	}
 
-	return err - first;
+	return i;
 }
 
 /* Generate a semi-unique error code. The code is not meant to have meaning, The
@@ -1085,7 +1083,6 @@ static void i915_gem_capture_vm(struct drm_i915_private *dev_priv,
 				const int ndx)
 {
 	struct drm_i915_error_buffer *active_bo = NULL, *pinned_bo = NULL;
-	struct drm_i915_gem_object *obj;
 	struct i915_vma *vma;
 	int i;
 
@@ -1094,12 +1091,12 @@ static void i915_gem_capture_vm(struct drm_i915_private *dev_priv,
 		i++;
 	error->active_bo_count[ndx] = i;
 
-	list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
-		list_for_each_entry(vma, &obj->vma_list, vma_link)
-			if (vma->vm == vm && vma->pin_count > 0) {
-				i++;
+	if (i915_is_ggtt(vm)) {
+		list_for_each_entry(vma, &vm->inactive_list, mm_list) {
+			if (vma->pin_count == 0)
 				break;
-			}
+			i++;
+		}
 	}
 	error->pinned_bo_count[ndx] = i - error->active_bo_count[ndx];
 
@@ -1119,7 +1116,7 @@ static void i915_gem_capture_vm(struct drm_i915_private *dev_priv,
 		error->pinned_bo_count[ndx] =
 			capture_pinned_bo(pinned_bo,
 					  error->pinned_bo_count[ndx],
-					  &dev_priv->mm.bound_list, vm);
+					  &vm->inactive_list);
 	error->active_bo[ndx] = active_bo;
 	error->pinned_bo[ndx] = pinned_bo;
 }
-- 
1.9.3

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

             reply	other threads:[~2014-12-02 15:49 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-12-02 15:19 Daniel Vetter [this message]
2014-12-02 15:19 ` [PATCH 2/2] drm/i915: Don't capture pinned bo separately Daniel Vetter
2014-12-03  1:34   ` shuang.he
2014-12-02 16:46 ` [PATCH 1/2] drm/i915: Clean up pinned bo capture Chris Wilson
2014-12-03 14:16   ` Daniel Vetter
2014-12-04  9:11     ` Chris Wilson
2014-12-04 10:47       ` Daniel Vetter
  -- strict thread matches above, loose matches on Subject: below --
2014-12-02  9:56 Daniel Vetter

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1417533584-2011-1-git-send-email-daniel.vetter@ffwll.ch \
    --to=daniel.vetter@ffwll.ch \
    --cc=daniel.vetter@intel.com \
    --cc=intel-gfx@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.