[Intel-gfx] [PATCH v2 1/3] drm/i915/guc: keep GuC objects mapped in kernel
Chris Wilson
chris at chris-wilson.co.uk
Mon Apr 18 10:25:09 UTC 2016
On Mon, Apr 18, 2016 at 11:15:07AM +0100, Dave Gordon wrote:
> With the new i915_gem_obj_pin_map() interface, it makes sense to keep
> GuC objects (which are always pinned in memory and in the GGTT anyway)
> mapped into kernel address space, rather than mapping and unmapping them
> on each access.
>
> This preliminary patch sets up the pin-and-map for all GuC-specific
> objects, and updates the various setup/shutdown functions to use these
> long-term mappings rather than doing their own kmap_atomic() calls.
>
> v2:
> Invent & use accessor function i915_object_mapped_address() rather
> than accessing obj->mapping directly (Tvrtko Ursulin)
> Use IS_ERR() rather than checking for NULL (Tvrtko Ursulin)
> Added big comment about struct i915_guc_client & usage of the GEM
> object that it describes
>
> Cc: <tvrtko.ursulin at intel.com>
> Signed-off-by: Alex Dai <yu.dai at intel.com>
> Signed-off-by: Dave Gordon <david.s.gordon at intel.com>
> ---
> drivers/gpu/drm/i915/i915_drv.h | 12 ++++++++++
> drivers/gpu/drm/i915/i915_guc_submission.c | 38 +++++++++++-------------------
> drivers/gpu/drm/i915/intel_guc.h | 24 +++++++++++++++++++
> 3 files changed, 50 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 85102ad..439f149 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -3025,6 +3025,18 @@ static inline void i915_gem_object_unpin_pages(struct drm_i915_gem_object *obj)
> void *__must_check i915_gem_object_pin_map(struct drm_i915_gem_object *obj);
>
> /**
> + * i915_object_mapped_address - address at which a GEM object is mapped
> + * @obj - the object (presumably already mapped into kernel address space)
> + *
> + * Returns the address at which an object has been mapped by a call to
> + * i915_gem_object_pin_map() above, or NULL if not currently mapped and pinned
> + */
> +static inline void *i915_object_mapped_address(struct drm_i915_gem_object *obj)
> +{
> + return obj->pages_pin_count == 0 ? NULL : obj->mapping;
> +}
No.
> @@ -649,6 +639,9 @@ static void gem_release_guc_obj(struct drm_i915_gem_object *obj)
> if (i915_gem_obj_is_pinned(obj))
> i915_gem_object_ggtt_unpin(obj);
>
> + if (i915_object_mapped_address(obj))
> + i915_gem_object_unpin_map(obj);
Eh? If you aren't tracking your pin, you can't just randomly free
someone elses.
> drm_gem_object_unreference(&obj->base);
> }
>
> @@ -729,6 +722,8 @@ static struct i915_guc_client *guc_client_alloc(struct drm_device *dev,
> goto err;
>
> client->client_obj = obj;
> + client->client_base = i915_object_mapped_address(obj);
> + WARN_ON(!client->client_base);
> client->wq_offset = GUC_DB_SIZE;
> client->wq_size = GUC_WQ_SIZE;
>
> @@ -841,7 +836,6 @@ static void guc_create_ads(struct intel_guc *guc)
> struct guc_policies *policies;
> struct guc_mmio_reg_state *reg_state;
> struct intel_engine_cs *engine;
> - struct page *page;
> u32 size;
>
> /* The ads obj includes the struct itself and buffers passed to GuC */
> @@ -857,9 +851,7 @@ static void guc_create_ads(struct intel_guc *guc)
>
> guc->ads_obj = obj;
> }
> -
> - page = i915_gem_object_get_page(obj, 0);
> - ads = kmap(page);
> + ads = i915_object_mapped_address(obj);
You need to explicitly aknowlege that you are using the memory tracked
by the object otherwise it *will* be removed by the shrinker.
So what is wrong with using i915_gem_object_pin_map()?
-Chris
--
Chris Wilson, Intel Open Source Technology Centre
More information about the Intel-gfx
mailing list