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.st...@pengutronix.de>

Reviewed-by: Philipp Zabel <p.za...@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);
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to