diff options
author | Lucas Stach <l.stach@pengutronix.de> | 2017-11-23 18:13:40 +0100 |
---|---|---|
committer | Lucas Stach <l.stach@pengutronix.de> | 2018-01-02 17:29:55 +0100 |
commit | 33a63e68f62bef6981fae781090d480080a73570 (patch) | |
tree | e19b116e878e68249167eaa4103c9ac744c00189 /drivers/gpu | |
parent | 9efabd7392f0b42bd872a0e650759e9f1ef43db2 (diff) |
drm/etnaviv: move object unpinning to submit cleanup
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>
Diffstat (limited to 'drivers/gpu')
-rw-r--r-- | drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c | 33 |
1 files 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); |