public inbox for intel-gfx@lists.freedesktop.org
 help / color / mirror / Atom feed
* [PATCH 0/9] gpu hang and swizzle patches
@ 2011-11-10 13:17 Daniel Vetter
  2011-11-10 13:17 ` [PATCH 1/9] drm/i915: refactor debugfs open function Daniel Vetter
                   ` (9 more replies)
  0 siblings, 10 replies; 30+ messages in thread
From: Daniel Vetter @ 2011-11-10 13:17 UTC (permalink / raw)
  To: intel-gfx; +Cc: Daniel Vetter

Hi all,

This is a bit a mixed pile, but I've used all the earlier patches to test
the gen6+ swizzling patch and I like to send out patch series somewhat
resembling the setup I've tested them in.

Patches 1-2 refactor our debugfs code a bit.
Patches 3-5 implement a debugfs interface to simulate a gpu hang Patch 6
fixes the swizzle detection on i915G/i945G. This one is for stable and
independent of the previous patches.
Patches 7-8 add a debugfs file with information to debug swizzle issues
Patch 9 implements swizzle support for snb/ivb when in dual-channel mode

Benchmarking on my snb is notoriously difficult, but swizzling seems to
yield a few percent in some workloads, topping out at 5% for padman.

Review highly welcome.

Cheers, Daniel

Daniel Vetter (9):
  drm/i915: refactor debugfs open function
  drm/i915: refactor debugfs create functions
  drm/i915: add interface to simulate gpu hangs
  drm/i915: rework dev->first_error locking
  drm/i915: destroy existing error_state when simulating a gpu hang
  drm/i915: fix swizzle detection for gen3
  drm/i915: add debugfs file for swizzling information
  drm/i915: add gen6+ registers to i915_swizzle_info
  drm/i915: swizzling support for snb/ivb

 drivers/gpu/drm/i915/i915_debugfs.c     |  212 ++++++++++++++++++++++---------
 drivers/gpu/drm/i915/i915_dma.c         |    4 +-
 drivers/gpu/drm/i915/i915_drv.c         |    7 +-
 drivers/gpu/drm/i915/i915_drv.h         |    8 +-
 drivers/gpu/drm/i915/i915_gem.c         |   23 +++-
 drivers/gpu/drm/i915/i915_gem_tiling.c  |   20 +++-
 drivers/gpu/drm/i915/i915_irq.c         |    7 +-
 drivers/gpu/drm/i915/i915_reg.h         |   33 +++++
 drivers/gpu/drm/i915/intel_ringbuffer.c |    4 +
 9 files changed, 249 insertions(+), 69 deletions(-)

-- 
1.7.6.4

^ permalink raw reply	[flat|nested] 30+ messages in thread
* [PATCH 01/10] drm/i915: add interface to simulate gpu hangs
@ 2012-04-27 13:17 Daniel Vetter
  2012-05-03 12:48 ` [PATCH] " Daniel Vetter
  0 siblings, 1 reply; 30+ messages in thread
From: Daniel Vetter @ 2012-04-27 13:17 UTC (permalink / raw)
  To: Intel Graphics Development; +Cc: Daniel Vetter

gpu reset is a very important piece of our infrastructure.
Unfortunately we only really it test by actually hanging the gpu,
which often has bad side-effects for the entire system. And the gpu
hang handling code is one of the rather complicated pieces of code we
have, consisting of
- hang detection
- error capture
- actual gpu reset
- reset of all the gem bookkeeping
- reinitialition of the entire gpu

This patch adds a debugfs to selectively stopping rings by ceasing to
update the hw tail pointer, which will result in the gpu no longer
updating it's head pointer and eventually to the hangcheck firing.
This way we can exercise the gpu hang code under controlled conditions
without a dying gpu taking down the entire systems.

Patch motivated by me forgetting to properly reinitialize ppgtt after
a gpu reset.

Usage:

echo $((1 << $ringnum)) > i915_ring_stop # stops one ring

echo 0xffffffff > i915_ring_stop # stops all, future-proof version

then run whatever testload is desired. i915_ring_stop automatically
resets after a gpu hang is detected to avoid hanging the gpu to fast
and declaring it wedged.

v2: Incorporate feedback from Chris Wilson.

v3: Add the missing cleanup.

Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
---
 drivers/gpu/drm/i915/i915_debugfs.c     |   65 +++++++++++++++++++++++++++++++
 drivers/gpu/drm/i915/i915_drv.h         |    2 +
 drivers/gpu/drm/i915/intel_ringbuffer.c |    4 ++
 3 files changed, 71 insertions(+), 0 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 120db46..3f6e28e 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -1585,6 +1585,64 @@ static const struct file_operations i915_wedged_fops = {
 };
 
 static ssize_t
+i915_ring_stop_read(struct file *filp,
+		    char __user *ubuf,
+		    size_t max,
+		    loff_t *ppos)
+{
+	struct drm_device *dev = filp->private_data;
+	drm_i915_private_t *dev_priv = dev->dev_private;
+	char buf[80];
+	int len;
+
+	len = snprintf(buf, sizeof(buf),
+		       "0x%08x\n", dev_priv->stop_rings);
+
+	if (len > sizeof(buf))
+		len = sizeof(buf);
+
+	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
+}
+
+static ssize_t
+i915_ring_stop_write(struct file *filp,
+		     const char __user *ubuf,
+		     size_t cnt,
+		     loff_t *ppos)
+{
+	struct drm_device *dev = filp->private_data;
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	char buf[20];
+	int val = 0;
+
+	if (cnt > 0) {
+		if (cnt > sizeof(buf) - 1)
+			return -EINVAL;
+
+		if (copy_from_user(buf, ubuf, cnt))
+			return -EFAULT;
+		buf[cnt] = 0;
+
+		val = simple_strtoul(buf, NULL, 0);
+	}
+
+	DRM_DEBUG_DRIVER("Stopping rings 0x%08x\n", val);
+
+	mutex_lock(&dev->struct_mutex);
+	dev_priv->stop_rings = val;
+	mutex_unlock(&dev->struct_mutex);
+
+	return cnt;
+}
+
+static const struct file_operations i915_ring_stop_fops = {
+	.owner = THIS_MODULE,
+	.open = simple_open,
+	.read = i915_ring_stop_read,
+	.write = i915_ring_stop_write,
+	.llseek = default_llseek,
+};
+static ssize_t
 i915_max_freq_read(struct file *filp,
 		   char __user *ubuf,
 		   size_t max,
@@ -1884,6 +1942,11 @@ int i915_debugfs_init(struct drm_minor *minor)
 				  &i915_cache_sharing_fops);
 	if (ret)
 		return ret;
+	ret = i915_debugfs_create(minor->debugfs_root, minor,
+				  "i915_ring_stop",
+				  &i915_ring_stop_fops);
+	if (ret)
+		return ret;
 
 	return drm_debugfs_create_files(i915_debugfs_list,
 					I915_DEBUGFS_ENTRIES,
@@ -1902,6 +1965,8 @@ void i915_debugfs_cleanup(struct drm_minor *minor)
 				 1, minor);
 	drm_debugfs_remove_files((struct drm_info_list *) &i915_cache_sharing_fops,
 				 1, minor);
+	drm_debugfs_remove_files((struct drm_info_list *) &i915_ring_stop_fops,
+				 1, minor);
 }
 
 #endif /* CONFIG_DEBUG_FS */
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index 0095c8d..5e62b35 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -413,6 +413,8 @@ typedef struct drm_i915_private {
 	uint32_t last_instdone;
 	uint32_t last_instdone1;
 
+	unsigned int stop_rings;
+
 	unsigned long cfb_size;
 	unsigned int cfb_fb;
 	enum plane cfb_plane;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 427b7c5..d2de16d 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1221,7 +1221,11 @@ int intel_ring_begin(struct intel_ring_buffer *ring,
 
 void intel_ring_advance(struct intel_ring_buffer *ring)
 {
+	struct drm_i915_private *dev_priv = ring->dev->dev_private;
+
 	ring->tail &= ring->size - 1;
+	if (dev_priv->stop_rings & intel_ring_flag(ring))
+		return;
 	ring->write_tail(ring, ring->tail);
 }
 
-- 
1.7.9

^ permalink raw reply related	[flat|nested] 30+ messages in thread

end of thread, other threads:[~2012-05-05 19:12 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-11-10 13:17 [PATCH 0/9] gpu hang and swizzle patches Daniel Vetter
2011-11-10 13:17 ` [PATCH 1/9] drm/i915: refactor debugfs open function Daniel Vetter
2011-11-10 19:25   ` Ben Widawsky
2011-11-10 13:18 ` [PATCH 2/9] drm/i915: refactor debugfs create functions Daniel Vetter
2011-11-10 19:26   ` Ben Widawsky
2011-11-10 13:18 ` [PATCH 3/9] drm/i915: add interface to simulate gpu hangs Daniel Vetter
2011-11-10 16:34   ` [PATCH] " Daniel Vetter
2011-12-02 22:21     ` Daniel Vetter
2011-12-03  1:33       ` Chris Wilson
2011-12-05 23:20       ` Ben Widawsky
2011-11-10 13:18 ` [PATCH 4/9] drm/i915: rework dev->first_error locking Daniel Vetter
2011-11-27 19:31   ` [PATCH] " Daniel Vetter
2011-11-10 13:18 ` [PATCH 5/9] drm/i915: destroy existing error_state when simulating a gpu hang Daniel Vetter
2011-11-10 13:18 ` [PATCH 6/9] drm/i915: fix swizzle detection for gen3 Daniel Vetter
2011-11-10 16:36   ` [PATCH] " Daniel Vetter
2011-11-10 13:18 ` [PATCH 7/9] drm/i915: add debugfs file for swizzling information Daniel Vetter
2011-11-10 16:39   ` [PATCH] " Daniel Vetter
2011-11-10 13:18 ` [PATCH 8/9] drm/i915: add gen6+ registers to i915_swizzle_info Daniel Vetter
2011-11-10 13:18 ` [PATCH 9/9] drm/i915: swizzling support for snb/ivb Daniel Vetter
2011-11-11 16:50   ` Eric Anholt
2011-11-11 17:22     ` Daniel Vetter
2011-11-11 19:37       ` Eric Anholt
2011-11-11 19:51         ` Daniel Vetter
2011-11-11 19:58           ` Eric Anholt
2011-11-11 20:18             ` Daniel Vetter
2011-11-14 16:19               ` Eric Anholt
2011-11-11  0:15 ` [PATCH 0/9] gpu hang and swizzle patches Chris Wilson
  -- strict thread matches above, loose matches on Subject: below --
2012-04-27 13:17 [PATCH 01/10] drm/i915: add interface to simulate gpu hangs Daniel Vetter
2012-05-03 12:48 ` [PATCH] " Daniel Vetter
2012-05-03 19:00   ` Eugeni Dodonov
2012-05-05 19:13     ` Daniel Vetter

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox