All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/6] ring seqno wrap handling
@ 2012-12-04 13:11 Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 1/6] drm/i915: Add debugfs entry to read/write next_seqno Mika Kuoppala
                   ` (6 more replies)
  0 siblings, 7 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:11 UTC (permalink / raw)
  To: intel-gfx

Hi,

As Ben suggested, explicitly syncing across wrap boundary
revealed yet another set of issues that gem_stress didn't find.

So here is a patchset which addresses the syncing problems
across wrap boundary. Chris helped me to carve out seqno handling
ugliness from my initial attempts to handle the ring wrapping.

As I can't break this anymore, i added 6/6.
--Mika

Mika Kuoppala (6):
  drm/i915: Add debugfs entry to read/write next_seqno
  drm/i915: Fix debugfs seqno info print to use uint
  drm/i915: Don't emit semaphore wait if wrap happened
  drm/i915: Split intel_ring_begin
  drm/i915: Add intel_ring_handle_seqno wrap
  drm/i915: Set initial seqno value close to wrap boundary

 drivers/gpu/drm/i915/i915_debugfs.c     |   88 ++++++++++++++++++++++++++++++-
 drivers/gpu/drm/i915/i915_gem.c         |    6 ++-
 drivers/gpu/drm/i915/intel_ringbuffer.c |   72 +++++++++++++++++++------
 drivers/gpu/drm/i915/intel_ringbuffer.h |    2 +-
 4 files changed, 148 insertions(+), 20 deletions(-)

-- 
1.7.9.5

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

* [PATCH 1/6] drm/i915: Add debugfs entry to read/write next_seqno
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
@ 2012-12-04 13:12 ` Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 2/6] drm/i915: Fix debugfs seqno info print to use uint Mika Kuoppala
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:12 UTC (permalink / raw)
  To: intel-gfx

This is needed for testing seqno wrapping. Be careful to not bump next_seqno
more than 0x7FFFFFFF at a time (between some handled requests) as
i915_seqno_passed() can't handle bigger difference in between.

v2: Address review comments from Chris Wilson.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c |   86 +++++++++++++++++++++++++++++++++++
 1 file changed, 86 insertions(+)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index ce60506..18de201 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -843,6 +843,86 @@ static const struct file_operations i915_error_state_fops = {
 	.release = i915_error_state_release,
 };
 
+static ssize_t
+i915_next_seqno_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;
+	int ret;
+
+	ret = mutex_lock_interruptible(&dev->struct_mutex);
+	if (ret)
+		return ret;
+
+	len = snprintf(buf, sizeof(buf),
+		       "next_seqno :  0x%x\n",
+		       dev_priv->next_seqno);
+
+	mutex_unlock(&dev->struct_mutex);
+
+	if (len > sizeof(buf))
+		len = sizeof(buf);
+
+	return simple_read_from_buffer(ubuf, max, ppos, buf, len);
+}
+
+static ssize_t
+i915_next_seqno_write(struct file *filp,
+		      const char __user *ubuf,
+		      size_t cnt,
+		      loff_t *ppos)
+{
+	struct drm_device *dev = filp->private_data;
+	drm_i915_private_t *dev_priv = dev->dev_private;
+	char buf[20];
+	u32 val = 1;
+	int ret;
+
+	if (cnt > 0) {
+		if (cnt > sizeof(buf) - 1)
+			return -EINVAL;
+
+		if (copy_from_user(buf, ubuf, cnt))
+			return -EFAULT;
+		buf[cnt] = 0;
+
+		ret = kstrtouint(buf, 0, &val);
+		if (ret < 0)
+			return ret;
+	}
+
+	if (val == 0)
+		return -EINVAL;
+
+	ret = mutex_lock_interruptible(&dev->struct_mutex);
+	if (ret)
+		return ret;
+
+	if (i915_seqno_passed(val, dev_priv->next_seqno)) {
+		dev_priv->next_seqno = val;
+		DRM_DEBUG_DRIVER("Advancing seqno to %u\n", val);
+	} else {
+		ret = -EINVAL;
+	}
+
+	mutex_unlock(&dev->struct_mutex);
+
+	return ret ?: cnt;
+}
+
+static const struct file_operations i915_next_seqno_fops = {
+	.owner = THIS_MODULE,
+	.open = simple_open,
+	.read = i915_next_seqno_read,
+	.write = i915_next_seqno_write,
+	.llseek = default_llseek,
+};
+
 static int i915_rstdby_delays(struct seq_file *m, void *unused)
 {
 	struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -2107,6 +2187,12 @@ int i915_debugfs_init(struct drm_minor *minor)
 	if (ret)
 		return ret;
 
+	ret = i915_debugfs_create(minor->debugfs_root, minor,
+				 "i915_next_seqno",
+				 &i915_next_seqno_fops);
+	if (ret)
+		return ret;
+
 	return drm_debugfs_create_files(i915_debugfs_list,
 					I915_DEBUGFS_ENTRIES,
 					minor->debugfs_root, minor);
-- 
1.7.9.5

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

* [PATCH 2/6] drm/i915: Fix debugfs seqno info print to use uint
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 1/6] drm/i915: Add debugfs entry to read/write next_seqno Mika Kuoppala
@ 2012-12-04 13:12 ` Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened Mika Kuoppala
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:12 UTC (permalink / raw)
  To: intel-gfx

seqno's are u32 so print accordingly

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/i915_debugfs.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
index 18de201..e51b89d 100644
--- a/drivers/gpu/drm/i915/i915_debugfs.c
+++ b/drivers/gpu/drm/i915/i915_debugfs.c
@@ -389,7 +389,7 @@ static void i915_ring_seqno_info(struct seq_file *m,
 				 struct intel_ring_buffer *ring)
 {
 	if (ring->get_seqno) {
-		seq_printf(m, "Current sequence (%s): %d\n",
+		seq_printf(m, "Current sequence (%s): %u\n",
 			   ring->name, ring->get_seqno(ring, false));
 	}
 }
-- 
1.7.9.5

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

* [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 1/6] drm/i915: Add debugfs entry to read/write next_seqno Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 2/6] drm/i915: Fix debugfs seqno info print to use uint Mika Kuoppala
@ 2012-12-04 13:12 ` Mika Kuoppala
  2012-12-05 20:44   ` Paulo Zanoni
  2012-12-06 14:12   ` [PATCH] Detect wraparound using next-seqno rather than waiter->olr Chris Wilson
  2012-12-04 13:12 ` [PATCH 4/6] drm/i915: Split intel_ring_begin Mika Kuoppala
                   ` (3 subsequent siblings)
  6 siblings, 2 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:12 UTC (permalink / raw)
  To: intel-gfx

If wrap just happened we need to prevent emitting waits for
pre wrap values. Detect this and emit no-ops instead.

v2: Use olr > seqno to detect wrap instead of *seqno == 0
as suggested by Chris Wilson.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/intel_ringbuffer.c |   21 ++++++++++++++++-----
 1 file changed, 16 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 36e1e13a..2305af5 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -626,11 +626,22 @@ gen6_ring_sync(struct intel_ring_buffer *waiter,
 	if (ret)
 		return ret;
 
-	intel_ring_emit(waiter,
-			dw1 | signaller->semaphore_register[waiter->id]);
-	intel_ring_emit(waiter, seqno);
-	intel_ring_emit(waiter, 0);
-	intel_ring_emit(waiter, MI_NOOP);
+	BUG_ON(!waiter->outstanding_lazy_request);
+
+	/* If seqno wrap happened, omit the wait with no-ops */
+	if (likely(waiter->outstanding_lazy_request > seqno)) {
+		intel_ring_emit(waiter,
+				dw1 |
+				signaller->semaphore_register[waiter->id]);
+		intel_ring_emit(waiter, seqno);
+		intel_ring_emit(waiter, 0);
+		intel_ring_emit(waiter, MI_NOOP);
+	} else {
+		intel_ring_emit(waiter, MI_NOOP);
+		intel_ring_emit(waiter, MI_NOOP);
+		intel_ring_emit(waiter, MI_NOOP);
+		intel_ring_emit(waiter, MI_NOOP);
+	}
 	intel_ring_advance(waiter);
 
 	return 0;
-- 
1.7.9.5

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

* [PATCH 4/6] drm/i915: Split intel_ring_begin
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
                   ` (2 preceding siblings ...)
  2012-12-04 13:12 ` [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened Mika Kuoppala
@ 2012-12-04 13:12 ` Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 5/6] drm/i915: Add intel_ring_handle_seqno wrap Mika Kuoppala
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:12 UTC (permalink / raw)
  To: intel-gfx

In preparation for handling ring seqno wrapping, split
intel_ring_begin into helper part which doesn't allocate
seqno.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/intel_ringbuffer.c |   37 ++++++++++++++++++-------------
 1 file changed, 22 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 2305af5..9342bb2 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1374,11 +1374,31 @@ intel_ring_alloc_seqno(struct intel_ring_buffer *ring)
 	return i915_gem_get_seqno(ring->dev, &ring->outstanding_lazy_request);
 }
 
+static int __intel_ring_begin(struct intel_ring_buffer *ring,
+			      int bytes)
+{
+	int ret;
+
+	if (unlikely(ring->tail + bytes > ring->effective_size)) {
+		ret = intel_wrap_ring_buffer(ring);
+		if (unlikely(ret))
+			return ret;
+	}
+
+	if (unlikely(ring->space < bytes)) {
+		ret = ring_wait_for_space(ring, bytes);
+		if (unlikely(ret))
+			return ret;
+	}
+
+	ring->space -= bytes;
+	return 0;
+}
+
 int intel_ring_begin(struct intel_ring_buffer *ring,
 		     int num_dwords)
 {
 	drm_i915_private_t *dev_priv = ring->dev->dev_private;
-	int n = 4*num_dwords;
 	int ret;
 
 	ret = i915_gem_check_wedge(dev_priv, dev_priv->mm.interruptible);
@@ -1390,20 +1410,7 @@ int intel_ring_begin(struct intel_ring_buffer *ring,
 	if (ret)
 		return ret;
 
-	if (unlikely(ring->tail + n > ring->effective_size)) {
-		ret = intel_wrap_ring_buffer(ring);
-		if (unlikely(ret))
-			return ret;
-	}
-
-	if (unlikely(ring->space < n)) {
-		ret = ring_wait_for_space(ring, n);
-		if (unlikely(ret))
-			return ret;
-	}
-
-	ring->space -= n;
-	return 0;
+	return __intel_ring_begin(ring, num_dwords * sizeof(uint32_t));
 }
 
 void intel_ring_advance(struct intel_ring_buffer *ring)
-- 
1.7.9.5

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

* [PATCH 5/6] drm/i915: Add intel_ring_handle_seqno wrap
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
                   ` (3 preceding siblings ...)
  2012-12-04 13:12 ` [PATCH 4/6] drm/i915: Split intel_ring_begin Mika Kuoppala
@ 2012-12-04 13:12 ` Mika Kuoppala
  2012-12-04 13:12 ` [PATCH 6/6] drm/i915: Set initial seqno value close to wrap boundary Mika Kuoppala
  2012-12-04 14:05 ` [PATCH 0/6] ring seqno wrap handling Chris Wilson
  6 siblings, 0 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:12 UTC (permalink / raw)
  To: intel-gfx

If there are pre-wrap values in semaphore-mbox registers after wrap,
syncing against some after-wrap request will complete immediately.
Fix this by emitting ring commands to set mbox registers to zero
when the wrap happens.

v2: Use __intel_ring_begin to emit ring commands, from
Chris Wilson.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c         |    4 ++++
 drivers/gpu/drm/i915/intel_ringbuffer.c |   20 ++++++++++++++++++++
 drivers/gpu/drm/i915/intel_ringbuffer.h |    2 +-
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index cb94144..02d3151 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1952,6 +1952,10 @@ i915_gem_handle_seqno_wrap(struct drm_device *dev)
 
 	i915_gem_retire_requests(dev);
 	for_each_ring(ring, dev_priv, i) {
+		ret = intel_ring_handle_seqno_wrap(ring);
+		if (ret)
+			return ret;
+
 		for (j = 0; j < ARRAY_SIZE(ring->sync_seqno); j++)
 			ring->sync_seqno[j] = 0;
 	}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 9342bb2..23587b2 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -1413,6 +1413,26 @@ int intel_ring_begin(struct intel_ring_buffer *ring,
 	return __intel_ring_begin(ring, num_dwords * sizeof(uint32_t));
 }
 
+int intel_ring_handle_seqno_wrap(struct intel_ring_buffer *ring)
+{
+	int ret;
+
+	BUG_ON(ring->outstanding_lazy_request);
+
+	if (INTEL_INFO(ring->dev)->gen < 6)
+		return 0;
+
+	ret = __intel_ring_begin(ring, 6 * sizeof(uint32_t));
+	if (ret)
+		return ret;
+
+	update_mboxes(ring, ring->signal_mbox[0]);
+	update_mboxes(ring, ring->signal_mbox[1]);
+	intel_ring_advance(ring);
+
+	return 0;
+}
+
 void intel_ring_advance(struct intel_ring_buffer *ring)
 {
 	struct drm_i915_private *dev_priv = ring->dev->dev_private;
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index d4b7416..b4a533e 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -196,7 +196,7 @@ static inline void intel_ring_emit(struct intel_ring_buffer *ring,
 }
 void intel_ring_advance(struct intel_ring_buffer *ring);
 int __must_check intel_ring_idle(struct intel_ring_buffer *ring);
-
+int __must_check intel_ring_handle_seqno_wrap(struct intel_ring_buffer *ring);
 int intel_ring_flush_all_caches(struct intel_ring_buffer *ring);
 int intel_ring_invalidate_all_caches(struct intel_ring_buffer *ring);
 
-- 
1.7.9.5

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

* [PATCH 6/6] drm/i915: Set initial seqno value close to wrap boundary
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
                   ` (4 preceding siblings ...)
  2012-12-04 13:12 ` [PATCH 5/6] drm/i915: Add intel_ring_handle_seqno wrap Mika Kuoppala
@ 2012-12-04 13:12 ` Mika Kuoppala
  2012-12-04 14:05 ` [PATCH 0/6] ring seqno wrap handling Chris Wilson
  6 siblings, 0 replies; 15+ messages in thread
From: Mika Kuoppala @ 2012-12-04 13:12 UTC (permalink / raw)
  To: intel-gfx

To gain confidence in the wrap handling, make it happen quite
soon after the boot.

Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
---
 drivers/gpu/drm/i915/i915_gem.c |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 02d3151..70bb4e8 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -3947,7 +3947,7 @@ i915_gem_init_hw(struct drm_device *dev)
 			goto cleanup_bsd_ring;
 	}
 
-	dev_priv->next_seqno = 1;
+	dev_priv->next_seqno = (u32)-1 - 0x1000;
 
 	/*
 	 * XXX: There was some w/a described somewhere suggesting loading
-- 
1.7.9.5

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

* Re: [PATCH 0/6] ring seqno wrap handling
  2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
                   ` (5 preceding siblings ...)
  2012-12-04 13:12 ` [PATCH 6/6] drm/i915: Set initial seqno value close to wrap boundary Mika Kuoppala
@ 2012-12-04 14:05 ` Chris Wilson
  2012-12-04 22:03   ` Daniel Vetter
  6 siblings, 1 reply; 15+ messages in thread
From: Chris Wilson @ 2012-12-04 14:05 UTC (permalink / raw)
  To: Mika Kuoppala, intel-gfx

On Tue,  4 Dec 2012 15:11:59 +0200, Mika Kuoppala <mika.kuoppala@linux.intel.com> wrote:
> Hi,
> 
> As Ben suggested, explicitly syncing across wrap boundary
> revealed yet another set of issues that gem_stress didn't find.
> 
> So here is a patchset which addresses the syncing problems
> across wrap boundary. Chris helped me to carve out seqno handling
> ugliness from my initial attempts to handle the ring wrapping.
> 
> As I can't break this anymore, i added 6/6.
> --Mika
> 
> Mika Kuoppala (6):
>   drm/i915: Fix debugfs seqno info print to use uint
>   drm/i915: Don't emit semaphore wait if wrap happened
>   drm/i915: Split intel_ring_begin
>   drm/i915: Add intel_ring_handle_seqno wrap
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>

>   drm/i915: Add debugfs entry to read/write next_seqno
Acked-by: Chris Wilson <chris@chris-wilson.co.uk>

>   drm/i915: Set initial seqno value close to wrap boundary
*washes hands*
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

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

* Re: [PATCH 0/6] ring seqno wrap handling
  2012-12-04 14:05 ` [PATCH 0/6] ring seqno wrap handling Chris Wilson
@ 2012-12-04 22:03   ` Daniel Vetter
  0 siblings, 0 replies; 15+ messages in thread
From: Daniel Vetter @ 2012-12-04 22:03 UTC (permalink / raw)
  To: Chris Wilson; +Cc: intel-gfx

On Tue, Dec 04, 2012 at 02:05:42PM +0000, Chris Wilson wrote:
> On Tue,  4 Dec 2012 15:11:59 +0200, Mika Kuoppala <mika.kuoppala@linux.intel.com> wrote:
> > Hi,
> > 
> > As Ben suggested, explicitly syncing across wrap boundary
> > revealed yet another set of issues that gem_stress didn't find.
> > 
> > So here is a patchset which addresses the syncing problems
> > across wrap boundary. Chris helped me to carve out seqno handling
> > ugliness from my initial attempts to handle the ring wrapping.
> > 
> > As I can't break this anymore, i added 6/6.
> > --Mika
> > 
> > Mika Kuoppala (6):
> >   drm/i915: Fix debugfs seqno info print to use uint
> >   drm/i915: Don't emit semaphore wait if wrap happened
> >   drm/i915: Split intel_ring_begin
> >   drm/i915: Add intel_ring_handle_seqno wrap
> Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
> 
> >   drm/i915: Add debugfs entry to read/write next_seqno
> Acked-by: Chris Wilson <chris@chris-wilson.co.uk>

Merged them all, thanks for patches&review.
> 
> >   drm/i915: Set initial seqno value close to wrap boundary
> *washes hands*

I'm feeling stupid/lucky/bold/whatever, also merged.

/me hides

Cheers, Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

* Re: [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened
  2012-12-04 13:12 ` [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened Mika Kuoppala
@ 2012-12-05 20:44   ` Paulo Zanoni
  2012-12-06  8:51     ` Daniel Vetter
  2012-12-06 14:12   ` [PATCH] Detect wraparound using next-seqno rather than waiter->olr Chris Wilson
  1 sibling, 1 reply; 15+ messages in thread
From: Paulo Zanoni @ 2012-12-05 20:44 UTC (permalink / raw)
  To: Mika Kuoppala; +Cc: intel-gfx

Hi

2012/12/4 Mika Kuoppala <mika.kuoppala@linux.intel.com>:
> If wrap just happened we need to prevent emitting waits for
> pre wrap values. Detect this and emit no-ops instead.
>
> v2: Use olr > seqno to detect wrap instead of *seqno == 0
> as suggested by Chris Wilson.

This commit introduces a bug on Haswell. Now when I'm typing my
password on GDM the screen keeps doing wrong rendering. It "blinks
blue". After logging in I don't see more problems.

>
> Signed-off-by: Mika Kuoppala <mika.kuoppala@intel.com>
> ---
>  drivers/gpu/drm/i915/intel_ringbuffer.c |   21 ++++++++++++++++-----
>  1 file changed, 16 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
> index 36e1e13a..2305af5 100644
> --- a/drivers/gpu/drm/i915/intel_ringbuffer.c
> +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
> @@ -626,11 +626,22 @@ gen6_ring_sync(struct intel_ring_buffer *waiter,
>         if (ret)
>                 return ret;
>
> -       intel_ring_emit(waiter,
> -                       dw1 | signaller->semaphore_register[waiter->id]);
> -       intel_ring_emit(waiter, seqno);
> -       intel_ring_emit(waiter, 0);
> -       intel_ring_emit(waiter, MI_NOOP);
> +       BUG_ON(!waiter->outstanding_lazy_request);
> +
> +       /* If seqno wrap happened, omit the wait with no-ops */
> +       if (likely(waiter->outstanding_lazy_request > seqno)) {
> +               intel_ring_emit(waiter,
> +                               dw1 |
> +                               signaller->semaphore_register[waiter->id]);
> +               intel_ring_emit(waiter, seqno);
> +               intel_ring_emit(waiter, 0);
> +               intel_ring_emit(waiter, MI_NOOP);
> +       } else {
> +               intel_ring_emit(waiter, MI_NOOP);
> +               intel_ring_emit(waiter, MI_NOOP);
> +               intel_ring_emit(waiter, MI_NOOP);
> +               intel_ring_emit(waiter, MI_NOOP);
> +       }
>         intel_ring_advance(waiter);
>
>         return 0;
> --
> 1.7.9.5
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx



-- 
Paulo Zanoni

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

* Re: [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened
  2012-12-05 20:44   ` Paulo Zanoni
@ 2012-12-06  8:51     ` Daniel Vetter
  2012-12-06 11:41       ` Paulo Zanoni
  0 siblings, 1 reply; 15+ messages in thread
From: Daniel Vetter @ 2012-12-06  8:51 UTC (permalink / raw)
  To: Paulo Zanoni; +Cc: intel-gfx

On Wed, Dec 5, 2012 at 9:44 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
> 2012/12/4 Mika Kuoppala <mika.kuoppala@linux.intel.com>:
>> If wrap just happened we need to prevent emitting waits for
>> pre wrap values. Detect this and emit no-ops instead.
>>
>> v2: Use olr > seqno to detect wrap instead of *seqno == 0
>> as suggested by Chris Wilson.
>
> This commit introduces a bug on Haswell. Now when I'm typing my
> password on GDM the screen keeps doing wrong rendering. It "blinks
> blue". After logging in I don't see more prodrm/i915: Set initial seqno value close to wrap boundaryblems.

Just now I've taken out "drm/i915: Set initial seqno value close to
wrap boundary" since QA complained that it regresses things. Does that
help for you, too?
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

* Re: [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened
  2012-12-06  8:51     ` Daniel Vetter
@ 2012-12-06 11:41       ` Paulo Zanoni
  2012-12-06 12:14         ` Daniel Vetter
  0 siblings, 1 reply; 15+ messages in thread
From: Paulo Zanoni @ 2012-12-06 11:41 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: intel-gfx

Hi

2012/12/6 Daniel Vetter <daniel@ffwll.ch>:
> On Wed, Dec 5, 2012 at 9:44 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
>> 2012/12/4 Mika Kuoppala <mika.kuoppala@linux.intel.com>:
>>> If wrap just happened we need to prevent emitting waits for
>>> pre wrap values. Detect this and emit no-ops instead.
>>>
>>> v2: Use olr > seqno to detect wrap instead of *seqno == 0
>>> as suggested by Chris Wilson.
>>
>> This commit introduces a bug on Haswell. Now when I'm typing my
>> password on GDM the screen keeps doing wrong rendering. It "blinks
>> blue". After logging in I don't see more prodrm/i915: Set initial seqno value close to wrap boundaryblems.
>
> Just now I've taken out "drm/i915: Set initial seqno value close to
> wrap boundary" since QA complained that it regresses things. Does that
> help for you, too?

It helps: besides the "wrong rendering at GDM screen" I was also
getting  GPU hangs (when starting X, when running dmesg, when alt+tab,
etc), and it seems with today's dinq I don't get the gpu hangs
anymore. I still get the "wrong rendering" problem and it goes away if
we revert the "Don't emit semaphore wait  if wrap happened".

> -Daniel
> --
> Daniel Vetter
> Software Engineer, Intel Corporation
> +41 (0) 79 365 57 48 - http://blog.ffwll.ch



-- 
Paulo Zanoni

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

* Re: [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened
  2012-12-06 11:41       ` Paulo Zanoni
@ 2012-12-06 12:14         ` Daniel Vetter
  2012-12-06 12:24           ` Chris Wilson
  0 siblings, 1 reply; 15+ messages in thread
From: Daniel Vetter @ 2012-12-06 12:14 UTC (permalink / raw)
  To: Paulo Zanoni; +Cc: intel-gfx

On Thu, Dec 6, 2012 at 12:41 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
> 2012/12/6 Daniel Vetter <daniel@ffwll.ch>:
>> On Wed, Dec 5, 2012 at 9:44 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
>>> 2012/12/4 Mika Kuoppala <mika.kuoppala@linux.intel.com>:
>>>> If wrap just happened we need to prevent emitting waits for
>>>> pre wrap values. Detect this and emit no-ops instead.
>>>>
>>>> v2: Use olr > seqno to detect wrap instead of *seqno == 0
>>>> as suggested by Chris Wilson.
>>>
>>> This commit introduces a bug on Haswell. Now when I'm typing my
>>> password on GDM the screen keeps doing wrong rendering. It "blinks
>>> blue". After logging in I don't see more prodrm/i915: Set initial seqno value close to wrap boundaryblems.
>>
>> Just now I've taken out "drm/i915: Set initial seqno value close to
>> wrap boundary" since QA complained that it regresses things. Does that
>> help for you, too?
>
> It helps: besides the "wrong rendering at GDM screen" I was also
> getting  GPU hangs (when starting X, when running dmesg, when alt+tab,
> etc), and it seems with today's dinq I don't get the gpu hangs
> anymore. I still get the "wrong rendering" problem and it goes away if
> we revert the "Don't emit semaphore wait  if wrap happened".

Ok, looks like we have still some fish left to fry here. I've backed
out the 2nd patch, too. And I guess we need some more tests in i-g-t
to check semaphore correctness, we seem to have some serious gaps ...
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch

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

* Re: [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened
  2012-12-06 12:14         ` Daniel Vetter
@ 2012-12-06 12:24           ` Chris Wilson
  0 siblings, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2012-12-06 12:24 UTC (permalink / raw)
  To: Daniel Vetter, Paulo Zanoni; +Cc: intel-gfx

On Thu, 6 Dec 2012 13:14:09 +0100, Daniel Vetter <daniel@ffwll.ch> wrote:
> On Thu, Dec 6, 2012 at 12:41 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
> > 2012/12/6 Daniel Vetter <daniel@ffwll.ch>:
> >> On Wed, Dec 5, 2012 at 9:44 PM, Paulo Zanoni <przanoni@gmail.com> wrote:
> >>> 2012/12/4 Mika Kuoppala <mika.kuoppala@linux.intel.com>:
> >>>> If wrap just happened we need to prevent emitting waits for
> >>>> pre wrap values. Detect this and emit no-ops instead.
> >>>>
> >>>> v2: Use olr > seqno to detect wrap instead of *seqno == 0
> >>>> as suggested by Chris Wilson.
> >>>
> >>> This commit introduces a bug on Haswell. Now when I'm typing my
> >>> password on GDM the screen keeps doing wrong rendering. It "blinks
> >>> blue". After logging in I don't see more prodrm/i915: Set initial seqno value close to wrap boundaryblems.
> >>
> >> Just now I've taken out "drm/i915: Set initial seqno value close to
> >> wrap boundary" since QA complained that it regresses things. Does that
> >> help for you, too?
> >
> > It helps: besides the "wrong rendering at GDM screen" I was also
> > getting  GPU hangs (when starting X, when running dmesg, when alt+tab,
> > etc), and it seems with today's dinq I don't get the gpu hangs
> > anymore. I still get the "wrong rendering" problem and it goes away if
> > we revert the "Don't emit semaphore wait  if wrap happened".
> 
> Ok, looks like we have still some fish left to fry here. I've backed
> out the 2nd patch, too. And I guess we need some more tests in i-g-t
> to check semaphore correctness, we seem to have some serious gaps ...

I wouldn't back that out too quickly as it seems that Paulo has some
debugging to do first. A few WARNs would be a good start...
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

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

* [PATCH] Detect wraparound using next-seqno rather than waiter->olr
  2012-12-04 13:12 ` [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened Mika Kuoppala
  2012-12-05 20:44   ` Paulo Zanoni
@ 2012-12-06 14:12   ` Chris Wilson
  1 sibling, 0 replies; 15+ messages in thread
From: Chris Wilson @ 2012-12-06 14:12 UTC (permalink / raw)
  To: intel-gfx

As the olr may have been allocated long in advance for a much earlier
write to the ring, waiter->olr may genuinely be less than the semaphore
seqno. So use the global next_seqno for wraparound detection instead.
---
 drivers/gpu/drm/i915/intel_ringbuffer.c |    8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index d5d5177..29f9e2c 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -595,6 +595,12 @@ gen6_add_request(struct intel_ring_buffer *ring)
 	return 0;
 }
 
+static inline u32 i915_gem_next_seqno(struct drm_device *dev)
+{
+	struct drm_i915_private *dev_priv = dev->dev_private;
+	return dev_priv->next_seqno;
+}
+
 /**
  * intel_ring_sync - sync the waiter to the signaller on seqno
  *
@@ -628,7 +634,7 @@ gen6_ring_sync(struct intel_ring_buffer *waiter,
 	BUG_ON(!waiter->outstanding_lazy_request);
 
 	/* If seqno wrap happened, omit the wait with no-ops */
-	if (likely(waiter->outstanding_lazy_request > seqno)) {
+	if (likely(i915_gem_next_seqno(waiter->dev) > seqno)) {
 		intel_ring_emit(waiter,
 				dw1 |
 				signaller->semaphore_register[waiter->id]);
-- 
1.7.10.4

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

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

Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-12-04 13:11 [PATCH 0/6] ring seqno wrap handling Mika Kuoppala
2012-12-04 13:12 ` [PATCH 1/6] drm/i915: Add debugfs entry to read/write next_seqno Mika Kuoppala
2012-12-04 13:12 ` [PATCH 2/6] drm/i915: Fix debugfs seqno info print to use uint Mika Kuoppala
2012-12-04 13:12 ` [PATCH 3/6] drm/i915: Don't emit semaphore wait if wrap happened Mika Kuoppala
2012-12-05 20:44   ` Paulo Zanoni
2012-12-06  8:51     ` Daniel Vetter
2012-12-06 11:41       ` Paulo Zanoni
2012-12-06 12:14         ` Daniel Vetter
2012-12-06 12:24           ` Chris Wilson
2012-12-06 14:12   ` [PATCH] Detect wraparound using next-seqno rather than waiter->olr Chris Wilson
2012-12-04 13:12 ` [PATCH 4/6] drm/i915: Split intel_ring_begin Mika Kuoppala
2012-12-04 13:12 ` [PATCH 5/6] drm/i915: Add intel_ring_handle_seqno wrap Mika Kuoppala
2012-12-04 13:12 ` [PATCH 6/6] drm/i915: Set initial seqno value close to wrap boundary Mika Kuoppala
2012-12-04 14:05 ` [PATCH 0/6] ring seqno wrap handling Chris Wilson
2012-12-04 22:03   ` Daniel Vetter

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.