diff options
author | Chris Wilson <chris@chris-wilson.co.uk> | 2017-10-13 16:26:16 -0400 |
---|---|---|
committer | Chris Wilson <chris@chris-wilson.co.uk> | 2017-10-16 15:44:19 -0400 |
commit | 3d574a6bbb12a6c3bbeea807a1724b44a0f6ebbb (patch) | |
tree | 03aab19734eab1742c772553d93c71c759609ced /drivers/gpu/drm/i915/intel_ringbuffer.c | |
parent | f46250e4773149ab0fd8262cdc28764bb58a2d62 (diff) |
drm/i915: Remove walk over obj->vma_list for the shrinker
In the next patch, we want to reduce the lock coverage within the
shrinker, and one of the dangerous walks we have is over obj->vma_list.
We are only walking the obj->vma_list in order to check whether it has
been permanently pinned by HW access, typically via use on the scanout.
But we have a couple of other long term pins, the context objects for
which we currently have to check the individual vma pin_count. If we
instead mark these using obj->pin_display, we can forgo the dangerous
and sometimes slow list iteration.
v2: Rearrange code to try and avoid confusion from false associations
due to arrangement of whitespace along with rebasing on obj->pin_global.
Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171013202621.7276-4-chris@chris-wilson.co.uk
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ringbuffer.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_ringbuffer.c | 8 |
1 files changed, 7 insertions, 1 deletions
diff --git a/drivers/gpu/drm/i915/intel_ringbuffer.c b/drivers/gpu/drm/i915/intel_ringbuffer.c index b2a6cb09c6e7..8da1bde442dd 100644 --- a/drivers/gpu/drm/i915/intel_ringbuffer.c +++ b/drivers/gpu/drm/i915/intel_ringbuffer.c | |||
@@ -1244,6 +1244,8 @@ int intel_ring_pin(struct intel_ring *ring, | |||
1244 | if (IS_ERR(addr)) | 1244 | if (IS_ERR(addr)) |
1245 | goto err; | 1245 | goto err; |
1246 | 1246 | ||
1247 | vma->obj->pin_global++; | ||
1248 | |||
1247 | ring->vaddr = addr; | 1249 | ring->vaddr = addr; |
1248 | return 0; | 1250 | return 0; |
1249 | 1251 | ||
@@ -1275,6 +1277,7 @@ void intel_ring_unpin(struct intel_ring *ring) | |||
1275 | i915_gem_object_unpin_map(ring->vma->obj); | 1277 | i915_gem_object_unpin_map(ring->vma->obj); |
1276 | ring->vaddr = NULL; | 1278 | ring->vaddr = NULL; |
1277 | 1279 | ||
1280 | ring->vma->obj->pin_global--; | ||
1278 | i915_vma_unpin(ring->vma); | 1281 | i915_vma_unpin(ring->vma); |
1279 | } | 1282 | } |
1280 | 1283 | ||
@@ -1439,6 +1442,7 @@ intel_ring_context_pin(struct intel_engine_cs *engine, | |||
1439 | goto err; | 1442 | goto err; |
1440 | 1443 | ||
1441 | ce->state->obj->mm.dirty = true; | 1444 | ce->state->obj->mm.dirty = true; |
1445 | ce->state->obj->pin_global++; | ||
1442 | } | 1446 | } |
1443 | 1447 | ||
1444 | /* The kernel context is only used as a placeholder for flushing the | 1448 | /* The kernel context is only used as a placeholder for flushing the |
@@ -1473,8 +1477,10 @@ static void intel_ring_context_unpin(struct intel_engine_cs *engine, | |||
1473 | if (--ce->pin_count) | 1477 | if (--ce->pin_count) |
1474 | return; | 1478 | return; |
1475 | 1479 | ||
1476 | if (ce->state) | 1480 | if (ce->state) { |
1481 | ce->state->obj->pin_global--; | ||
1477 | i915_vma_unpin(ce->state); | 1482 | i915_vma_unpin(ce->state); |
1483 | } | ||
1478 | 1484 | ||
1479 | i915_gem_context_put(ctx); | 1485 | i915_gem_context_put(ctx); |
1480 | } | 1486 | } |