Re: [Intel-gfx] [PATCH 23/57] drm/i915: Move tasklet from execlists to sched
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
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) /*