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 Diff line number Diff line
@@ -1089,27 +1089,47 @@ 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))
		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->ring->vma)) {
			GEM_TRACE_ERR("Unpinned ringbuffer in pending[%zd]\n",
				      port - execlists->pending);
			return false;
		}
	}

	return ce;
}

+7 −4
Original line number Diff line number Diff line
@@ -37,9 +37,7 @@ 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", \
		GEM_TRACE_ERR("%s:%d GEM_BUG_ON(%s)\n", \
			      __func__, __LINE__, __stringify(condition)); \
		BUG(); \
		} \
@@ -66,11 +64,16 @@ 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