From: Lucas Stach Date: Thu, 23 Nov 2017 18:13:40 +0100 Subject: drm/etnaviv: move object unpinning to submit cleanup Git-commit: 33a63e68f62bef6981fae781090d480080a73570 Patch-mainline: v4.16-rc1 References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166 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 Reviewed-by: Philipp Zabel Acked-by: Petr Tesarik --- drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 33 +++++++++------------------ 1 file changed, 12 insertions(+), 21 deletions(-) --- 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( } } -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 etnavi 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_ 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_ 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_ args->fence_fd = out_fence_fd; args->fence = submit->out_fence->seqno; -out: - submit_unpin_objects(submit); - err_submit_objects: submit_cleanup(submit);