[PATCH 19/27] drm/etnaviv: move ww_acquire_ctx out of submit object

Philipp Zabel p.zabel at pengutronix.de
Fri Dec 15 18:34:48 UTC 2017


On Fri, 2017-12-01 at 11:36 +0100, Lucas Stach wrote:
> The acquire_ctx is special in that it needs to be released from the same
> thread as has been used to initialize it. This collides with the intention to
> extend the submit lifetime beyond the gem_submit function with potentially
> other threads doing the final cleanup.
> 
> Move the ww_acquire_ctx to the function local stack as suggested in the
> documentation.
> 
> Signed-off-by: Lucas Stach <l.stach at pengutronix.de>

Reviewed-by: Philipp Zabel <p.zabel at pengutronix.de>

regards
Philipp

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_gem.h        |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 22 +++++++++++++---------
>  2 files changed, 13 insertions(+), 10 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.h b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> index 21cb3460046f..6b78d059ed2d 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.h
> @@ -102,7 +102,6 @@ struct etnaviv_gem_submit_bo {
>   */
>  struct etnaviv_gem_submit {
>  	struct etnaviv_gpu *gpu;
> -	struct ww_acquire_ctx ticket;
>  	struct dma_fence *out_fence, *in_fence;
>  	u32 flags;
>  	unsigned int nr_bos;
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> index 9b5541207d33..3090a46979af 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
> @@ -44,8 +44,6 @@ static struct etnaviv_gem_submit *submit_create(struct drm_device *dev,
>  
>  	submit->gpu = gpu;
>  
> -	ww_acquire_init(&submit->ticket, &reservation_ww_class);
> -
>  	return submit;
>  }
>  
> @@ -107,7 +105,8 @@ static void submit_unlock_object(struct etnaviv_gem_submit *submit, int i)
>  	}
>  }
>  
> -static int submit_lock_objects(struct etnaviv_gem_submit *submit)
> +static int submit_lock_objects(struct etnaviv_gem_submit *submit,
> +		struct ww_acquire_ctx *ticket)
>  {
>  	int contended, slow_locked = -1, i, ret = 0;
>  
> @@ -122,7 +121,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit)
>  
>  		if (!(submit->bos[i].flags & BO_LOCKED)) {
>  			ret = ww_mutex_lock_interruptible(&etnaviv_obj->resv->lock,
> -					&submit->ticket);
> +							  ticket);
>  			if (ret == -EALREADY)
>  				DRM_ERROR("BO at index %u already on submit list\n",
>  					  i);
> @@ -132,7 +131,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit)
>  		}
>  	}
>  
> -	ww_acquire_done(&submit->ticket);
> +	ww_acquire_done(ticket);
>  
>  	return 0;
>  
> @@ -150,7 +149,7 @@ static int submit_lock_objects(struct etnaviv_gem_submit *submit)
>  
>  		/* we lost out in a seqno race, lock and retry.. */
>  		ret = ww_mutex_lock_slow_interruptible(&etnaviv_obj->resv->lock,
> -				&submit->ticket);
> +						       ticket);
>  		if (!ret) {
>  			submit->bos[contended].flags |= BO_LOCKED;
>  			slow_locked = contended;
> @@ -361,7 +360,6 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
>  		drm_gem_object_put_unlocked(&etnaviv_obj->base);
>  	}
>  
> -	ww_acquire_fini(&submit->ticket);
>  	if (submit->in_fence)
>  		dma_fence_put(submit->in_fence);
>  	if (submit->out_fence)
> @@ -381,6 +379,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
>  	struct etnaviv_cmdbuf *cmdbuf;
>  	struct etnaviv_gpu *gpu;
>  	struct sync_file *sync_file = NULL;
> +	struct ww_acquire_ctx ticket;
>  	int out_fence_fd = -1;
>  	void *stream;
>  	int ret;
> @@ -466,10 +465,12 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
>  		}
>  	}
>  
> +	ww_acquire_init(&ticket, &reservation_ww_class);
> +
>  	submit = submit_create(dev, gpu, args->nr_bos);
>  	if (!submit) {
>  		ret = -ENOMEM;
> -		goto err_submit_cmds;
> +		goto err_submit_ww_acquire;
>  	}
>  
>  	submit->flags = args->flags;
> @@ -478,7 +479,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
>  	if (ret)
>  		goto err_submit_objects;
>  
> -	ret = submit_lock_objects(submit);
> +	ret = submit_lock_objects(submit, &ticket);
>  	if (ret)
>  		goto err_submit_objects;
>  
> @@ -545,6 +546,9 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
>  err_submit_objects:
>  	submit_cleanup(submit);
>  
> +err_submit_ww_acquire:
> +	ww_acquire_fini(&ticket);
> +
>  err_submit_cmds:
>  	if (ret && (out_fence_fd >= 0))
>  		put_unused_fd(out_fence_fd);


More information about the dri-devel mailing list