Skip to content

Commit

Permalink
drm/i915: Release shortlived maps of longlived objects
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Chris Wilson committed Jul 8, 2020
1 parent 59c94b9 commit 89d19b2
Show file tree
Hide file tree
Showing 7 changed files with 23 additions and 6 deletions.
2 changes: 2 additions & 0 deletions drivers/gpu/drm/i915/gem/i915_gem_object.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
15 changes: 15 additions & 0 deletions drivers/gpu/drm/i915/gem/i915_gem_pages.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/gt/gen7_renderclear.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/gt/intel_lrc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/gt/intel_renderstate.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/i915/gt/intel_ring_submission.c
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/i915/i915_perf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down

0 comments on commit 89d19b2

Please sign in to comment.