[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