[Intel-gfx] [CI] drm/i915: Implement dma_buf_ops->kmap

Chris Wilson chris at chris-wilson.co.uk
Wed May 3 20:42:54 UTC 2017


On Wed, May 03, 2017 at 09:25:17PM +0100, Chris Wilson wrote:
> Since kmap allows us to block we can pin the pages and use our normal
> page lookup routine making the implementation simple, or as some might
> say quick and dirty.
> 
> Testcase: igt/drv_selftest/dmabuf
> Testcase: igt/prime_rw
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> Reviewed-by: Joonas Lahtinen <joonas.lahtinen at linux.intel.com>
> ---
>  drivers/gpu/drm/i915/i915_gem_dmabuf.c           |  24 ++++++
>  drivers/gpu/drm/i915/selftests/i915_gem_dmabuf.c | 104 +++++++++++++++++++++++
>  2 files changed, 128 insertions(+)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> index f225bf680b6d..6176e589cf09 100644
> --- a/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/i915_gem_dmabuf.c
> @@ -122,12 +122,36 @@ static void i915_gem_dmabuf_kunmap_atomic(struct dma_buf *dma_buf, unsigned long
>  }
>  static void *i915_gem_dmabuf_kmap(struct dma_buf *dma_buf, unsigned long page_num)
>  {
> +	struct drm_i915_gem_object *obj = dma_buf_to_obj(dma_buf);
> +	struct page *page;
> +
> +	if (page_num >= obj->base.size >> PAGE_SHIFT)
> +		return NULL;
> +
> +	if (!i915_gem_object_has_struct_page(obj))
> +		return NULL;
> +
> +	if (i915_gem_object_pin_pages(obj))
> +		return NULL;
> +
> +	/* Synchronisation is left to the caller (via .begin_cpu_access()) */
> +	page = i915_gem_object_get_page(obj, page_num);

Looking at this again, we can call unpin_pages here and rely on the
page->mapcount to keep the struct page alive until it is unmapped.

As we exclude all objects not backed by struct_page, that should give us
the reassurance that we won't reuse the backing storage ourselves.
Though I am thinking about what assurances dmabuf should give that it
does not disappear whilst it is mapped.
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre


More information about the Intel-gfx mailing list