aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c8
-rw-r--r--drivers/gpu/drm/i915/i915_gem_context.c12
-rw-r--r--drivers/gpu/drm/i915/i915_gem_gtt.c2
-rw-r--r--drivers/gpu/drm/i915/i915_gem_shrinker.c12
-rw-r--r--drivers/gpu/drm/i915/i915_guc_submission.c3
-rw-r--r--drivers/gpu/drm/i915/i915_irq.c6
-rw-r--r--drivers/gpu/drm/i915/i915_vma.c7
-rw-r--r--drivers/gpu/drm/i915/intel_display.c14
-rw-r--r--drivers/gpu/drm/i915/intel_engine_cs.c5
-rw-r--r--drivers/gpu/drm/i915/intel_lrc.c29
-rw-r--r--drivers/gpu/drm/i915/intel_pm.c53
-rw-r--r--drivers/gpu/drm/i915/intel_ringbuffer.h34
12 files changed, 133 insertions, 52 deletions
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 026cb52ece0b..94b23fcbc989 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -4603,11 +4603,17 @@ static void __i915_gem_free_work(struct work_struct *work)
4603 * unbound now. 4603 * unbound now.
4604 */ 4604 */
4605 4605
4606 spin_lock(&i915->mm.free_lock);
4606 while ((freed = llist_del_all(&i915->mm.free_list))) { 4607 while ((freed = llist_del_all(&i915->mm.free_list))) {
4608 spin_unlock(&i915->mm.free_lock);
4609
4607 __i915_gem_free_objects(i915, freed); 4610 __i915_gem_free_objects(i915, freed);
4608 if (need_resched()) 4611 if (need_resched())
4609 break; 4612 return;
4613
4614 spin_lock(&i915->mm.free_lock);
4610 } 4615 }
4616 spin_unlock(&i915->mm.free_lock);
4611} 4617}
4612 4618
4613static void __i915_gem_free_object_rcu(struct rcu_head *head) 4619static void __i915_gem_free_object_rcu(struct rcu_head *head)
diff --git a/drivers/gpu/drm/i915/i915_gem_context.c b/drivers/gpu/drm/i915/i915_gem_context.c
index 5bf96a258509..e304dcbc6042 100644
--- a/drivers/gpu/drm/i915/i915_gem_context.c
+++ b/drivers/gpu/drm/i915/i915_gem_context.c
@@ -106,14 +106,9 @@ static void lut_close(struct i915_gem_context *ctx)
106 106
107 radix_tree_for_each_slot(slot, &ctx->handles_vma, &iter, 0) { 107 radix_tree_for_each_slot(slot, &ctx->handles_vma, &iter, 0) {
108 struct i915_vma *vma = rcu_dereference_raw(*slot); 108 struct i915_vma *vma = rcu_dereference_raw(*slot);
109 struct drm_i915_gem_object *obj = vma->obj;
110 109
111 radix_tree_iter_delete(&ctx->handles_vma, &iter, slot); 110 radix_tree_iter_delete(&ctx->handles_vma, &iter, slot);
112 111 __i915_gem_object_release_unless_active(vma->obj);
113 if (!i915_vma_is_ggtt(vma))
114 i915_vma_close(vma);
115
116 __i915_gem_object_release_unless_active(obj);
117 } 112 }
118} 113}
119 114
@@ -198,6 +193,11 @@ static void context_close(struct i915_gem_context *ctx)
198{ 193{
199 i915_gem_context_set_closed(ctx); 194 i915_gem_context_set_closed(ctx);
200 195
196 /*
197 * The LUT uses the VMA as a backpointer to unref the object,
198 * so we need to clear the LUT before we close all the VMA (inside
199 * the ppgtt).
200 */
201 lut_close(ctx); 201 lut_close(ctx);
202 if (ctx->ppgtt) 202 if (ctx->ppgtt)
203 i915_ppgtt_close(&ctx->ppgtt->base); 203 i915_ppgtt_close(&ctx->ppgtt->base);
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 527a2d2d6281..5eaa6893daaa 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -1341,7 +1341,7 @@ static int gen8_ppgtt_alloc_pd(struct i915_address_space *vm,
1341 if (IS_ERR(pt)) 1341 if (IS_ERR(pt))
1342 goto unwind; 1342 goto unwind;
1343 1343
1344 if (count < GEN8_PTES) 1344 if (count < GEN8_PTES || intel_vgpu_active(vm->i915))
1345 gen8_initialize_pt(vm, pt); 1345 gen8_initialize_pt(vm, pt);
1346 1346
1347 gen8_ppgtt_set_pde(vm, pd, pt, pde); 1347 gen8_ppgtt_set_pde(vm, pd, pt, pde);
diff --git a/drivers/gpu/drm/i915/i915_gem_shrinker.c b/drivers/gpu/drm/i915/i915_gem_shrinker.c
index eb31f8aa5c21..3770e3323fc8 100644
--- a/drivers/gpu/drm/i915/i915_gem_shrinker.c
+++ b/drivers/gpu/drm/i915/i915_gem_shrinker.c
@@ -162,6 +162,18 @@ i915_gem_shrink(struct drm_i915_private *dev_priv,
162 if (!shrinker_lock(dev_priv, &unlock)) 162 if (!shrinker_lock(dev_priv, &unlock))
163 return 0; 163 return 0;
164 164
165 /*
166 * When shrinking the active list, also consider active contexts.
167 * Active contexts are pinned until they are retired, and so can
168 * not be simply unbound to retire and unpin their pages. To shrink
169 * the contexts, we must wait until the gpu is idle.
170 *
171 * We don't care about errors here; if we cannot wait upon the GPU,
172 * we will free as much as we can and hope to get a second chance.
173 */
174 if (flags & I915_SHRINK_ACTIVE)
175 i915_gem_wait_for_idle(dev_priv, I915_WAIT_LOCKED);
176
165 trace_i915_gem_shrink(dev_priv, target, flags); 177 trace_i915_gem_shrink(dev_priv, target, flags);
166 i915_gem_retire_requests(dev_priv); 178 i915_gem_retire_requests(dev_priv);
167 179
diff --git a/drivers/gpu/drm/i915/i915_guc_submission.c b/drivers/gpu/drm/i915/i915_guc_submission.c
index a2e8114b739d..f84c267728fd 100644
--- a/drivers/gpu/drm/i915/i915_guc_submission.c
+++ b/drivers/gpu/drm/i915/i915_guc_submission.c
@@ -610,6 +610,7 @@ done:
610 execlists->first = rb; 610 execlists->first = rb;
611 if (submit) { 611 if (submit) {
612 port_assign(port, last); 612 port_assign(port, last);
613 execlists_set_active(execlists, EXECLISTS_ACTIVE_USER);
613 i915_guc_submit(engine); 614 i915_guc_submit(engine);
614 } 615 }
615 spin_unlock_irq(&engine->timeline->lock); 616 spin_unlock_irq(&engine->timeline->lock);
@@ -633,6 +634,8 @@ static void i915_guc_irq_handler(unsigned long data)
633 634
634 rq = port_request(&port[0]); 635 rq = port_request(&port[0]);
635 } 636 }
637 if (!rq)
638 execlists_clear_active(execlists, EXECLISTS_ACTIVE_USER);
636 639
637 if (!port_isset(last_port)) 640 if (!port_isset(last_port))
638 i915_guc_dequeue(engine); 641 i915_guc_dequeue(engine);
diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
index b1296a55c1e4..f8205841868b 100644
--- a/drivers/gpu/drm/i915/i915_irq.c
+++ b/drivers/gpu/drm/i915/i915_irq.c
@@ -1388,8 +1388,10 @@ gen8_cs_irq_handler(struct intel_engine_cs *engine, u32 iir, int test_shift)
1388 bool tasklet = false; 1388 bool tasklet = false;
1389 1389
1390 if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift)) { 1390 if (iir & (GT_CONTEXT_SWITCH_INTERRUPT << test_shift)) {
1391 __set_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted); 1391 if (READ_ONCE(engine->execlists.active)) {
1392 tasklet = true; 1392 __set_bit(ENGINE_IRQ_EXECLIST, &engine->irq_posted);
1393 tasklet = true;
1394 }
1393 } 1395 }
1394 1396
1395 if (iir & (GT_RENDER_USER_INTERRUPT << test_shift)) { 1397 if (iir & (GT_RENDER_USER_INTERRUPT << test_shift)) {
diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
index fc77e8191eb5..fbfab2f33023 100644
--- a/drivers/gpu/drm/i915/i915_vma.c
+++ b/drivers/gpu/drm/i915/i915_vma.c
@@ -54,6 +54,13 @@ i915_vma_retire(struct i915_gem_active *active,
54 if (--obj->active_count) 54 if (--obj->active_count)
55 return; 55 return;
56 56
57 /* Prune the shared fence arrays iff completely idle (inc. external) */
58 if (reservation_object_trylock(obj->resv)) {
59 if (reservation_object_test_signaled_rcu(obj->resv, true))
60 reservation_object_add_excl_fence(obj->resv, NULL);
61 reservation_object_unlock(obj->resv);
62 }
63
57 /* Bump our place on the bound list to keep it roughly in LRU order 64 /* Bump our place on the bound list to keep it roughly in LRU order
58 * so that we don't steal from recently used but inactive objects 65 * so that we don't steal from recently used but inactive objects
59 * (unless we are forced to ofc!) 66 * (unless we are forced to ofc!)
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index e2ac976844d8..f4a9a182868f 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -3676,6 +3676,7 @@ void intel_finish_reset(struct drm_i915_private *dev_priv)
3676 3676
3677 intel_pps_unlock_regs_wa(dev_priv); 3677 intel_pps_unlock_regs_wa(dev_priv);
3678 intel_modeset_init_hw(dev); 3678 intel_modeset_init_hw(dev);
3679 intel_init_clock_gating(dev_priv);
3679 3680
3680 spin_lock_irq(&dev_priv->irq_lock); 3681 spin_lock_irq(&dev_priv->irq_lock);
3681 if (dev_priv->display.hpd_irq_setup) 3682 if (dev_priv->display.hpd_irq_setup)
@@ -14350,8 +14351,6 @@ void intel_modeset_init_hw(struct drm_device *dev)
14350 14351
14351 intel_update_cdclk(dev_priv); 14352 intel_update_cdclk(dev_priv);
14352 dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw; 14353 dev_priv->cdclk.logical = dev_priv->cdclk.actual = dev_priv->cdclk.hw;
14353
14354 intel_init_clock_gating(dev_priv);
14355} 14354}
14356 14355
14357/* 14356/*
@@ -15063,6 +15062,15 @@ intel_modeset_setup_hw_state(struct drm_device *dev,
15063 struct intel_encoder *encoder; 15062 struct intel_encoder *encoder;