drm/i915: Release shortlived maps of longlived objects
authorChris Wilson <chris@chris-wilson.co.uk>
Wed, 8 Jul 2020 17:37:47 +0000 (18:37 +0100)
committerChris Wilson <chris@chris-wilson.co.uk>
Wed, 8 Jul 2020 21:05:50 +0000 (22:05 +0100)
Some objects we map once during their construction, and then never
access their mappings again, even if they are kept around for the
duration of the driver. Keeping those pages mapped, often vmapped, is
therefore wasteful and we should release the maps as soon as we no
longer need them.

Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200708173748.32734-3-chris@chris-wilson.co.uk
drivers/gpu/drm/i915/gem/i915_gem_object.h
drivers/gpu/drm/i915/gem/i915_gem_pages.c
drivers/gpu/drm/i915/gt/gen7_renderclear.c
drivers/gpu/drm/i915/gt/intel_lrc.c
drivers/gpu/drm/i915/gt/intel_renderstate.c
drivers/gpu/drm/i915/gt/intel_ring_submission.c
drivers/gpu/drm/i915/i915_perf.c

index 2faa481cc18f9ddf491cd7691f09c1f24eee9266..9cf4ad78ece6ef6e926aabd01d9155e06b2bb9c4 100644 (file)
@@ -394,6 +394,8 @@ static inline void i915_gem_object_unpin_map(struct drm_i915_gem_object *obj)
        i915_gem_object_unpin_pages(obj);
 }
 
+void __i915_gem_object_release_map(struct drm_i915_gem_object *obj);
+
 void
 i915_gem_object_flush_write_domain(struct drm_i915_gem_object *obj,
                                   unsigned int flush_domains);
index af9e48ee4a334c10981397299e99a50b232fcccf..7e54657cf67bdd8075b6e64443b9eb8532114749 100644 (file)
@@ -408,6 +408,21 @@ void __i915_gem_object_flush_map(struct drm_i915_gem_object *obj,
        }
 }
 
+void __i915_gem_object_release_map(struct drm_i915_gem_object *obj)
+{
+       GEM_BUG_ON(!obj->mm.mapping);
+
+       /*
+        * We allow removing the mapping from underneath pinned pages!
+        *
+        * Furthermore, since this is an unsafe operation reserved only
+        * for construction time manipulation, we ignore locking prudence.
+        */
+       unmap_object(obj, page_mask_bits(fetch_and_zero(&obj->mm.mapping)));
+
+       i915_gem_object_unpin_map(obj);
+}
+
 struct scatterlist *
 i915_gem_object_get_sg(struct drm_i915_gem_object *obj,
                       unsigned int n,
index de595b66a7462b4cbe539a99b884ac334c104cb2..d93d85cd30270ba371ac877632b1d2261dcdc8e5 100644 (file)
@@ -396,7 +396,7 @@ int gen7_setup_clear_gpr_bb(struct intel_engine_cs * const engine,
        emit_batch(vma, memset(batch, 0, bv.max_size), &bv);
 
        i915_gem_object_flush_map(vma->obj);
-       i915_gem_object_unpin_map(vma->obj);
+       __i915_gem_object_release_map(vma->obj);
 
        return 0;
 }
index 890ad041ea5cca2959bf19007965550176f6322b..fbcfeaed6441a084b90a0bd375c049570e3bf4b6 100644 (file)
@@ -3937,7 +3937,7 @@ static int intel_init_workaround_bb(struct intel_engine_cs *engine)
        GEM_BUG_ON(batch_ptr - batch > CTX_WA_BB_OBJ_SIZE);
 
        __i915_gem_object_flush_map(wa_ctx->vma->obj, 0, batch_ptr - batch);
-       i915_gem_object_unpin_map(wa_ctx->vma->obj);
+       __i915_gem_object_release_map(wa_ctx->vma->obj);
        if (ret)
                lrc_destroy_wa_ctx(engine);
 
index 6db23389e427a3ca55dfd9ec39dd315d6701e2a7..1bfad589c63b348d53b35943302ff3bf0c9f2c98 100644 (file)
@@ -150,7 +150,7 @@ static int render_state_setup(struct intel_renderstate *so,
        ret = 0;
 out:
        __i915_gem_object_flush_map(so->vma->obj, 0, i * sizeof(u32));
-       i915_gem_object_unpin_map(so->vma->obj);
+       __i915_gem_object_release_map(so->vma->obj);
        return ret;
 }
 
index b09b83deecefa9cef5fa17e321f87f187c9b2f8b..94915f668715d754ead2fca46900ae3483b78ff0 100644 (file)
@@ -543,7 +543,7 @@ alloc_context_vma(struct intel_engine_cs *engine)
                           vaddr, engine->context_size);
 
                i915_gem_object_flush_map(obj);
-               i915_gem_object_unpin_map(obj);
+               __i915_gem_object_release_map(obj);
        }
 
        vma = i915_vma_instance(obj, &engine->gt->ggtt->vm, NULL);
index 37631ce0699b1328cd8519700cd17062969c77ca..de69d430b1ed86190c9aae17639bd409899f5241 100644 (file)
@@ -1772,7 +1772,7 @@ static int alloc_noa_wait(struct i915_perf_stream *stream)
        GEM_BUG_ON(cs - batch > PAGE_SIZE / sizeof(*batch));
 
        i915_gem_object_flush_map(bo);
-       i915_gem_object_unpin_map(bo);
+       __i915_gem_object_release_map(bo);
 
        stream->noa_wait = vma;
        return 0;
@@ -1867,7 +1867,7 @@ alloc_oa_config_buffer(struct i915_perf_stream *stream,
        *cs++ = 0;
 
        i915_gem_object_flush_map(obj);
-       i915_gem_object_unpin_map(obj);
+       __i915_gem_object_release_map(obj);
 
        oa_bo->vma = i915_vma_instance(obj,
                                       &stream->engine->gt->ggtt->vm,