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@xxxxxxxxxxxxxx> Reviewed-by: Philipp Zabel <p.zabel@xxxxxxxxxxxxxx> 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@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel