diff mbox series

[02/10] drm/i915/execlists: Leave tell-tales as to why pending[] is bad

Message ID 20191010071434.31195-2-chris@chris-wilson.co.uk (mailing list archive)
State New, archived
Headers show
Series [01/10] drm/i915: Note the addition of timeslicing to the pretend scheduler | expand

Commit Message

Chris Wilson Oct. 10, 2019, 7:14 a.m. UTC
Before we BUG out with bad pending state, leave a telltale as to which
test failed.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
---
 drivers/gpu/drm/i915/gt/intel_lrc.c | 30 ++++++++++++++++++++++++-----
 drivers/gpu/drm/i915/i915_gem.h     |  8 ++++----
 2 files changed, 29 insertions(+), 9 deletions(-)

Comments

Tvrtko Ursulin Oct. 11, 2019, 8:39 a.m. UTC | #1
On 10/10/2019 08:14, Chris Wilson wrote:
> Before we BUG out with bad pending state, leave a telltale as to which
> test failed.
> 
> Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
> Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> ---
>   drivers/gpu/drm/i915/gt/intel_lrc.c | 30 ++++++++++++++++++++++++-----
>   drivers/gpu/drm/i915/i915_gem.h     |  8 ++++----
>   2 files changed, 29 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
> index a0777b3ad68a..5040fbdd81af 100644
> --- a/drivers/gpu/drm/i915/gt/intel_lrc.c
> +++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
> @@ -1138,25 +1138,45 @@ assert_pending_valid(const struct intel_engine_execlists *execlists,
>   
>   	trace_ports(execlists, msg, execlists->pending);
>   
> -	if (!execlists->pending[0])
> +	if (!execlists->pending[0]) {
> +		GEM_TRACE_ERR("Nothing pending for promotion!\n");
>   		return false;
> +	}
>   
> -	if (execlists->pending[execlists_num_ports(execlists)])
> +	if (execlists->pending[execlists_num_ports(execlists)]) {
> +		GEM_TRACE_ERR("Excess pending[%d] for promotion!\n",
> +			      execlists_num_ports(execlists));
>   		return false;
> +	}
>   
>   	for (port = execlists->pending; (rq = *port); port++) {
> -		if (ce == rq->hw_context)
> +		if (ce == rq->hw_context) {
> +			GEM_TRACE_ERR("Duplicate context in pending[%zd]\n",
> +				      port - execlists->pending);
>   			return false;
> +		}
>   
>   		ce = rq->hw_context;
>   		if (i915_request_completed(rq))
>   			continue;
>   
> -		if (i915_active_is_idle(&ce->active))
> +		if (i915_active_is_idle(&ce->active)) {
> +			GEM_TRACE_ERR("Inactive context in pending[%zd]\n",
> +				      port - execlists->pending);
> +			return false;
> +		}
> +
> +		if (!i915_vma_is_pinned(ce->state)) {
> +			GEM_TRACE_ERR("Unpinned context in pending[%zd]\n",
> +				      port - execlists->pending);
>   			return false;
> +		}
>   
> -		if (!i915_vma_is_pinned(ce->state))
> +		if (!i915_vma_is_pinned(ce->ring->vma)) {
> +			GEM_TRACE_ERR("Unpinned ringbuffer in pending[%zd]\n",
> +				      port - execlists->pending);
>   			return false;
> +		}
>   	}
>   
>   	return ce;
> diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h
> index 6795f1daa3d5..63dab3765106 100644
> --- a/drivers/gpu/drm/i915/i915_gem.h
> +++ b/drivers/gpu/drm/i915/i915_gem.h
> @@ -37,10 +37,8 @@ struct drm_i915_private;
>   #define GEM_SHOW_DEBUG() (drm_debug & DRM_UT_DRIVER)
>   
>   #define GEM_BUG_ON(condition) do { if (unlikely((condition))) {	\
> -		pr_err("%s:%d GEM_BUG_ON(%s)\n", \
> -		       __func__, __LINE__, __stringify(condition)); \
> -		GEM_TRACE("%s:%d GEM_BUG_ON(%s)\n", \
> -			  __func__, __LINE__, __stringify(condition)); \
> +		GEM_TRACE_ERR("%s:%d GEM_BUG_ON(%s)\n", \
> +			      __func__, __LINE__, __stringify(condition)); \
>   		BUG(); \
>   		} \
>   	} while(0)
> @@ -66,11 +64,13 @@ struct drm_i915_private;
>   
>   #if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
>   #define GEM_TRACE(...) trace_printk(__VA_ARGS__)
> +#define GEM_TRACE_ERR(...) do { pr_err(__VA_ARGS__); trace_printk(__VA_ARGS__); } while (0)
>   #define GEM_TRACE_DUMP() ftrace_dump(DUMP_ALL)
>   #define GEM_TRACE_DUMP_ON(expr) \
>   	do { if (expr) ftrace_dump(DUMP_ALL); } while (0)
>   #else
>   #define GEM_TRACE(...) do { } while (0)
> +#define GEM_TRACE_ERR(...) do { } while (0)
>   #define GEM_TRACE_DUMP() do { } while (0)
>   #define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr)
>   #endif
> 

Reviewed-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Regards,

Tvrtko
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index a0777b3ad68a..5040fbdd81af 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -1138,25 +1138,45 @@  assert_pending_valid(const struct intel_engine_execlists *execlists,
 
 	trace_ports(execlists, msg, execlists->pending);
 
-	if (!execlists->pending[0])
+	if (!execlists->pending[0]) {
+		GEM_TRACE_ERR("Nothing pending for promotion!\n");
 		return false;
+	}
 
-	if (execlists->pending[execlists_num_ports(execlists)])
+	if (execlists->pending[execlists_num_ports(execlists)]) {
+		GEM_TRACE_ERR("Excess pending[%d] for promotion!\n",
+			      execlists_num_ports(execlists));
 		return false;
+	}
 
 	for (port = execlists->pending; (rq = *port); port++) {
-		if (ce == rq->hw_context)
+		if (ce == rq->hw_context) {
+			GEM_TRACE_ERR("Duplicate context in pending[%zd]\n",
+				      port - execlists->pending);
 			return false;
+		}
 
 		ce = rq->hw_context;
 		if (i915_request_completed(rq))
 			continue;
 
-		if (i915_active_is_idle(&ce->active))
+		if (i915_active_is_idle(&ce->active)) {
+			GEM_TRACE_ERR("Inactive context in pending[%zd]\n",
+				      port - execlists->pending);
+			return false;
+		}
+
+		if (!i915_vma_is_pinned(ce->state)) {
+			GEM_TRACE_ERR("Unpinned context in pending[%zd]\n",
+				      port - execlists->pending);
 			return false;
+		}
 
-		if (!i915_vma_is_pinned(ce->state))
+		if (!i915_vma_is_pinned(ce->ring->vma)) {
+			GEM_TRACE_ERR("Unpinned ringbuffer in pending[%zd]\n",
+				      port - execlists->pending);
 			return false;
+		}
 	}
 
 	return ce;
diff --git a/drivers/gpu/drm/i915/i915_gem.h b/drivers/gpu/drm/i915/i915_gem.h
index 6795f1daa3d5..63dab3765106 100644
--- a/drivers/gpu/drm/i915/i915_gem.h
+++ b/drivers/gpu/drm/i915/i915_gem.h
@@ -37,10 +37,8 @@  struct drm_i915_private;
 #define GEM_SHOW_DEBUG() (drm_debug & DRM_UT_DRIVER)
 
 #define GEM_BUG_ON(condition) do { if (unlikely((condition))) {	\
-		pr_err("%s:%d GEM_BUG_ON(%s)\n", \
-		       __func__, __LINE__, __stringify(condition)); \
-		GEM_TRACE("%s:%d GEM_BUG_ON(%s)\n", \
-			  __func__, __LINE__, __stringify(condition)); \
+		GEM_TRACE_ERR("%s:%d GEM_BUG_ON(%s)\n", \
+			      __func__, __LINE__, __stringify(condition)); \
 		BUG(); \
 		} \
 	} while(0)
@@ -66,11 +64,13 @@  struct drm_i915_private;
 
 #if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
 #define GEM_TRACE(...) trace_printk(__VA_ARGS__)
+#define GEM_TRACE_ERR(...) do { pr_err(__VA_ARGS__); trace_printk(__VA_ARGS__); } while (0)
 #define GEM_TRACE_DUMP() ftrace_dump(DUMP_ALL)
 #define GEM_TRACE_DUMP_ON(expr) \
 	do { if (expr) ftrace_dump(DUMP_ALL); } while (0)
 #else
 #define GEM_TRACE(...) do { } while (0)
+#define GEM_TRACE_ERR(...) do { } while (0)
 #define GEM_TRACE_DUMP() do { } while (0)
 #define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr)
 #endif