[PATCH 18/27] drm/etnaviv: move object unpinning to submit cleanup
Philipp Zabel
p.zabel at pengutronix.de
Mon Dec 11 09:23:28 UTC 2017
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 at pengutronix.de>
Reviewed-by: Philipp Zabel <p.zabel at 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);
>
More information about the dri-devel
mailing list