Re: [Intel-gfx] [PATCH 21/57] drm/i915: Move common active lists from engine to i915_scheduler

2021-02-04 Thread Tvrtko Ursulin



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

Extract the scheduler lists into a related structure, stop sprawling
over struct intel_engine_cs. Also transfer the responsibility of tracing
the scheduler events from ENGINE_TRACE() to SCHED_TRACE().

Signed-off-by: Chris Wilson 
---
  drivers/gpu/drm/i915/gem/i915_gem_context.c   |  8 +-
  drivers/gpu/drm/i915/gt/intel_engine_cs.c | 33 ++--
  drivers/gpu/drm/i915/gt/intel_engine_types.h  | 10 +--
  .../drm/i915/gt/intel_execlists_submission.c  | 27 ---
  drivers/gpu/drm/i915/gt/mock_engine.c |  7 +-
  drivers/gpu/drm/i915/i915_request.c   |  8 +-
  drivers/gpu/drm/i915/i915_request.h   |  8 +-
  drivers/gpu/drm/i915/i915_scheduler.c | 78 ++-
  drivers/gpu/drm/i915/i915_scheduler.h | 13 +++-
  drivers/gpu/drm/i915/i915_scheduler_types.h   | 31 +++-
  .../gpu/drm/i915/selftests/i915_scheduler.c   |  1 +
  11 files changed, 143 insertions(+), 81 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index ecacfae8412d..ca37d93ef5e7 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -422,11 +422,11 @@ __active_engine(struct i915_request *rq, struct 
intel_engine_cs **active)
 * check that we have acquired the lock on the final engine.
 */
locked = READ_ONCE(rq->engine);
-   spin_lock_irq(>active.lock);
+   spin_lock_irq(>sched.lock);
while (unlikely(locked != (engine = READ_ONCE(rq->engine {
-   spin_unlock(>active.lock);
+   spin_unlock(>sched.lock);
locked = engine;
-   spin_lock(>active.lock);
+   spin_lock(>sched.lock);
}
  
  	if (i915_request_is_active(rq)) {

@@ -435,7 +435,7 @@ __active_engine(struct i915_request *rq, struct 
intel_engine_cs **active)
ret = true;
}
  
-	spin_unlock_irq(>active.lock);

+   spin_unlock_irq(>sched.lock);
  
  	return ret;

  }
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c 
b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index a2916c7fcc48..d7ff84d92936 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -575,8 +575,6 @@ void intel_engine_init_execlists(struct intel_engine_cs 
*engine)
  
  	execlists->queue_priority_hint = INT_MIN;

execlists->queue = RB_ROOT_CACHED;
-
-   i915_sched_init_ipi(>ipi);
  }
  
  static void cleanup_status_page(struct intel_engine_cs *engine)

@@ -692,7 +690,12 @@ static int engine_setup_common(struct intel_engine_cs 
*engine)
goto err_status;
}
  
-	intel_engine_init_active(engine, ENGINE_PHYSICAL);

+   i915_sched_init(>sched,
+   engine->i915->drm.dev,
+   engine->name,
+   engine->mask,
+   ENGINE_PHYSICAL);
+
intel_engine_init_execlists(engine);
intel_engine_init_cmd_parser(engine);
intel_engine_init__pm(engine);
@@ -761,28 +764,6 @@ static int measure_breadcrumb_dw(struct intel_context *ce)
return dw;
  }
  
-void

-intel_engine_init_active(struct intel_engine_cs *engine, unsigned int subclass)
-{
-   INIT_LIST_HEAD(>active.requests);
-   INIT_LIST_HEAD(>active.hold);
-
-   spin_lock_init(>active.lock);
-   lockdep_set_subclass(>active.lock, subclass);
-
-   /*
-* Due to an interesting quirk in lockdep's internal debug tracking,
-* after setting a subclass we must ensure the lock is used. Otherwise,
-* nr_unused_locks is incremented once too often.
-*/
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-   local_irq_disable();
-   lock_map_acquire(>active.lock.dep_map);
-   lock_map_release(>active.lock.dep_map);
-   local_irq_enable();
-#endif
-}
-
  static struct intel_context *
  create_pinned_context(struct intel_engine_cs *engine,
  unsigned int hwsp,
@@ -930,7 +911,7 @@ int intel_engines_init(struct intel_gt *gt)
   */
  void intel_engine_cleanup_common(struct intel_engine_cs *engine)
  {
-   GEM_BUG_ON(!list_empty(>active.requests));
+   GEM_BUG_ON(!list_empty(>sched.requests));
tasklet_kill(>execlists.tasklet); /* flush the callback */
  
  	intel_breadcrumbs_free(engine->breadcrumbs);

diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h 
b/drivers/gpu/drm/i915/gt/intel_engine_types.h
index e5637e831d28..0936b0699cbb 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h
@@ -258,8 +258,6 @@ struct intel_engine_execlists {
struct rb_root_cached queue;
struct rb_root_cached virtual;
  
-	struct i915_sched_ipi ipi;

-
/**
 * @csb_write: control register for Context Switch buffer
 *
@@ -329,11 +327,7 @@ struct intel_engine_cs {
  
  	struct intel_sseu sseu;
  
-	

[Intel-gfx] [PATCH 21/57] drm/i915: Move common active lists from engine to i915_scheduler

2021-02-01 Thread Chris Wilson
Extract the scheduler lists into a related structure, stop sprawling
over struct intel_engine_cs. Also transfer the responsibility of tracing
the scheduler events from ENGINE_TRACE() to SCHED_TRACE().

Signed-off-by: Chris Wilson 
---
 drivers/gpu/drm/i915/gem/i915_gem_context.c   |  8 +-
 drivers/gpu/drm/i915/gt/intel_engine_cs.c | 33 ++--
 drivers/gpu/drm/i915/gt/intel_engine_types.h  | 10 +--
 .../drm/i915/gt/intel_execlists_submission.c  | 27 ---
 drivers/gpu/drm/i915/gt/mock_engine.c |  7 +-
 drivers/gpu/drm/i915/i915_request.c   |  8 +-
 drivers/gpu/drm/i915/i915_request.h   |  8 +-
 drivers/gpu/drm/i915/i915_scheduler.c | 78 ++-
 drivers/gpu/drm/i915/i915_scheduler.h | 13 +++-
 drivers/gpu/drm/i915/i915_scheduler_types.h   | 31 +++-
 .../gpu/drm/i915/selftests/i915_scheduler.c   |  1 +
 11 files changed, 143 insertions(+), 81 deletions(-)

diff --git a/drivers/gpu/drm/i915/gem/i915_gem_context.c 
b/drivers/gpu/drm/i915/gem/i915_gem_context.c
index ecacfae8412d..ca37d93ef5e7 100644
--- a/drivers/gpu/drm/i915/gem/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/gem/i915_gem_context.c
@@ -422,11 +422,11 @@ __active_engine(struct i915_request *rq, struct 
intel_engine_cs **active)
 * check that we have acquired the lock on the final engine.
 */
locked = READ_ONCE(rq->engine);
-   spin_lock_irq(>active.lock);
+   spin_lock_irq(>sched.lock);
while (unlikely(locked != (engine = READ_ONCE(rq->engine {
-   spin_unlock(>active.lock);
+   spin_unlock(>sched.lock);
locked = engine;
-   spin_lock(>active.lock);
+   spin_lock(>sched.lock);
}
 
if (i915_request_is_active(rq)) {
@@ -435,7 +435,7 @@ __active_engine(struct i915_request *rq, struct 
intel_engine_cs **active)
ret = true;
}
 
-   spin_unlock_irq(>active.lock);
+   spin_unlock_irq(>sched.lock);
 
return ret;
 }
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_cs.c 
b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
index a2916c7fcc48..d7ff84d92936 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_cs.c
+++ b/drivers/gpu/drm/i915/gt/intel_engine_cs.c
@@ -575,8 +575,6 @@ void intel_engine_init_execlists(struct intel_engine_cs 
*engine)
 
execlists->queue_priority_hint = INT_MIN;
execlists->queue = RB_ROOT_CACHED;
-
-   i915_sched_init_ipi(>ipi);
 }
 
 static void cleanup_status_page(struct intel_engine_cs *engine)
@@ -692,7 +690,12 @@ static int engine_setup_common(struct intel_engine_cs 
*engine)
goto err_status;
}
 
-   intel_engine_init_active(engine, ENGINE_PHYSICAL);
+   i915_sched_init(>sched,
+   engine->i915->drm.dev,
+   engine->name,
+   engine->mask,
+   ENGINE_PHYSICAL);
+
intel_engine_init_execlists(engine);
intel_engine_init_cmd_parser(engine);
intel_engine_init__pm(engine);
@@ -761,28 +764,6 @@ static int measure_breadcrumb_dw(struct intel_context *ce)
return dw;
 }
 
-void
-intel_engine_init_active(struct intel_engine_cs *engine, unsigned int subclass)
-{
-   INIT_LIST_HEAD(>active.requests);
-   INIT_LIST_HEAD(>active.hold);
-
-   spin_lock_init(>active.lock);
-   lockdep_set_subclass(>active.lock, subclass);
-
-   /*
-* Due to an interesting quirk in lockdep's internal debug tracking,
-* after setting a subclass we must ensure the lock is used. Otherwise,
-* nr_unused_locks is incremented once too often.
-*/
-#ifdef CONFIG_DEBUG_LOCK_ALLOC
-   local_irq_disable();
-   lock_map_acquire(>active.lock.dep_map);
-   lock_map_release(>active.lock.dep_map);
-   local_irq_enable();
-#endif
-}
-
 static struct intel_context *
 create_pinned_context(struct intel_engine_cs *engine,
  unsigned int hwsp,
@@ -930,7 +911,7 @@ int intel_engines_init(struct intel_gt *gt)
  */
 void intel_engine_cleanup_common(struct intel_engine_cs *engine)
 {
-   GEM_BUG_ON(!list_empty(>active.requests));
+   GEM_BUG_ON(!list_empty(>sched.requests));
tasklet_kill(>execlists.tasklet); /* flush the callback */
 
intel_breadcrumbs_free(engine->breadcrumbs);
diff --git a/drivers/gpu/drm/i915/gt/intel_engine_types.h 
b/drivers/gpu/drm/i915/gt/intel_engine_types.h
index e5637e831d28..0936b0699cbb 100644
--- a/drivers/gpu/drm/i915/gt/intel_engine_types.h
+++ b/drivers/gpu/drm/i915/gt/intel_engine_types.h
@@ -258,8 +258,6 @@ struct intel_engine_execlists {
struct rb_root_cached queue;
struct rb_root_cached virtual;
 
-   struct i915_sched_ipi ipi;
-
/**
 * @csb_write: control register for Context Switch buffer
 *
@@ -329,11 +327,7 @@ struct intel_engine_cs {
 
struct intel_sseu sseu;
 
-   struct i915_sched {
-