Commit c97fb526 authored by Chris Wilson's avatar Chris Wilson
Browse files

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



Before we BUG out with bad pending state, leave a telltale as to which
test failed.

Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Mika Kuoppala <mika.kuoppala@linux.intel.com>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Reviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191010071434.31195-2-chris@chris-wilson.co.uk
parent 9c4a14f8
Loading
Loading
Loading
Loading
+25 −5
Original line number Original line Diff line number Diff line
@@ -1089,27 +1089,47 @@ assert_pending_valid(const struct intel_engine_execlists *execlists,


	trace_ports(execlists, msg, execlists->pending);
	trace_ports(execlists, msg, execlists->pending);


	if (!execlists->pending[0])
	if (!execlists->pending[0]) {
		GEM_TRACE_ERR("Nothing pending for promotion!\n");
		return false;
		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;
		return false;
	}


	for (port = execlists->pending; (rq = *port); port++) {
	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;
			return false;
		}


		ce = rq->hw_context;
		ce = rq->hw_context;
		if (i915_request_completed(rq))
		if (i915_request_completed(rq))
			continue;
			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;
			return false;
		}


		if (!i915_vma_is_pinned(ce->state))
		if (!i915_vma_is_pinned(ce->state)) {
			GEM_TRACE_ERR("Unpinned context in pending[%zd]\n",
				      port - execlists->pending);
			return false;
			return false;
		}
		}


		if (!i915_vma_is_pinned(ce->ring->vma)) {
			GEM_TRACE_ERR("Unpinned ringbuffer in pending[%zd]\n",
				      port - execlists->pending);
			return false;
		}
	}

	return ce;
	return ce;
}
}


+7 −4
Original line number Original line Diff line number Diff line
@@ -37,9 +37,7 @@ struct drm_i915_private;
#define GEM_SHOW_DEBUG() (drm_debug & DRM_UT_DRIVER)
#define GEM_SHOW_DEBUG() (drm_debug & DRM_UT_DRIVER)


#define GEM_BUG_ON(condition) do { if (unlikely((condition))) {	\
#define GEM_BUG_ON(condition) do { if (unlikely((condition))) {	\
		pr_err("%s:%d GEM_BUG_ON(%s)\n", \
		GEM_TRACE_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)); \
			      __func__, __LINE__, __stringify(condition)); \
		BUG(); \
		BUG(); \
		} \
		} \
@@ -66,11 +64,16 @@ struct drm_i915_private;


#if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
#if IS_ENABLED(CONFIG_DRM_I915_TRACE_GEM)
#define GEM_TRACE(...) trace_printk(__VA_ARGS__)
#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() ftrace_dump(DUMP_ALL)
#define GEM_TRACE_DUMP_ON(expr) \
#define GEM_TRACE_DUMP_ON(expr) \
	do { if (expr) ftrace_dump(DUMP_ALL); } while (0)
	do { if (expr) ftrace_dump(DUMP_ALL); } while (0)
#else
#else
#define GEM_TRACE(...) do { } while (0)
#define GEM_TRACE(...) do { } while (0)
#define GEM_TRACE_ERR(...) do { } while (0)
#define GEM_TRACE_DUMP() do { } while (0)
#define GEM_TRACE_DUMP() do { } while (0)
#define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr)
#define GEM_TRACE_DUMP_ON(expr) BUILD_BUG_ON_INVALID(expr)
#endif
#endif