[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