Commit c29579d2 authored by Chris Wilson's avatar Chris Wilson

drm/i915/gem: Make caps.scheduler static

We do not notify userspace when the scheduler capabilities are changed
(due to wedging the driver) and as such userspace will expect the caps
to be static and unchanging. Make it so, and so we only need to compute
our caps once during driver registration.
Signed-off-by: default avatarChris Wilson <chris@chris-wilson.co.uk>
Cc: Tvrtko Ursulin <tvrtko.ursulin@linux.intel.com>
Reviewed-by: default avatarMika Kuoppala <mika.kuoppala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20190806124300.24945-1-chris@chris-wilson.co.uk
parent 361f9dc2
...@@ -459,13 +459,7 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr ...@@ -459,13 +459,7 @@ i915_gem_shrinker_vmap(struct notifier_block *nb, unsigned long event, void *ptr
return NOTIFY_DONE; return NOTIFY_DONE;
} }
/** void i915_gem_driver_register__shrinker(struct drm_i915_private *i915)
* i915_gem_shrinker_register - Register the i915 shrinker
* @i915: i915 device
*
* This function registers and sets up the i915 shrinker and OOM handler.
*/
void i915_gem_shrinker_register(struct drm_i915_private *i915)
{ {
i915->mm.shrinker.scan_objects = i915_gem_shrinker_scan; i915->mm.shrinker.scan_objects = i915_gem_shrinker_scan;
i915->mm.shrinker.count_objects = i915_gem_shrinker_count; i915->mm.shrinker.count_objects = i915_gem_shrinker_count;
...@@ -480,13 +474,7 @@ void i915_gem_shrinker_register(struct drm_i915_private *i915) ...@@ -480,13 +474,7 @@ void i915_gem_shrinker_register(struct drm_i915_private *i915)
WARN_ON(register_vmap_purge_notifier(&i915->mm.vmap_notifier)); WARN_ON(register_vmap_purge_notifier(&i915->mm.vmap_notifier));
} }
/** void i915_gem_driver_unregister__shrinker(struct drm_i915_private *i915)
* i915_gem_shrinker_unregister - Unregisters the i915 shrinker
* @i915: i915 device
*
* This function unregisters the i915 shrinker and OOM handler.
*/
void i915_gem_shrinker_unregister(struct drm_i915_private *i915)
{ {
WARN_ON(unregister_vmap_purge_notifier(&i915->mm.vmap_notifier)); WARN_ON(unregister_vmap_purge_notifier(&i915->mm.vmap_notifier));
WARN_ON(unregister_oom_notifier(&i915->mm.oom_notifier)); WARN_ON(unregister_oom_notifier(&i915->mm.oom_notifier));
......
...@@ -382,7 +382,7 @@ static bool assert_mmap_offset(struct drm_i915_private *i915, ...@@ -382,7 +382,7 @@ static bool assert_mmap_offset(struct drm_i915_private *i915,
static void disable_retire_worker(struct drm_i915_private *i915) static void disable_retire_worker(struct drm_i915_private *i915)
{ {
i915_gem_shrinker_unregister(i915); i915_gem_driver_unregister__shrinker(i915);
intel_gt_pm_get(&i915->gt); intel_gt_pm_get(&i915->gt);
...@@ -398,7 +398,7 @@ static void restore_retire_worker(struct drm_i915_private *i915) ...@@ -398,7 +398,7 @@ static void restore_retire_worker(struct drm_i915_private *i915)
igt_flush_test(i915, I915_WAIT_LOCKED); igt_flush_test(i915, I915_WAIT_LOCKED);
mutex_unlock(&i915->drm.struct_mutex); mutex_unlock(&i915->drm.struct_mutex);
i915_gem_shrinker_register(i915); i915_gem_driver_register__shrinker(i915);
} }
static void mmap_offset_lock(struct drm_i915_private *i915) static void mmap_offset_lock(struct drm_i915_private *i915)
......
...@@ -757,11 +757,8 @@ static void __intel_gt_set_wedged(struct intel_gt *gt) ...@@ -757,11 +757,8 @@ static void __intel_gt_set_wedged(struct intel_gt *gt)
if (!INTEL_INFO(gt->i915)->gpu_reset_clobbers_display) if (!INTEL_INFO(gt->i915)->gpu_reset_clobbers_display)
__intel_gt_reset(gt, ALL_ENGINES); __intel_gt_reset(gt, ALL_ENGINES);
for_each_engine(engine, gt->i915, id) { for_each_engine(engine, gt->i915, id)
engine->submit_request = nop_submit_request; engine->submit_request = nop_submit_request;
engine->schedule = NULL;
}
gt->i915->caps.scheduler = 0;
/* /*
* Make sure no request can slip through without getting completed by * Make sure no request can slip through without getting completed by
......
...@@ -1719,7 +1719,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv) ...@@ -1719,7 +1719,7 @@ static void i915_driver_register(struct drm_i915_private *dev_priv)
{ {
struct drm_device *dev = &dev_priv->drm; struct drm_device *dev = &dev_priv->drm;
i915_gem_shrinker_register(dev_priv); i915_gem_driver_register(dev_priv);
i915_pmu_register(dev_priv); i915_pmu_register(dev_priv);
/* /*
...@@ -1799,7 +1799,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv) ...@@ -1799,7 +1799,7 @@ static void i915_driver_unregister(struct drm_i915_private *dev_priv)
i915_teardown_sysfs(dev_priv); i915_teardown_sysfs(dev_priv);
drm_dev_unplug(&dev_priv->drm); drm_dev_unplug(&dev_priv->drm);
i915_gem_shrinker_unregister(dev_priv); i915_gem_driver_unregister(dev_priv);
} }
static void i915_welcome_messages(struct drm_i915_private *dev_priv) static void i915_welcome_messages(struct drm_i915_private *dev_priv)
......
...@@ -2488,6 +2488,8 @@ static inline u32 i915_reset_engine_count(struct i915_gpu_error *error, ...@@ -2488,6 +2488,8 @@ static inline u32 i915_reset_engine_count(struct i915_gpu_error *error,
void i915_gem_init_mmio(struct drm_i915_private *i915); void i915_gem_init_mmio(struct drm_i915_private *i915);
int __must_check i915_gem_init(struct drm_i915_private *dev_priv); int __must_check i915_gem_init(struct drm_i915_private *dev_priv);
int __must_check i915_gem_init_hw(struct drm_i915_private *dev_priv); int __must_check i915_gem_init_hw(struct drm_i915_private *dev_priv);
void i915_gem_driver_register(struct drm_i915_private *i915);
void i915_gem_driver_unregister(struct drm_i915_private *i915);
void i915_gem_driver_remove(struct drm_i915_private *dev_priv); void i915_gem_driver_remove(struct drm_i915_private *dev_priv);
void i915_gem_driver_release(struct drm_i915_private *dev_priv); void i915_gem_driver_release(struct drm_i915_private *dev_priv);
int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv, int i915_gem_wait_for_idle(struct drm_i915_private *dev_priv,
...@@ -2588,8 +2590,8 @@ unsigned long i915_gem_shrink(struct drm_i915_private *i915, ...@@ -2588,8 +2590,8 @@ unsigned long i915_gem_shrink(struct drm_i915_private *i915,
#define I915_SHRINK_WRITEBACK BIT(4) #define I915_SHRINK_WRITEBACK BIT(4)
unsigned long i915_gem_shrink_all(struct drm_i915_private *i915); unsigned long i915_gem_shrink_all(struct drm_i915_private *i915);
void i915_gem_shrinker_register(struct drm_i915_private *i915); void i915_gem_driver_register__shrinker(struct drm_i915_private *i915);
void i915_gem_shrinker_unregister(struct drm_i915_private *i915); void i915_gem_driver_unregister__shrinker(struct drm_i915_private *i915);
void i915_gem_shrinker_taints_mutex(struct drm_i915_private *i915, void i915_gem_shrinker_taints_mutex(struct drm_i915_private *i915,
struct mutex *mutex); struct mutex *mutex);
......
...@@ -1249,8 +1249,6 @@ int i915_gem_init_hw(struct drm_i915_private *i915) ...@@ -1249,8 +1249,6 @@ int i915_gem_init_hw(struct drm_i915_private *i915)
intel_mocs_init(gt); intel_mocs_init(gt);
intel_engines_set_scheduler_caps(i915);
out: out:
intel_uncore_forcewake_put(uncore, FORCEWAKE_ALL); intel_uncore_forcewake_put(uncore, FORCEWAKE_ALL);
return ret; return ret;
...@@ -1599,6 +1597,17 @@ int i915_gem_init(struct drm_i915_private *dev_priv) ...@@ -1599,6 +1597,17 @@ int i915_gem_init(struct drm_i915_private *dev_priv)
return ret; return ret;
} }
void i915_gem_driver_register(struct drm_i915_private *i915)
{
i915_gem_driver_register__shrinker(i915);
intel_engines_set_scheduler_caps(i915);
}
void i915_gem_driver_unregister(struct drm_i915_private *i915)
{
i915_gem_driver_unregister__shrinker(i915);
}
void i915_gem_driver_remove(struct drm_i915_private *dev_priv) void i915_gem_driver_remove(struct drm_i915_private *dev_priv)
{ {
GEM_BUG_ON(dev_priv->gt.awake); GEM_BUG_ON(dev_priv->gt.awake);
......
...@@ -1198,7 +1198,6 @@ struct i915_request *__i915_request_commit(struct i915_request *rq) ...@@ -1198,7 +1198,6 @@ struct i915_request *__i915_request_commit(struct i915_request *rq)
*/ */
local_bh_disable(); local_bh_disable();
i915_sw_fence_commit(&rq->semaphore); i915_sw_fence_commit(&rq->semaphore);
rcu_read_lock(); /* RCU serialisation for set-wedged protection */
if (engine->schedule) { if (engine->schedule) {
struct i915_sched_attr attr = rq->gem_context->sched; struct i915_sched_attr attr = rq->gem_context->sched;
...@@ -1228,7 +1227,6 @@ struct i915_request *__i915_request_commit(struct i915_request *rq) ...@@ -1228,7 +1227,6 @@ struct i915_request *__i915_request_commit(struct i915_request *rq)
engine->schedule(rq, &attr); engine->schedule(rq, &attr);
} }
rcu_read_unlock();
i915_sw_fence_commit(&rq->submit); i915_sw_fence_commit(&rq->submit);
local_bh_enable(); /* Kick the execlists tasklet if just scheduled */ local_bh_enable(); /* Kick the execlists tasklet if just scheduled */
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment