Commit 9efabd73 authored by Lucas Stach's avatar Lucas Stach

drm/etnaviv: attach in fence to submit and move fence wait to fence_sync

Simplifies the cleanup path and moves fence waiting to a central location.
Signed-off-by: default avatarLucas Stach <l.stach@pengutronix.de>
Reviewed-by: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
parent 10009ea2
...@@ -103,7 +103,7 @@ struct etnaviv_gem_submit_bo { ...@@ -103,7 +103,7 @@ struct etnaviv_gem_submit_bo {
struct etnaviv_gem_submit { struct etnaviv_gem_submit {
struct etnaviv_gpu *gpu; struct etnaviv_gpu *gpu;
struct ww_acquire_ctx ticket; struct ww_acquire_ctx ticket;
struct dma_fence *out_fence; struct dma_fence *out_fence, *in_fence;
u32 flags; u32 flags;
unsigned int nr_bos; unsigned int nr_bos;
struct etnaviv_gem_submit_bo bos[0]; struct etnaviv_gem_submit_bo bos[0];
......
...@@ -177,6 +177,15 @@ static int submit_fence_sync(const struct etnaviv_gem_submit *submit) ...@@ -177,6 +177,15 @@ static int submit_fence_sync(const struct etnaviv_gem_submit *submit)
break; break;
} }
if (submit->flags & ETNA_SUBMIT_FENCE_FD_IN) {
/*
* Wait if the fence is from a foreign context, or if the fence
* array contains any fence from a foreign context.
*/
if (!dma_fence_match_context(submit->in_fence, context))
ret = dma_fence_wait(submit->in_fence, true);
}
return ret; return ret;
} }
...@@ -359,6 +368,8 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit) ...@@ -359,6 +368,8 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
} }
ww_acquire_fini(&submit->ticket); ww_acquire_fini(&submit->ticket);
if (submit->in_fence)
dma_fence_put(submit->in_fence);
if (submit->out_fence) if (submit->out_fence)
dma_fence_put(submit->out_fence); dma_fence_put(submit->out_fence);
kfree(submit); kfree(submit);
...@@ -375,7 +386,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -375,7 +386,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
struct etnaviv_gem_submit *submit; struct etnaviv_gem_submit *submit;
struct etnaviv_cmdbuf *cmdbuf; struct etnaviv_cmdbuf *cmdbuf;
struct etnaviv_gpu *gpu; struct etnaviv_gpu *gpu;
struct dma_fence *in_fence = NULL;
struct sync_file *sync_file = NULL; struct sync_file *sync_file = NULL;
int out_fence_fd = -1; int out_fence_fd = -1;
void *stream; void *stream;
...@@ -485,21 +495,11 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -485,21 +495,11 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
} }
if (args->flags & ETNA_SUBMIT_FENCE_FD_IN) { if (args->flags & ETNA_SUBMIT_FENCE_FD_IN) {
in_fence = sync_file_get_fence(args->fence_fd); submit->in_fence = sync_file_get_fence(args->fence_fd);
if (!in_fence) { if (!submit->in_fence) {
ret = -EINVAL; ret = -EINVAL;
goto err_submit_objects; goto err_submit_objects;
} }
/*
* Wait if the fence is from a foreign context, or if the fence
* array contains any fence from a foreign context.
*/
if (!dma_fence_match_context(in_fence, gpu->fence_context)) {
ret = dma_fence_wait(in_fence, true);
if (ret)
goto err_submit_objects;
}
} }
ret = submit_fence_sync(submit); ret = submit_fence_sync(submit);
...@@ -552,8 +552,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data, ...@@ -552,8 +552,6 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
submit_unpin_objects(submit); submit_unpin_objects(submit);
err_submit_objects: err_submit_objects:
if (in_fence)
dma_fence_put(in_fence);
submit_cleanup(submit); submit_cleanup(submit);
err_submit_cmds: err_submit_cmds:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment