[PATCH 2/3] breadcrumbs-irq

Chris Wilson chris at chris-wilson.co.uk
Thu Sep 26 20:18:13 UTC 2019


---
 drivers/gpu/drm/i915/gt/intel_breadcrumbs.c  | 10 ----------
 drivers/gpu/drm/i915/gt/intel_engine.h       | 14 +++++++++++---
 drivers/gpu/drm/i915/gt/intel_engine_types.h |  4 +---
 drivers/gpu/drm/i915/gt/intel_lrc.c          |  2 ++
 drivers/gpu/drm/i915/gt/intel_reset.c        |  2 +-
 drivers/gpu/drm/i915/gt/intel_ringbuffer.c   |  2 +-
 drivers/gpu/drm/i915/gt/mock_engine.c        |  2 +-
 7 files changed, 17 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
index 55317081d48b..72447631ace5 100644
--- a/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
+++ b/drivers/gpu/drm/i915/gt/intel_breadcrumbs.c
@@ -199,14 +199,6 @@ void intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine)
 	}
 }
 
-static void signal_irq_work(struct irq_work *work)
-{
-	struct intel_engine_cs *engine =
-		container_of(work, typeof(*engine), breadcrumbs.irq_work);
-
-	intel_engine_breadcrumbs_irq(engine);
-}
-
 static void __intel_breadcrumbs_arm_irq(struct intel_breadcrumbs *b)
 {
 	struct intel_engine_cs *engine =
@@ -242,8 +234,6 @@ void intel_engine_init_breadcrumbs(struct intel_engine_cs *engine)
 
 	spin_lock_init(&b->irq_lock);
 	INIT_LIST_HEAD(&b->signalers);
-
-	init_irq_work(&b->irq_work, signal_irq_work);
 }
 
 void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine)
diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h b/drivers/gpu/drm/i915/gt/intel_engine.h
index c9e8c8ccbd47..d56e8a70e66a 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine.h
@@ -5,7 +5,6 @@
 #include <drm/drm_util.h>
 
 #include <linux/hashtable.h>
-#include <linux/irq_work.h>
 #include <linux/random.h>
 #include <linux/seqlock.h>
 
@@ -337,13 +336,22 @@ void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
 
 void intel_engine_disarm_breadcrumbs(struct intel_engine_cs *engine);
 
+void intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine);
+
 static inline void
 intel_engine_queue_breadcrumbs(struct intel_engine_cs *engine)
 {
-	irq_work_queue(&engine->breadcrumbs.irq_work);
+	set_bit(0, &engine->breadcrumbs.irq_signal);
 }
 
-void intel_engine_breadcrumbs_irq(struct intel_engine_cs *engine);
+static inline void
+intel_engine_signal_breadcrumbs(struct intel_engine_cs *engine)
+{
+	if (unlikely(test_bit(0, &engine->breadcrumbs.irq_signal))) {
+		clear_bit(0, &engine->breadcrumbs.irq_signal);
+		intel_engine_breadcrumbs_irq(engine);
+	}
+}
 
 void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine);
 void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h b/drivers/gpu/drm/i915/gt/intel_engine_types.h
index 943f0663837e..73e1222e89af 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h
@@ -8,7 +8,6 @@
 #define __INTEL_ENGINE_TYPES__
 
 #include <linux/hashtable.h>
-#include <linux/irq_work.h>
 #include <linux/kref.h>
 #include <linux/list.h>
 #include <linux/llist.h>
@@ -355,8 +354,7 @@ struct intel_engine_cs {
 		spinlock_t irq_lock;
 		struct list_head signalers;
 
-		struct irq_work irq_work; /* for use from inside irq_lock */
-
+		unsigned long irq_signal;
 		unsigned int irq_enabled;
 
 		bool irq_armed;
diff --git a/drivers/gpu/drm/i915/gt/intel_lrc.c b/drivers/gpu/drm/i915/gt/intel_lrc.c
index fa385218ce92..45fe87a59796 100644
--- a/drivers/gpu/drm/i915/gt/intel_lrc.c
+++ b/drivers/gpu/drm/i915/gt/intel_lrc.c
@@ -1974,6 +1974,7 @@ static void execlists_submission_tasklet(unsigned long data)
 		spin_lock_irqsave(&engine->active.lock, flags);
 		__execlists_submission_tasklet(engine);
 		spin_unlock_irqrestore(&engine->active.lock, flags);
+		intel_engine_signal_breadcrumbs(engine);
 	}
 }
 
@@ -2035,6 +2036,7 @@ static void execlists_submit_request(struct i915_request *request)
 	submit_queue(engine, request);
 
 	spin_unlock_irqrestore(&engine->active.lock, flags);
+	intel_engine_signal_breadcrumbs(engine);
 }
 
 static void __execlists_context_fini(struct intel_context *ce)
diff --git a/drivers/gpu/drm/i915/gt/intel_reset.c b/drivers/gpu/drm/i915/gt/intel_reset.c
index d08226f5bea5..801e331af068 100644
--- a/drivers/gpu/drm/i915/gt/intel_reset.c
+++ b/drivers/gpu/drm/i915/gt/intel_reset.c
@@ -740,7 +740,7 @@ static void nop_submit_request(struct i915_request *request)
 	i915_request_mark_complete(request);
 	spin_unlock_irqrestore(&engine->active.lock, flags);
 
-	intel_engine_queue_breadcrumbs(engine);
+	intel_engine_breadcrumbs_irq(engine);
 }
 
 static void __intel_gt_set_wedged(struct intel_gt *gt)
diff --git a/drivers/gpu/drm/i915/gt/intel_ringbuffer.c b/drivers/gpu/drm/i915/gt/intel_ringbuffer.c
index 0747b8c9f768..09bcdb28ce01 100644
--- a/drivers/gpu/drm/i915/gt/intel_ringbuffer.c
+++ b/drivers/gpu/drm/i915/gt/intel_ringbuffer.c
@@ -730,7 +730,7 @@ static int xcs_resume(struct intel_engine_cs *engine)
 	}
 
 	/* Papering over lost _interrupts_ immediately following the restart */
-	intel_engine_queue_breadcrumbs(engine);
+	intel_engine_breadcrumbs_irq(engine);
 out:
 	intel_uncore_forcewake_put(engine->uncore, FORCEWAKE_ALL);
 
diff --git a/drivers/gpu/drm/i915/gt/mock_engine.c b/drivers/gpu/drm/i915/gt/mock_engine.c
index 5d43cbc3f345..922849b98a1c 100644
--- a/drivers/gpu/drm/i915/gt/mock_engine.c
+++ b/drivers/gpu/drm/i915/gt/mock_engine.c
@@ -76,7 +76,7 @@ static void advance(struct i915_request *request)
 	i915_request_mark_complete(request);
 	GEM_BUG_ON(!i915_request_completed(request));
 
-	intel_engine_queue_breadcrumbs(request->engine);
+	intel_engine_breadcrumbs_irq(request->engine);
 }
 
 static void hw_delay_complete(struct timer_list *t)
-- 
2.23.0



More information about the Intel-gfx-trybot mailing list