mirror of
https://github.com/torvalds/linux.git
synced 2024-12-20 10:01:56 +00:00
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>
This commit is contained in:
parent
9efabd7392
commit
33a63e68f6
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user