[Intel-gfx] [PATCH 1/4] drm/i915: Pin fence for iomap

Tvrtko Ursulin tvrtko.ursulin at linux.intel.com
Tue Jul 4 09:53:53 UTC 2017


On 03/07/2017 11:14, Chris Wilson wrote:
> We probably want for the caller to specify whether the fence should be
> pinned for their usage, but at the moment all callers do want the
> associated fence, or none, so take it on their behalf.
Wouldn't this be wasting fences for ring buffers?

Regards,

Tvrtko

> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>   drivers/gpu/drm/i915/i915_vma.c                  | 19 +++++++++++++++++++
>   drivers/gpu/drm/i915/i915_vma.h                  |  7 +------
>   drivers/gpu/drm/i915/selftests/i915_gem_object.c |  8 --------
>   3 files changed, 20 insertions(+), 14 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_vma.c b/drivers/gpu/drm/i915/i915_vma.c
> index 958be0a95960..d7330d3eeab6 100644
> --- a/drivers/gpu/drm/i915/i915_vma.c
> +++ b/drivers/gpu/drm/i915/i915_vma.c
> @@ -278,6 +278,7 @@ int i915_vma_bind(struct i915_vma *vma, enum i915_cache_level cache_level,
>   void __iomem *i915_vma_pin_iomap(struct i915_vma *vma)
>   {
>   	void __iomem *ptr;
> +	int ret;
>   
>   	/* Access through the GTT requires the device to be awake. */
>   	assert_rpm_wakelock_held(vma->vm->i915);
> @@ -301,9 +302,27 @@ void __iomem *i915_vma_pin_iomap(struct i915_vma *vma)
>   	}
>   
>   	__i915_vma_pin(vma);
> +
> +	ret = i915_vma_get_fence(vma);
> +	if (ret) {
> +		__i915_vma_unpin(vma);
> +		return IO_ERR_PTR(ret);
> +	}
> +	i915_vma_pin_fence(vma);
> +
>   	return ptr;
>   }
>   
> +void i915_vma_unpin_iomap(struct i915_vma *vma)
> +{
> +	lockdep_assert_held(&vma->obj->base.dev->struct_mutex);
> +
> +	GEM_BUG_ON(vma->iomap == NULL);
> +
> +	i915_vma_unpin_fence(vma);
> +	i915_vma_unpin(vma);
> +}
> +
>   void i915_vma_unpin_and_release(struct i915_vma **p_vma)
>   {
>   	struct i915_vma *vma;
> diff --git a/drivers/gpu/drm/i915/i915_vma.h b/drivers/gpu/drm/i915/i915_vma.h
> index 4a673fc1a432..15e86e50a825 100644
> --- a/drivers/gpu/drm/i915/i915_vma.h
> +++ b/drivers/gpu/drm/i915/i915_vma.h
> @@ -319,12 +319,7 @@ void __iomem *i915_vma_pin_iomap(struct i915_vma *vma);
>    * Callers must hold the struct_mutex. This function is only valid to be
>    * called on a VMA previously iomapped by the caller with i915_vma_pin_iomap().
>    */
> -static inline void i915_vma_unpin_iomap(struct i915_vma *vma)
> -{
> -	lockdep_assert_held(&vma->obj->base.dev->struct_mutex);
> -	GEM_BUG_ON(vma->iomap == NULL);
> -	i915_vma_unpin(vma);
> -}
> +void i915_vma_unpin_iomap(struct i915_vma *vma);
>   
>   static inline struct page *i915_vma_first_page(struct i915_vma *vma)
>   {
> diff --git a/drivers/gpu/drm/i915/selftests/i915_gem_object.c b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> index 8f011c447e41..1b8774a42e48 100644
> --- a/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> +++ b/drivers/gpu/drm/i915/selftests/i915_gem_object.c
> @@ -251,14 +251,6 @@ static int check_partial_mapping(struct drm_i915_gem_object *obj,
>   			return PTR_ERR(io);
>   		}
>   
> -		err = i915_vma_get_fence(vma);
> -		if (err) {
> -			pr_err("Failed to get fence for partial view: offset=%lu\n",
> -			       page);
> -			i915_vma_unpin_iomap(vma);
> -			return err;
> -		}
> -
>   		iowrite32(page, io + n * PAGE_SIZE/sizeof(*io));
>   		i915_vma_unpin_iomap(vma);
>   
> 


More information about the Intel-gfx mailing list