[PATCH 32/35] flush-barrier

Chris Wilson chris at chris-wilson.co.uk
Mon Aug 26 12:01:27 UTC 2019


---
 drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c | 14 ++++++++++++++
 drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h |  1 +
 drivers/gpu/drm/i915/i915_active.c               | 14 ++++++++++++--
 3 files changed, 27 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
index d0fc94c71ee7..5af7e17e5c1a 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.c
@@ -163,3 +163,17 @@ int intel_engine_pulse(struct intel_engine_cs *engine)
 	intel_engine_pm_put(engine);
 	return err;
 }
+
+int intel_engine_flush_barriers(struct intel_engine_cs *engine)
+{
+	struct i915_request *rq;
+
+	rq = i915_request_create(engine->kernel_context);
+	if (IS_ERR(rq))
+		return PTR_ERR(rq);
+
+	idle_pulse(engine, rq);
+	i915_request_add(rq);
+
+	return 0;
+}
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h
index 39391004554d..0c1ad0fc091d 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_heartbeat.h
@@ -15,5 +15,6 @@ void intel_engine_park_heartbeat(struct intel_engine_cs *engine);
 void intel_engine_unpark_heartbeat(struct intel_engine_cs *engine);
 
 int intel_engine_pulse(struct intel_engine_cs *engine);
+int intel_engine_flush_barriers(struct intel_engine_cs *engine);
 
 #endif /* INTEL_ENGINE_HEARTBEAT_H */
diff --git a/drivers/gpu/drm/i915/i915_active.c b/drivers/gpu/drm/i915/i915_active.c
index aa644cc941d3..d705f0c1d68c 100644
--- a/drivers/gpu/drm/i915/i915_active.c
+++ b/drivers/gpu/drm/i915/i915_active.c
@@ -6,6 +6,7 @@
 
 #include <linux/debugobjects.h>
 
+#include "gt/intel_engine_heartbeat.h"
 #include "gt/intel_engine_pm.h"
 
 #include "i915_drv.h"
@@ -451,8 +452,17 @@ int i915_active_wait(struct i915_active *ref)
 	rbtree_postorder_for_each_entry_safe(it, n, &ref->tree, node) {
 		struct dma_fence *fence;
 
-		if (is_barrier(&it->base)) /* unconnected idle barrier */
-			continue;
+		if (is_barrier(&it->base)) { /* unconnected idle barrier */
+			struct intel_engine_cs *engine =
+				__barrier_to_engine(it);
+
+			smp_rmb(); /* serialise with add_active_barriers */
+			if (is_barrier(&it->base)) {
+				err = intel_engine_flush_barriers(engine);
+				if (err)
+					return err;
+			}
+		}
 
 		fence = i915_active_fence_get(&it->base);
 		if (fence) {
-- 
2.23.0



More information about the Intel-gfx-trybot mailing list