Re: [Intel-gfx] [PATCH 23/57] drm/i915: Move tasklet from execlists to sched

2021-02-04 Thread Tvrtko Ursulin



On 01/02/2021 08:56, Chris Wilson wrote:

Move the scheduling tasklists out of the execlists backend into the
per-engine scheduling bookkeeping.

Signed-off-by: Chris Wilson 
---
  drivers/gpu/drm/i915/gt/intel_engine.h| 33 +++-
  drivers/gpu/drm/i915/gt/intel_engine_cs.c | 33 ++--
  .../gpu/drm/i915/gt/intel_engine_heartbeat.c  |  2 +-
  drivers/gpu/drm/i915/gt/intel_engine_pm.c |  2 +-
  drivers/gpu/drm/i915/gt/intel_engine_types.h  |  5 --
  .../drm/i915/gt/intel_execlists_submission.c  | 82 +++
  drivers/gpu/drm/i915/gt/intel_gt_irq.c|  2 +-
  drivers/gpu/drm/i915/gt/intel_gt_requests.c   |  2 +-
  drivers/gpu/drm/i915/gt/selftest_engine_pm.c  |  2 +-
  drivers/gpu/drm/i915/gt/selftest_execlists.c  | 49 +--
  drivers/gpu/drm/i915/gt/selftest_hangcheck.c  |  3 +-
  drivers/gpu/drm/i915/gt/selftest_lrc.c| 13 +--
  drivers/gpu/drm/i915/gt/selftest_reset.c  |  3 +-
  .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 23 ++
  drivers/gpu/drm/i915/i915_request.c   |  2 +-
  drivers/gpu/drm/i915/i915_scheduler.c | 45 +-
  drivers/gpu/drm/i915/i915_scheduler.h | 34 
  drivers/gpu/drm/i915/i915_scheduler_types.h   |  9 ++
  drivers/gpu/drm/i915/selftests/i915_request.c | 10 +--
  .../gpu/drm/i915/selftests/i915_scheduler.c   | 24 +++---
  drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
  21 files changed, 200 insertions(+), 180 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h 
b/drivers/gpu/drm/i915/gt/intel_engine.h
index cc2df80eb449..52bba16c62e8 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine.h
@@ -12,6 +12,7 @@
  #include "i915_pmu.h"
  #include "i915_reg.h"
  #include "i915_request.h"
+#include "i915_scheduler.h"
  #include "i915_selftest.h"
  #include "intel_engine_types.h"
  #include "intel_gt_types.h"
@@ -123,20 +124,6 @@ execlists_active(const struct intel_engine_execlists 
*execlists)
return active;
  }
  
-static inline void

-execlists_active_lock_bh(struct intel_engine_execlists *execlists)
-{
-   local_bh_disable(); /* prevent local softirq and lock recursion */
-   tasklet_lock(>tasklet);
-}
-
-static inline void
-execlists_active_unlock_bh(struct intel_engine_execlists *execlists)
-{
-   tasklet_unlock(>tasklet);
-   local_bh_enable(); /* restore softirq, and kick ksoftirqd! */
-}
-
  static inline u32
  intel_read_status_page(const struct intel_engine_cs *engine, int reg)
  {
@@ -231,12 +218,6 @@ static inline void __intel_engine_reset(struct 
intel_engine_cs *engine,
  bool intel_engines_are_idle(struct intel_gt *gt);
  bool intel_engine_is_idle(struct intel_engine_cs *engine);
  
-void __intel_engine_flush_submission(struct intel_engine_cs *engine, bool sync);

-static inline void intel_engine_flush_submission(struct intel_engine_cs 
*engine)
-{
-   __intel_engine_flush_submission(engine, true);
-}
-
  void intel_engines_reset_default_submission(struct intel_gt *gt);
  
  bool intel_engine_can_store_dword(struct intel_engine_cs *engine);

@@ -283,4 +264,16 @@ intel_engine_has_heartbeat(const struct intel_engine_cs 
*engine)
return READ_ONCE(engine->props.heartbeat_interval_ms);
  }
  
+static inline void

+intel_engine_kick_scheduler(struct intel_engine_cs *engine)
+{
+   i915_sched_kick(intel_engine_get_scheduler(engine));
+}
+
+static inline void
+intel_engine_flush_scheduler(struct intel_engine_cs *engine)
+{
+   i915_sched_flush(intel_engine_get_scheduler(engine));
+}
+
  #endif /* _INTEL_RINGBUFFER_H_ */
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c 
b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 4c07c6f61924..b5b957283f2c 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -911,7 +911,6 @@ int intel_engines_init(struct intel_gt *gt)
  void intel_engine_cleanup_common(struct intel_engine_cs *engine)
  {
i915_sched_fini(intel_engine_get_scheduler(engine));
-   tasklet_kill(>execlists.tasklet); /* flush the callback */
  
  	intel_breadcrumbs_free(engine->breadcrumbs);
  
@@ -1194,27 +1193,6 @@ static bool ring_is_idle(struct intel_engine_cs *engine)

return idle;
  }
  
-void __intel_engine_flush_submission(struct intel_engine_cs *engine, bool sync)

-{
-   struct tasklet_struct *t = >execlists.tasklet;
-
-   if (!t->callback)
-   return;
-
-   local_bh_disable();
-   if (tasklet_trylock(t)) {
-   /* Must wait for any GPU reset in progress. */
-   if (__tasklet_is_enabled(t))
-   t->callback(t);
-   tasklet_unlock(t);
-   }
-   local_bh_enable();
-
-   /* Synchronise and wait for the tasklet on another CPU */
-   if (sync)
-   tasklet_unlock_wait(t);
-}
-
  /**
   * intel_engine_is_idle() - Report if the engine has finished process all work
   * @engine: the 

[Intel-gfx] [PATCH 23/57] drm/i915: Move tasklet from execlists to sched

2021-02-01 Thread Chris Wilson
Move the scheduling tasklists out of the execlists backend into the
per-engine scheduling bookkeeping.

Signed-off-by: Chris Wilson 
---
 drivers/gpu/drm/i915/gt/intel_engine.h| 33 +++-
 drivers/gpu/drm/i915/gt/intel_engine_cs.c | 33 ++--
 .../gpu/drm/i915/gt/intel_engine_heartbeat.c  |  2 +-
 drivers/gpu/drm/i915/gt/intel_engine_pm.c |  2 +-
 drivers/gpu/drm/i915/gt/intel_engine_types.h  |  5 --
 .../drm/i915/gt/intel_execlists_submission.c  | 82 +++
 drivers/gpu/drm/i915/gt/intel_gt_irq.c|  2 +-
 drivers/gpu/drm/i915/gt/intel_gt_requests.c   |  2 +-
 drivers/gpu/drm/i915/gt/selftest_engine_pm.c  |  2 +-
 drivers/gpu/drm/i915/gt/selftest_execlists.c  | 49 +--
 drivers/gpu/drm/i915/gt/selftest_hangcheck.c  |  3 +-
 drivers/gpu/drm/i915/gt/selftest_lrc.c| 13 +--
 drivers/gpu/drm/i915/gt/selftest_reset.c  |  3 +-
 .../gpu/drm/i915/gt/uc/intel_guc_submission.c | 23 ++
 drivers/gpu/drm/i915/i915_request.c   |  2 +-
 drivers/gpu/drm/i915/i915_scheduler.c | 45 +-
 drivers/gpu/drm/i915/i915_scheduler.h | 34 
 drivers/gpu/drm/i915/i915_scheduler_types.h   |  9 ++
 drivers/gpu/drm/i915/selftests/i915_request.c | 10 +--
 .../gpu/drm/i915/selftests/i915_scheduler.c   | 24 +++---
 drivers/gpu/drm/i915/selftests/igt_spinner.c  |  2 +-
 21 files changed, 200 insertions(+), 180 deletions(-)

diff --git a/drivers/gpu/drm/i915/gt/intel_engine.h 
b/drivers/gpu/drm/i915/gt/intel_engine.h
index cc2df80eb449..52bba16c62e8 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine.h
@@ -12,6 +12,7 @@
 #include "i915_pmu.h"
 #include "i915_reg.h"
 #include "i915_request.h"
+#include "i915_scheduler.h"
 #include "i915_selftest.h"
 #include "intel_engine_types.h"
 #include "intel_gt_types.h"
@@ -123,20 +124,6 @@ execlists_active(const struct intel_engine_execlists 
*execlists)
return active;
 }
 
-static inline void
-execlists_active_lock_bh(struct intel_engine_execlists *execlists)
-{
-   local_bh_disable(); /* prevent local softirq and lock recursion */
-   tasklet_lock(>tasklet);
-}
-
-static inline void
-execlists_active_unlock_bh(struct intel_engine_execlists *execlists)
-{
-   tasklet_unlock(>tasklet);
-   local_bh_enable(); /* restore softirq, and kick ksoftirqd! */
-}
-
 static inline u32
 intel_read_status_page(const struct intel_engine_cs *engine, int reg)
 {
@@ -231,12 +218,6 @@ static inline void __intel_engine_reset(struct 
intel_engine_cs *engine,
 bool intel_engines_are_idle(struct intel_gt *gt);
 bool intel_engine_is_idle(struct intel_engine_cs *engine);
 
-void __intel_engine_flush_submission(struct intel_engine_cs *engine, bool 
sync);
-static inline void intel_engine_flush_submission(struct intel_engine_cs 
*engine)
-{
-   __intel_engine_flush_submission(engine, true);
-}
-
 void intel_engines_reset_default_submission(struct intel_gt *gt);
 
 bool intel_engine_can_store_dword(struct intel_engine_cs *engine);
@@ -283,4 +264,16 @@ intel_engine_has_heartbeat(const struct intel_engine_cs 
*engine)
return READ_ONCE(engine->props.heartbeat_interval_ms);
 }
 
+static inline void
+intel_engine_kick_scheduler(struct intel_engine_cs *engine)
+{
+   i915_sched_kick(intel_engine_get_scheduler(engine));
+}
+
+static inline void
+intel_engine_flush_scheduler(struct intel_engine_cs *engine)
+{
+   i915_sched_flush(intel_engine_get_scheduler(engine));
+}
+
 #endif /* _INTEL_RINGBUFFER_H_ */
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c 
b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index 4c07c6f61924..b5b957283f2c 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -911,7 +911,6 @@ int intel_engines_init(struct intel_gt *gt)
 void intel_engine_cleanup_common(struct intel_engine_cs *engine)
 {
i915_sched_fini(intel_engine_get_scheduler(engine));
-   tasklet_kill(>execlists.tasklet); /* flush the callback */
 
intel_breadcrumbs_free(engine->breadcrumbs);
 
@@ -1194,27 +1193,6 @@ static bool ring_is_idle(struct intel_engine_cs *engine)
return idle;
 }
 
-void __intel_engine_flush_submission(struct intel_engine_cs *engine, bool sync)
-{
-   struct tasklet_struct *t = >execlists.tasklet;
-
-   if (!t->callback)
-   return;
-
-   local_bh_disable();
-   if (tasklet_trylock(t)) {
-   /* Must wait for any GPU reset in progress. */
-   if (__tasklet_is_enabled(t))
-   t->callback(t);
-   tasklet_unlock(t);
-   }
-   local_bh_enable();
-
-   /* Synchronise and wait for the tasklet on another CPU */
-   if (sync)
-   tasklet_unlock_wait(t);
-}
-
 /**
  * intel_engine_is_idle() - Report if the engine has finished process all work
  * @engine: the intel_engine_cs
@@ -1235,7 +1213,7 @@ bool intel_engine_is_idle(struct intel_engine_cs *engine)
 
/*