Message ID | 20171201103624.6565-19-l.stach@pengutronix.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On Fri, 2017-12-01 at 11:36 +0100, Lucas Stach wrote: > This is safe to call in all paths, as the BO_PINNED flag tells us if the BO > needs unpinning. > > Signed-off-by: Lucas Stach <l.stach@pengutronix.de> Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de> regards Philipp > --- > drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 33 ++++++++++------------------ > 1 file changed, 12 insertions(+), 21 deletions(-) > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > index 20906c22998c..9b5541207d33 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c > @@ -207,19 +207,6 @@ static void submit_attach_object_fences(struct etnaviv_gem_submit *submit) > } > } > > -static void submit_unpin_objects(struct etnaviv_gem_submit *submit) > -{ > - int i; > - > - for (i = 0; i < submit->nr_bos; i++) { > - if (submit->bos[i].flags & BO_PINNED) > - etnaviv_gem_mapping_unreference(submit->bos[i].mapping); > - > - submit->bos[i].mapping = NULL; > - submit->bos[i].flags &= ~BO_PINNED; > - } > -} > - > static int submit_pin_objects(struct etnaviv_gem_submit *submit) > { > int i, ret = 0; > @@ -362,6 +349,13 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit) > for (i = 0; i < submit->nr_bos; i++) { > struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; > > + /* unpin all objects */ > + if (submit->bos[i].flags & BO_PINNED) { > + etnaviv_gem_mapping_unreference(submit->bos[i].mapping); > + submit->bos[i].mapping = NULL; > + submit->bos[i].flags &= ~BO_PINNED; > + } > + > /* if the GPU submit failed, objects might still be locked */ > submit_unlock_object(submit, i); > drm_gem_object_put_unlocked(&etnaviv_obj->base); > @@ -508,23 +502,23 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, > > ret = submit_pin_objects(submit); > if (ret) > - goto out; > + goto err_submit_objects; > > ret = submit_reloc(submit, stream, args->stream_size / 4, > relocs, args->nr_relocs); > if (ret) > - goto out; > + goto err_submit_objects; > > ret = submit_perfmon_validate(submit, cmdbuf, pmrs, args->nr_pmrs); > if (ret) > - goto out; > + goto err_submit_objects; > > memcpy(cmdbuf->vaddr, stream, args->stream_size); > cmdbuf->user_size = ALIGN(args->stream_size, 8); > > ret = etnaviv_gpu_submit(gpu, submit, cmdbuf); > if (ret) > - goto out; > + goto err_submit_objects; > > submit_attach_object_fences(submit); > > @@ -540,7 +534,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, > sync_file = sync_file_create(submit->out_fence); > if (!sync_file) { > ret = -ENOMEM; > - goto out; > + goto err_submit_objects; > } > fd_install(out_fence_fd, sync_file->file); > } > @@ -548,9 +542,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, > args->fence_fd = out_fence_fd; > args->fence = submit->out_fence->seqno; > > -out: > - submit_unpin_objects(submit); > - > err_submit_objects: > submit_cleanup(submit); >
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c index 20906c22998c..9b5541207d33 100644 --- a/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c +++ b/drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c @@ -207,19 +207,6 @@ static void submit_attach_object_fences(struct etnaviv_gem_submit *submit) } } -static void submit_unpin_objects(struct etnaviv_gem_submit *submit) -{ - int i; - - for (i = 0; i < submit->nr_bos; i++) { - if (submit->bos[i].flags & BO_PINNED) - etnaviv_gem_mapping_unreference(submit->bos[i].mapping); - - submit->bos[i].mapping = NULL; - submit->bos[i].flags &= ~BO_PINNED; - } -} - static int submit_pin_objects(struct etnaviv_gem_submit *submit) { int i, ret = 0; @@ -362,6 +349,13 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit) for (i = 0; i < submit->nr_bos; i++) { struct etnaviv_gem_object *etnaviv_obj = submit->bos[i].obj; + /* unpin all objects */ + if (submit->bos[i].flags & BO_PINNED) { + etnaviv_gem_mapping_unreference(submit->bos[i].mapping); + submit->bos[i].mapping = NULL; + submit->bos[i].flags &= ~BO_PINNED; + } + /* if the GPU submit failed, objects might still be locked */ submit_unlock_object(submit, i); drm_gem_object_put_unlocked(&etnaviv_obj->base); @@ -508,23 +502,23 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, ret = submit_pin_objects(submit); if (ret) - goto out; + goto err_submit_objects; ret = submit_reloc(submit, stream, args->stream_size / 4, relocs, args->nr_relocs); if (ret) - goto out; + goto err_submit_objects; ret = submit_perfmon_validate(submit, cmdbuf, pmrs, args->nr_pmrs); if (ret) - goto out; + goto err_submit_objects; memcpy(cmdbuf->vaddr, stream, args->stream_size); cmdbuf->user_size = ALIGN(args->stream_size, 8); ret = etnaviv_gpu_submit(gpu, submit, cmdbuf); if (ret) - goto out; + goto err_submit_objects; submit_attach_object_fences(submit); @@ -540,7 +534,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, sync_file = sync_file_create(submit->out_fence); if (!sync_file) { ret = -ENOMEM; - goto out; + goto err_submit_objects; } fd_install(out_fence_fd, sync_file->file); } @@ -548,9 +542,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, args->fence_fd = out_fence_fd; args->fence = submit->out_fence->seqno; -out: - submit_unpin_objects(submit); - err_submit_objects: submit_cleanup(submit);
This is safe to call in all paths, as the BO_PINNED flag tells us if the BO needs unpinning. Signed-off-by: Lucas Stach <l.stach@pengutronix.de> --- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 33 ++++++++++------------------ 1 file changed, 12 insertions(+), 21 deletions(-)