[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