* [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance}
@ 2014-12-10 15:07 Dave Gordon
2014-12-10 15:07 ` [PATCH 1/2] drm/i915: Track & check " Dave Gordon
` (3 more replies)
0 siblings, 4 replies; 10+ messages in thread
From: Dave Gordon @ 2014-12-10 15:07 UTC (permalink / raw)
To: intel-gfx
When adding instructions to a legacy or LRC ringbuffer, the sequence of
emit() calls must be preceded by a call to intel(_logical)_ring_begin()
to reserve the required amount of space, and followed by a matching call
to intel(_logical)_ring_advance(). Historically some (display) code
didn't use begin/advance, but just inserted instructions ad hoc, which
would then be sent to the hardware along with the current or next batch,
but this is not supported and is now regarded as incorrect.
This commit therefore adds begin/advance tracking, with WARNings where
various forms of misuse are detected.
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] drm/i915: Track & check calls to intel(_logical)_ring_{begin, advance}
2014-12-10 15:07 [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance} Dave Gordon
@ 2014-12-10 15:07 ` Dave Gordon
2014-12-10 15:44 ` Daniel Vetter
2014-12-10 15:07 ` [PATCH 2/2] drm/i915: Track nested " Dave Gordon
` (2 subsequent siblings)
3 siblings, 1 reply; 10+ messages in thread
From: Dave Gordon @ 2014-12-10 15:07 UTC (permalink / raw)
To: intel-gfx
When adding instructions to a legacy or LRC ringbuffer, the sequence of
emit() calls must be preceded by a call to intel(_logical)_ring_begin()
to reserve the required amount of space, and followed by a matching call
to intel(_logical)_ring_advance() (note that this used to trigger
immediate submission to the h/w, but now actual submission is deferred
until all the instructions for a single batch submission have been
assembled). Historically some (display) code didn't use begin/advance,
but just inserted instructions ad hoc, which would then be sent to the
hardware along with the current or next batch, but this is not supported
and is now regarded as incorrect.
This commit therefore adds begin/advance tracking, with WARNings where
various forms of misuse are detected. These include:
* advance without begin
* begin without advance before submission to h/w
* multiple begins without an advance between
* exceeding the space reserved by begin
* leaving the ring misaligned
* ring buffer overrun (negative freespace)
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
---
drivers/gpu/drm/i915/intel_lrc.c | 4 ++-
drivers/gpu/drm/i915/intel_lrc.h | 11 ++++++-
drivers/gpu/drm/i915/intel_ringbuffer.c | 10 ++++--
drivers/gpu/drm/i915/intel_ringbuffer.h | 55 ++++++++++++++++++++++++++++++-
4 files changed, 75 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index a82020e..56e3636 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -825,6 +825,7 @@ void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf)
struct intel_context *ctx = ringbuf->FIXME_lrc_ctx;
intel_logical_ring_advance(ringbuf);
+ WARN_ON(ringbuf->rsv_level != 0);
if (intel_ring_stopped(ring))
return;
@@ -1084,7 +1085,8 @@ int intel_logical_ring_begin(struct intel_ringbuffer *ringbuf, int num_dwords)
if (ret)
return ret;
- ringbuf->space -= num_dwords * sizeof(uint32_t);
+ __intel_ringbuffer_begin(ringbuf, num_dwords);
+
return 0;
}
diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h
index 14b216b..9a0457e 100644
--- a/drivers/gpu/drm/i915/intel_lrc.h
+++ b/drivers/gpu/drm/i915/intel_lrc.h
@@ -48,8 +48,17 @@ void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf);
*/
static inline void intel_logical_ring_advance(struct intel_ringbuffer *ringbuf)
{
- ringbuf->tail &= ringbuf->size - 1;
+ __intel_ringbuffer_check(ringbuf);
+
+ /*
+ * Tail == effecive_size is legitimate (buffer exactly full).
+ * Tail > effective_size is not, and should give a warning,
+ * but we'll reset tail in both cases to prevent further chaos
+ */
+ if (ringbuf->tail >= ringbuf->effective_size)
+ ringbuf->tail -= ringbuf->effective_size;
}
+
/**
* intel_logical_ring_emit() - write a DWORD to the ringbuffer.
* @ringbuf: Ringbuffer to write to.
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 83accb7..5874eab 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -55,6 +55,7 @@ int __intel_ring_space(int head, int tail, int size)
int space = head - tail;
if (space <= 0)
space += size;
+ WARN_ON(space < I915_RING_FREE_SPACE);
return space - I915_RING_FREE_SPACE;
}
@@ -84,7 +85,10 @@ bool intel_ring_stopped(struct intel_engine_cs *ring)
void __intel_ring_advance(struct intel_engine_cs *ring)
{
struct intel_ringbuffer *ringbuf = ring->buffer;
- ringbuf->tail &= ringbuf->size - 1;
+
+ intel_ring_advance(ring);
+ WARN_ON(ringbuf->rsv_level != 0);
+
if (intel_ring_stopped(ring))
return;
ring->write_tail(ring, ringbuf->tail);
@@ -1911,6 +1915,7 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
return 0;
list_for_each_entry(request, &ring->request_list, list) {
+ /* Would completion of this request free enough space? */
if (__intel_ring_space(request->tail, ringbuf->tail,
ringbuf->size) >= n) {
break;
@@ -2096,7 +2101,8 @@ int intel_ring_begin(struct intel_engine_cs *ring,
if (ret)
return ret;
- ring->buffer->space -= num_dwords * sizeof(uint32_t);
+ __intel_ringbuffer_begin(ring->buffer, num_dwords);
+
return 0;
}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 6dbb6f4..a10d271 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -112,6 +112,11 @@ struct intel_ringbuffer {
int size;
int effective_size;
+ /* these let advance() check for misuse */
+ int rsv_level; /* reservation nesting level */
+ int rsv_size; /* size passed to begin() */
+ int rsv_start; /* tail when begin() last returned */
+
/** We track the position of the requests in the ring buffer, and
* when each is retired we increment last_retired_head as the GPU
* must have finished processing the request and so we know we
@@ -401,11 +406,59 @@ static inline void intel_ring_emit(struct intel_engine_cs *ring,
iowrite32(data, ringbuf->virtual_start + ringbuf->tail);
ringbuf->tail += 4;
}
+
+static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
+ int num_dwords)
+{
+ int nbytes = num_dwords * sizeof(uint32_t);
+#if 1 /* DEBUG CODE */
+ WARN_ON(num_dwords & 1);
+ WARN_ON(nbytes <= 0);
+
+ if (ringbuf->rsv_level++) {
+ /* begin() called twice or more without advance() */
+ WARN_ON(1);
+ } else {
+ /*
+ * A new reservation; validate and record the start and
+ * size, then deduct the size from the remaining space
+ */
+ WARN_ON(ringbuf->tail & 7);
+ WARN_ON(ringbuf->tail > ringbuf->effective_size-8);
+ WARN_ON(ringbuf->tail + nbytes > ringbuf->effective_size);
+ WARN_ON(ringbuf->space < nbytes);
+ }
+#endif
+ ringbuf->rsv_start = ringbuf->tail;
+ ringbuf->rsv_size = nbytes;
+ ringbuf->space -= nbytes;
+}
+
+static inline void __intel_ringbuffer_check(struct intel_ringbuffer *ringbuf)
+{
+#if 1
+ WARN_ON(ringbuf->rsv_level-- != 1);
+ WARN_ON(ringbuf->rsv_start < 0 || ringbuf->rsv_size < 0);
+ WARN_ON(ringbuf->tail & 7);
+ WARN_ON(ringbuf->tail > ringbuf->rsv_start + ringbuf->rsv_size);
+ WARN_ON(ringbuf->tail > ringbuf->effective_size);
+#endif
+}
static inline void intel_ring_advance(struct intel_engine_cs *ring)
{
struct intel_ringbuffer *ringbuf = ring->buffer;
- ringbuf->tail &= ringbuf->size - 1;
+
+ __intel_ringbuffer_check(ringbuf);
+
+ /*
+ * Tail == effecive_size is legitimate (buffer exactly full).
+ * Tail > effective_size is not, and should give a warning,
+ * but we'll reset tail in both cases to prevent further chaos
+ */
+ if (ringbuf->tail >= ringbuf->effective_size)
+ ringbuf->tail -= ringbuf->effective_size;
}
+
int __intel_ring_space(int head, int tail, int size);
void intel_ring_update_space(struct intel_ringbuffer *ringbuf);
int intel_ring_space(struct intel_ringbuffer *ringbuf);
--
1.7.9.5
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] drm/i915: Track nested calls to intel(_logical)_ring_{begin, advance}
2014-12-10 15:07 [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance} Dave Gordon
2014-12-10 15:07 ` [PATCH 1/2] drm/i915: Track & check " Dave Gordon
@ 2014-12-10 15:07 ` Dave Gordon
2014-12-10 22:46 ` shuang.he
2014-12-10 16:12 ` [PATCH v2 0/2] Track " Dave Gordon
2014-12-10 16:23 ` [PATCH 0/2] Track " Chris Wilson
3 siblings, 1 reply; 10+ messages in thread
From: Dave Gordon @ 2014-12-10 15:07 UTC (permalink / raw)
To: intel-gfx
With the current deferred-submission model, if a problem arises part-way
through the insertion of instructions into the ringbuffer (e.g. due to
one of the begin() calls finding there's not enough space), we avoid
sending the incomplete sequence to the h/w; but currently have no means
of undoing the work so far, which will lead to undefined behaviour when
the next batch is submitted (probably TDR will trigger a reset first,
though, and clean up the ring state).
A future idea is to move to an atomic-submission model, where all the
space required for a batch submission is reserved up front, and in the
event of failure partway through, the work can be abandoned without
side-effects. This will be required for the forthcoming GPU scheduler
(specifically, for preemption).
To support this, we allow nested begin/advance pairs. Specifically,
the outermost pair defines the total space reservation; inner pairs
can be nested ad lib, but all inner reservations at any level must
fit entirely within the outermost one. Thus, this is permitted:
begin(128) - guarantees that up to 128 dwords can now be
emitted without waiting for more freespace
begin(6)
advance
begin(10)
advance
begin(8)
advance
etc, as long as the total is no more than 128 dwords
advance-and-submit
The execbuffer code will later be enhanced to use this approach. In the
mean time, the traditional single-level begin/advance mechanism remains
fully supported.
This commit changes only the begin/advance checking code, to permit (but
not require) nested begin/advance pairs.
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
---
drivers/gpu/drm/i915/intel_ringbuffer.h | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index a10d271..71cb3ef 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -416,8 +416,17 @@ static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
WARN_ON(nbytes <= 0);
if (ringbuf->rsv_level++) {
- /* begin() called twice or more without advance() */
- WARN_ON(1);
+ /*
+ * A nested reservation; check that it falls entirely
+ * within the outer block. Don't adjust remaining space.
+ */
+ WARN_ON(ringbuf->rsv_start < 0);
+ WARN_ON(ringbuf->rsv_start & 7);
+ WARN_ON(ringbuf->tail & 7);
+ WARN_ON(ringbuf->tail > ringbuf->effective_size);
+ WARN_ON(ringbuf->tail > ringbuf->rsv_start + ringbuf->rsv_size);
+ WARN_ON(ringbuf->tail + nbytes > ringbuf->effective_size);
+ WARN_ON(ringbuf->tail + nbytes > ringbuf->rsv_start + ringbuf->rsv_size);
} else {
/*
* A new reservation; validate and record the start and
@@ -437,7 +446,7 @@ static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
static inline void __intel_ringbuffer_check(struct intel_ringbuffer *ringbuf)
{
#if 1
- WARN_ON(ringbuf->rsv_level-- != 1);
+ WARN_ON(ringbuf->rsv_level-- <= 0);
WARN_ON(ringbuf->rsv_start < 0 || ringbuf->rsv_size < 0);
WARN_ON(ringbuf->tail & 7);
WARN_ON(ringbuf->tail > ringbuf->rsv_start + ringbuf->rsv_size);
--
1.7.9.5
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 1/2] drm/i915: Track & check calls to intel(_logical)_ring_{begin, advance}
2014-12-10 15:07 ` [PATCH 1/2] drm/i915: Track & check " Dave Gordon
@ 2014-12-10 15:44 ` Daniel Vetter
0 siblings, 0 replies; 10+ messages in thread
From: Daniel Vetter @ 2014-12-10 15:44 UTC (permalink / raw)
To: Dave Gordon; +Cc: intel-gfx
On Wed, Dec 10, 2014 at 03:07:08PM +0000, Dave Gordon wrote:
> @@ -401,11 +406,59 @@ static inline void intel_ring_emit(struct intel_engine_cs *ring,
> iowrite32(data, ringbuf->virtual_start + ringbuf->tail);
> ringbuf->tail += 4;
> }
> +
> +static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
> + int num_dwords)
> +{
> + int nbytes = num_dwords * sizeof(uint32_t);
> +#if 1 /* DEBUG CODE */
No #ifdef's in code please, they tend to be either just go stale or just
obfuscate the code.
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
+41 (0) 79 365 57 48 - http://blog.ffwll.ch
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 0/2] Track calls to intel(_logical)_ring_{begin, advance}
2014-12-10 15:07 [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance} Dave Gordon
2014-12-10 15:07 ` [PATCH 1/2] drm/i915: Track & check " Dave Gordon
2014-12-10 15:07 ` [PATCH 2/2] drm/i915: Track nested " Dave Gordon
@ 2014-12-10 16:12 ` Dave Gordon
2014-12-10 16:12 ` [PATCH v2 1/2] drm/i915: Track & check " Dave Gordon
2014-12-10 16:12 ` [PATCH v2 2/2] drm/i915: Track nested " Dave Gordon
2014-12-10 16:23 ` [PATCH 0/2] Track " Chris Wilson
3 siblings, 2 replies; 10+ messages in thread
From: Dave Gordon @ 2014-12-10 16:12 UTC (permalink / raw)
To: intel-gfx
When adding instructions to a legacy or LRC ringbuffer, the sequence of
emit() calls must be preceded by a call to intel(_logical)_ring_begin()
to reserve the required amount of space, and followed by a matching call
to intel(_logical)_ring_advance(). Historically some (display) code
didn't use begin/advance, but just inserted instructions ad hoc, which
would then be sent to the hardware along with the current or next batch,
but this is not supported and is now regarded as incorrect.
This commit therefore adds begin/advance tracking, with WARNings where
various forms of misuse are detected.
v2: remove redundant "#if 1" markers
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v2 1/2] drm/i915: Track & check calls to intel(_logical)_ring_{begin, advance}
2014-12-10 16:12 ` [PATCH v2 0/2] Track " Dave Gordon
@ 2014-12-10 16:12 ` Dave Gordon
2014-12-10 16:12 ` [PATCH v2 2/2] drm/i915: Track nested " Dave Gordon
1 sibling, 0 replies; 10+ messages in thread
From: Dave Gordon @ 2014-12-10 16:12 UTC (permalink / raw)
To: intel-gfx
When adding instructions to a legacy or LRC ringbuffer, the sequence of
emit() calls must be preceded by a call to intel(_logical)_ring_begin()
to reserve the required amount of space, and followed by a matching call
to intel(_logical)_ring_advance() (note that this used to trigger
immediate submission to the h/w, but now actual submission is deferred
until all the instructions for a single batch submission have been
assembled). Historically some (display) code didn't use begin/advance,
but just inserted instructions ad hoc, which would then be sent to the
hardware along with the current or next batch, but this is not supported
and is now regarded as incorrect.
This commit therefore adds begin/advance tracking, with WARNings where
various forms of misuse are detected. These include:
* advance without begin
* begin without advance before submission to h/w
* multiple begins without an advance between
* exceeding the space reserved by begin
* leaving the ring misaligned
* ring buffer overrun (negative freespace)
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
---
drivers/gpu/drm/i915/intel_lrc.c | 4 ++-
drivers/gpu/drm/i915/intel_lrc.h | 11 ++++++-
drivers/gpu/drm/i915/intel_ringbuffer.c | 10 ++++--
drivers/gpu/drm/i915/intel_ringbuffer.h | 54 ++++++++++++++++++++++++++++++-
4 files changed, 74 insertions(+), 5 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_lrc.c b/drivers/gpu/drm/i915/intel_lrc.c
index a82020e..56e3636 100644
--- a/drivers/gpu/drm/i915/intel_lrc.c
+++ b/drivers/gpu/drm/i915/intel_lrc.c
@@ -825,6 +825,7 @@ void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf)
struct intel_context *ctx = ringbuf->FIXME_lrc_ctx;
intel_logical_ring_advance(ringbuf);
+ WARN_ON(ringbuf->rsv_level != 0);
if (intel_ring_stopped(ring))
return;
@@ -1084,7 +1085,8 @@ int intel_logical_ring_begin(struct intel_ringbuffer *ringbuf, int num_dwords)
if (ret)
return ret;
- ringbuf->space -= num_dwords * sizeof(uint32_t);
+ __intel_ringbuffer_begin(ringbuf, num_dwords);
+
return 0;
}
diff --git a/drivers/gpu/drm/i915/intel_lrc.h b/drivers/gpu/drm/i915/intel_lrc.h
index 14b216b..9a0457e 100644
--- a/drivers/gpu/drm/i915/intel_lrc.h
+++ b/drivers/gpu/drm/i915/intel_lrc.h
@@ -48,8 +48,17 @@ void intel_logical_ring_advance_and_submit(struct intel_ringbuffer *ringbuf);
*/
static inline void intel_logical_ring_advance(struct intel_ringbuffer *ringbuf)
{
- ringbuf->tail &= ringbuf->size - 1;
+ __intel_ringbuffer_check(ringbuf);
+
+ /*
+ * Tail == effecive_size is legitimate (buffer exactly full).
+ * Tail > effective_size is not, and should give a warning,
+ * but we'll reset tail in both cases to prevent further chaos
+ */
+ if (ringbuf->tail >= ringbuf->effective_size)
+ ringbuf->tail -= ringbuf->effective_size;
}
+
/**
* intel_logical_ring_emit() - write a DWORD to the ringbuffer.
* @ringbuf: Ringbuffer to write to.
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c
index 83accb7..5874eab 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.c
@@ -55,6 +55,7 @@ int __intel_ring_space(int head, int tail, int size)
int space = head - tail;
if (space <= 0)
space += size;
+ WARN_ON(space < I915_RING_FREE_SPACE);
return space - I915_RING_FREE_SPACE;
}
@@ -84,7 +85,10 @@ bool intel_ring_stopped(struct intel_engine_cs *ring)
void __intel_ring_advance(struct intel_engine_cs *ring)
{
struct intel_ringbuffer *ringbuf = ring->buffer;
- ringbuf->tail &= ringbuf->size - 1;
+
+ intel_ring_advance(ring);
+ WARN_ON(ringbuf->rsv_level != 0);
+
if (intel_ring_stopped(ring))
return;
ring->write_tail(ring, ringbuf->tail);
@@ -1911,6 +1915,7 @@ static int intel_ring_wait_request(struct intel_engine_cs *ring, int n)
return 0;
list_for_each_entry(request, &ring->request_list, list) {
+ /* Would completion of this request free enough space? */
if (__intel_ring_space(request->tail, ringbuf->tail,
ringbuf->size) >= n) {
break;
@@ -2096,7 +2101,8 @@ int intel_ring_begin(struct intel_engine_cs *ring,
if (ret)
return ret;
- ring->buffer->space -= num_dwords * sizeof(uint32_t);
+ __intel_ringbuffer_begin(ring->buffer, num_dwords);
+
return 0;
}
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index 6dbb6f4..a6660c1 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -112,6 +112,11 @@ struct intel_ringbuffer {
int size;
int effective_size;
+ /* these let advance() check for misuse */
+ int rsv_level; /* reservation nesting level */
+ int rsv_size; /* size passed to begin() */
+ int rsv_start; /* tail when begin() last returned */
+
/** We track the position of the requests in the ring buffer, and
* when each is retired we increment last_retired_head as the GPU
* must have finished processing the request and so we know we
@@ -401,11 +406,58 @@ static inline void intel_ring_emit(struct intel_engine_cs *ring,
iowrite32(data, ringbuf->virtual_start + ringbuf->tail);
ringbuf->tail += 4;
}
+
+static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
+ int num_dwords)
+{
+ int nbytes = num_dwords * sizeof(uint32_t);
+
+ WARN_ON(num_dwords & 1);
+ WARN_ON(nbytes <= 0);
+
+ if (ringbuf->rsv_level++) {
+ /* begin() called twice or more without advance() */
+ WARN_ON(1);
+ } else {
+ /*
+ * A new reservation; validate and record the start and
+ * size, then deduct the size from the remaining space
+ */
+ WARN_ON(ringbuf->tail & 7);
+ WARN_ON(ringbuf->tail > ringbuf->effective_size-8);
+ WARN_ON(ringbuf->tail + nbytes > ringbuf->effective_size);
+ WARN_ON(ringbuf->space < nbytes);
+ }
+
+ ringbuf->rsv_start = ringbuf->tail;
+ ringbuf->rsv_size = nbytes;
+ ringbuf->space -= nbytes;
+}
+
+static inline void __intel_ringbuffer_check(struct intel_ringbuffer *ringbuf)
+{
+ WARN_ON(ringbuf->rsv_level-- != 1);
+ WARN_ON(ringbuf->rsv_start < 0 || ringbuf->rsv_size < 0);
+ WARN_ON(ringbuf->tail & 7);
+ WARN_ON(ringbuf->tail > ringbuf->rsv_start + ringbuf->rsv_size);
+ WARN_ON(ringbuf->tail > ringbuf->effective_size);
+}
+
static inline void intel_ring_advance(struct intel_engine_cs *ring)
{
struct intel_ringbuffer *ringbuf = ring->buffer;
- ringbuf->tail &= ringbuf->size - 1;
+
+ __intel_ringbuffer_check(ringbuf);
+
+ /*
+ * Tail == effecive_size is legitimate (buffer exactly full).
+ * Tail > effective_size is not, and should give a warning,
+ * but we'll reset tail in both cases to prevent further chaos
+ */
+ if (ringbuf->tail >= ringbuf->effective_size)
+ ringbuf->tail -= ringbuf->effective_size;
}
+
int __intel_ring_space(int head, int tail, int size);
void intel_ring_update_space(struct intel_ringbuffer *ringbuf);
int intel_ring_space(struct intel_ringbuffer *ringbuf);
--
1.7.9.5
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v2 2/2] drm/i915: Track nested calls to intel(_logical)_ring_{begin, advance}
2014-12-10 16:12 ` [PATCH v2 0/2] Track " Dave Gordon
2014-12-10 16:12 ` [PATCH v2 1/2] drm/i915: Track & check " Dave Gordon
@ 2014-12-10 16:12 ` Dave Gordon
2014-12-11 0:30 ` shuang.he
1 sibling, 1 reply; 10+ messages in thread
From: Dave Gordon @ 2014-12-10 16:12 UTC (permalink / raw)
To: intel-gfx
With the current deferred-submission model, if a problem arises part-way
through the insertion of instructions into the ringbuffer (e.g. due to
one of the begin() calls finding there's not enough space), we avoid
sending the incomplete sequence to the h/w; but currently have no means
of undoing the work so far, which will lead to undefined behaviour when
the next batch is submitted (probably TDR will trigger a reset first,
though, and clean up the ring state).
A future idea is to move to an atomic-submission model, where all the
space required for a batch submission is reserved up front, and in the
event of failure partway through, the work can be abandoned without
side-effects. This will be required for the forthcoming GPU scheduler
(specifically, for preemption).
To support this, we allow nested begin/advance pairs. Specifically,
the outermost pair defines the total space reservation; inner pairs
can be nested ad lib, but all inner reservations at any level must
fit entirely within the outermost one. Thus, this is permitted:
begin(128) - guarantees that up to 128 dwords can now be
emitted without waiting for more freespace
begin(6)
advance
begin(10)
advance
begin(8)
advance
etc, as long as the total is no more than 128 dwords
advance-and-submit
The execbuffer code will later be enhanced to use this approach. In the
mean time, the traditional single-level begin/advance mechanism remains
fully supported.
This commit changes only the begin/advance checking code, to permit (but
not require) nested begin/advance pairs.
Signed-off-by: Dave Gordon <david.s.gordon@intel.com>
---
drivers/gpu/drm/i915/intel_ringbuffer.h | 15 ++++++++++++---
1 file changed, 12 insertions(+), 3 deletions(-)
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.h b/drivers/gpu/drm/i915/intel_ringbuffer.h
index a6660c1..68665c7 100644
--- a/drivers/gpu/drm/i915/intel_ringbuffer.h
+++ b/drivers/gpu/drm/i915/intel_ringbuffer.h
@@ -416,8 +416,17 @@ static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
WARN_ON(nbytes <= 0);
if (ringbuf->rsv_level++) {
- /* begin() called twice or more without advance() */
- WARN_ON(1);
+ /*
+ * A nested reservation; check that it falls entirely
+ * within the outer block. Don't adjust remaining space.
+ */
+ WARN_ON(ringbuf->rsv_start < 0);
+ WARN_ON(ringbuf->rsv_start & 7);
+ WARN_ON(ringbuf->tail & 7);
+ WARN_ON(ringbuf->tail > ringbuf->effective_size);
+ WARN_ON(ringbuf->tail > ringbuf->rsv_start + ringbuf->rsv_size);
+ WARN_ON(ringbuf->tail + nbytes > ringbuf->effective_size);
+ WARN_ON(ringbuf->tail + nbytes > ringbuf->rsv_start + ringbuf->rsv_size);
} else {
/*
* A new reservation; validate and record the start and
@@ -436,7 +445,7 @@ static inline void __intel_ringbuffer_begin(struct intel_ringbuffer *ringbuf,
static inline void __intel_ringbuffer_check(struct intel_ringbuffer *ringbuf)
{
- WARN_ON(ringbuf->rsv_level-- != 1);
+ WARN_ON(ringbuf->rsv_level-- <= 0);
WARN_ON(ringbuf->rsv_start < 0 || ringbuf->rsv_size < 0);
WARN_ON(ringbuf->tail & 7);
WARN_ON(ringbuf->tail > ringbuf->rsv_start + ringbuf->rsv_size);
--
1.7.9.5
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance}
2014-12-10 15:07 [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance} Dave Gordon
` (2 preceding siblings ...)
2014-12-10 16:12 ` [PATCH v2 0/2] Track " Dave Gordon
@ 2014-12-10 16:23 ` Chris Wilson
3 siblings, 0 replies; 10+ messages in thread
From: Chris Wilson @ 2014-12-10 16:23 UTC (permalink / raw)
To: Dave Gordon; +Cc: intel-gfx
On Wed, Dec 10, 2014 at 03:07:07PM +0000, Dave Gordon wrote:
> When adding instructions to a legacy or LRC ringbuffer, the sequence of
> emit() calls must be preceded by a call to intel(_logical)_ring_begin()
> to reserve the required amount of space, and followed by a matching call
> to intel(_logical)_ring_advance(). Historically some (display) code
> didn't use begin/advance, but just inserted instructions ad hoc, which
> would then be sent to the hardware along with the current or next batch,
> but this is not supported and is now regarded as incorrect.
>
> This commit therefore adds begin/advance tracking, with WARNings where
> various forms of misuse are detected.
Please review the suggested approach I made months ago which avoid all
this ad hoc hilarity.
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH 2/2] drm/i915: Track nested calls to intel(_logical)_ring_{begin, advance}
2014-12-10 15:07 ` [PATCH 2/2] drm/i915: Track nested " Dave Gordon
@ 2014-12-10 22:46 ` shuang.he
0 siblings, 0 replies; 10+ messages in thread
From: shuang.he @ 2014-12-10 22:46 UTC (permalink / raw)
To: shuang.he, intel-gfx, david.s.gordon
Tested-By: PRC QA PRTS (Patch Regression Test System Contact: shuang.he@intel.com)
-------------------------------------Summary-------------------------------------
Platform Delta drm-intel-nightly Series Applied
PNV -2 364/364 362/364
ILK -11 364/366 353/366
SNB -13 448/450 435/450
IVB -11 497/498 486/498
BYT -5 289/289 284/289
HSW -10 563/564 553/564
BDW -7 417/417 410/417
-------------------------------------Detailed-------------------------------------
Platform Test drm-intel-nightly Series Applied
*PNV igt_gem_ringfill_blitter PASS(3, M23M25) DMESG_WARN(1, M25)
*PNV igt_gem_ringfill_blitter-interruptible PASS(3, M23M25) DMESG_WARN(1, M25)
*ILK igt_gem_concurrent_blit_gpu-bcs-gpu-read-after-write-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_concurrent_blit_gpu-bcs-overwrite-source-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_concurrent_blit_gpuX-bcs-gpu-read-after-write-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_concurrent_blit_gpuX-bcs-overwrite-source-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_concurrent_blit_prw-bcs-gpu-read-after-write-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_kms_flip_nonexisting-fb DMESG_WARN(1, M26)PASS(4, M26) NSPT(1, M26)
*ILK igt_gem_concurrent_blit_gtt-bcs-gpu-read-after-write-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_concurrent_blit_gttX-bcs-gpu-read-after-write-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_ringfill_blitter PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_gem_ringfill_blitter-interruptible PASS(2, M26) DMESG_WARN(1, M26)
*ILK igt_kms_flip_bcs-flip-vs-modeset-interruptible PASS(5, M26) DMESG_WARN(1, M26)
*SNB igt_gem_concurrent_blit_cpu-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_gpu-rcs-gpu-read-after-write-forked PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_gpu-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_gpuX-rcs-gpu-read-after-write-forked PASS(2, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_gpuX-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_prw-rcs-gpu-read-after-write-forked PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_prw-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_ring_sync_copy_sync-render-blitter-read-write PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_ring_sync_copy_sync-render-blitter-write-read PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_ring_sync_copy_sync-render-blitter-write-write PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_userptr_blits_coherency-sync PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_pm_rps_min-max-config-loaded PASS(3, M35M22) DMESG_WARN(1, M22)
*SNB igt_gem_concurrent_blit_gtt-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M22)
*IVB igt_gem_linear_blits_interruptible PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_linear_blits_normal PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_render_linear_blits PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_render_tiled_blits PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_tiled_blits_interruptible PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_tiled_blits_normal PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_tiled_fence_blits PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_userptr_blits_coherency-sync PASS(2, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_userptr_blits_coherency-unsync PASS(2, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_ringfill_blitter PASS(3, M4M34) DMESG_WARN(1, M34)
*IVB igt_gem_ringfill_blitter-interruptible PASS(3, M4M34) DMESG_WARN(1, M34)
*BYT igt_gem_gtt_hog PASS(3, M48M51) DMESG_WARN(1, M51)
*BYT igt_gem_ringfill_blitter PASS(3, M48M51) DMESG_WARN(1, M51)
*BYT igt_gem_ringfill_blitter-interruptible PASS(3, M48M51) DMESG_WARN(1, M51)
*BYT igt_gem_ringfill_render PASS(3, M48M51) DMESG_WARN(1, M51)
*BYT igt_gem_ringfill_render-interruptible PASS(3, M48M51) DMESG_WARN(1, M51)
*HSW igt_gem_linear_blits_interruptible PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_linear_blits_normal PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_render_linear_blits PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_render_tiled_blits PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_tiled_blits_interruptible PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_tiled_blits_normal PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_tiled_fence_blits PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_pm_rps_min-max-config-loaded PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_ringfill_blitter PASS(3, M40M20) DMESG_WARN(1, M40)
*HSW igt_gem_ringfill_blitter-interruptible PASS(3, M40M20) DMESG_WARN(1, M40)
*BDW igt_gem_render_linear_blits TIMEOUT(1, M30)PASS(3, M30M28) DMESG_WARN(1, M28)
*BDW igt_gem_render_tiled_blits TIMEOUT(1, M30)PASS(3, M30M28) DMESG_WARN(1, M28)
*BDW igt_gem_gtt_hog PASS(3, M30M28) DMESG_WARN(1, M28)
*BDW igt_gem_ringfill_blitter PASS(3, M30M28) DMESG_WARN(1, M28)
*BDW igt_gem_ringfill_blitter-interruptible PASS(3, M30M28) DMESG_WARN(1, M28)
*BDW igt_gem_ringfill_render PASS(3, M30M28) DMESG_WARN(1, M28)
*BDW igt_gem_ringfill_render-interruptible PASS(3, M30M28) DMESG_WARN(1, M28)
Note: You need to pay more attention to line start with '*'
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v2 2/2] drm/i915: Track nested calls to intel(_logical)_ring_{begin, advance}
2014-12-10 16:12 ` [PATCH v2 2/2] drm/i915: Track nested " Dave Gordon
@ 2014-12-11 0:30 ` shuang.he
0 siblings, 0 replies; 10+ messages in thread
From: shuang.he @ 2014-12-11 0:30 UTC (permalink / raw)
To: shuang.he, intel-gfx, david.s.gordon
Tested-By: PRC QA PRTS (Patch Regression Test System Contact: shuang.he@intel.com)
-------------------------------------Summary-------------------------------------
Platform Delta drm-intel-nightly Series Applied
PNV -2 364/364 362/364
ILK +1-9 364/366 356/366
SNB -12 448/450 436/450
IVB -9 497/498 488/498
BYT -5 289/289 284/289
HSW -11 563/564 552/564
BDW -5 417/417 412/417
-------------------------------------Detailed-------------------------------------
Platform Test drm-intel-nightly Series Applied
*PNV igt_gem_ringfill_blitter PASS(3, M23M25) DMESG_WARN(1, M23)
*PNV igt_gem_ringfill_blitter-interruptible PASS(3, M23M25) DMESG_WARN(1, M23)
*ILK igt_gem_concurrent_blit_gpu-bcs-gpu-read-after-write-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_concurrent_blit_gpu-bcs-overwrite-source PASS(2, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_concurrent_blit_gpu-bcs-overwrite-source-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_concurrent_blit_gpuX-bcs-gpu-read-after-write-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_concurrent_blit_gpuX-bcs-overwrite-source-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_concurrent_blit_gtt-bcs-gpu-read-after-write-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_concurrent_blit_gttX-bcs-gpu-read-after-write-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_ringfill_blitter PASS(3, M26M37) DMESG_WARN(1, M37)
*ILK igt_gem_ringfill_blitter-interruptible PASS(3, M26M37) DMESG_WARN(1, M37)
ILK igt_kms_flip_wf_vblank-ts-check DMESG_WARN(3, M26)PASS(19, M26M37) PASS(1, M37)
*SNB igt_gem_concurrent_blit_cpu-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_concurrent_blit_gpu-rcs-gpu-read-after-write-forked PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_concurrent_blit_gpu-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_concurrent_blit_gpuX-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_concurrent_blit_prw-rcs-gpu-read-after-write-forked PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_concurrent_blit_prw-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_ring_sync_copy_sync-render-blitter-read-write PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_ring_sync_copy_sync-render-blitter-write-read PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_ring_sync_copy_sync-render-blitter-write-write PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_userptr_blits_coherency-sync PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_pm_rps_min-max-config-loaded PASS(3, M35M22) DMESG_WARN(1, M35)
*SNB igt_gem_concurrent_blit_gtt-rcs-gpu-read-after-write-interruptible PASS(3, M35M22) DMESG_WARN(1, M35)
*IVB igt_gem_linear_blits_interruptible PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_linear_blits_normal PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_render_linear_blits PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_render_tiled_blits PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_tiled_blits_interruptible PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_tiled_blits_normal PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_tiled_fence_blits PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_ringfill_blitter PASS(3, M4M34) DMESG_WARN(1, M4)
*IVB igt_gem_ringfill_blitter-interruptible PASS(3, M4M34) DMESG_WARN(1, M4)
*BYT igt_gem_gtt_hog PASS(3, M48M51) DMESG_WARN(1, M48)
*BYT igt_gem_ringfill_blitter PASS(3, M48M51) DMESG_WARN(1, M48)
*BYT igt_gem_ringfill_blitter-interruptible PASS(3, M48M51) DMESG_WARN(1, M48)
*BYT igt_gem_ringfill_render PASS(3, M48M51) DMESG_WARN(1, M48)
*BYT igt_gem_ringfill_render-interruptible PASS(3, M48M51) DMESG_WARN(1, M48)
*HSW igt_gem_linear_blits_interruptible PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_linear_blits_normal PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_render_linear_blits PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_render_tiled_blits PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_tiled_blits_interruptible PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_tiled_blits_normal PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_tiled_fence_blits PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_userptr_blits_coherency-unsync PASS(2, M40M20) DMESG_WARN(1, M20)
*HSW igt_pm_rps_min-max-config-loaded PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_ringfill_blitter PASS(3, M40M20) DMESG_WARN(1, M20)
*HSW igt_gem_ringfill_blitter-interruptible PASS(3, M40M20) DMESG_WARN(1, M20)
*BDW igt_gem_gtt_hog PASS(3, M30M28) DMESG_WARN(1, M30)
*BDW igt_gem_ringfill_blitter PASS(3, M30M28) DMESG_WARN(1, M30)
*BDW igt_gem_ringfill_blitter-interruptible PASS(3, M30M28) DMESG_WARN(1, M30)
*BDW igt_gem_ringfill_render PASS(3, M30M28) DMESG_WARN(1, M30)
*BDW igt_gem_ringfill_render-interruptible PASS(3, M30M28) DMESG_WARN(1, M30)
Note: You need to pay more attention to line start with '*'
_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2014-12-11 0:30 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-12-10 15:07 [PATCH 0/2] Track calls to intel(_logical)_ring_{begin, advance} Dave Gordon
2014-12-10 15:07 ` [PATCH 1/2] drm/i915: Track & check " Dave Gordon
2014-12-10 15:44 ` Daniel Vetter
2014-12-10 15:07 ` [PATCH 2/2] drm/i915: Track nested " Dave Gordon
2014-12-10 22:46 ` shuang.he
2014-12-10 16:12 ` [PATCH v2 0/2] Track " Dave Gordon
2014-12-10 16:12 ` [PATCH v2 1/2] drm/i915: Track & check " Dave Gordon
2014-12-10 16:12 ` [PATCH v2 2/2] drm/i915: Track nested " Dave Gordon
2014-12-11 0:30 ` shuang.he
2014-12-10 16:23 ` [PATCH 0/2] Track " Chris Wilson
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.