drm/etnaviv: return GPU fence through the submit structure
authorLucas Stach <l.stach@pengutronix.de>
Wed, 22 Mar 2017 12:00:53 +0000 (13:00 +0100)
committerLucas Stach <l.stach@pengutronix.de>
Wed, 29 Mar 2017 14:19:01 +0000 (16:19 +0200)
The next patch will need the complete dma_fence, instead of just the seqno,
to create the sync_file in etnaviv_ioctl_gem_submit, in case an
out_fence_fd is requested.

The submit needs to hold a reference to the dma_fence, to avoid raceing
with the GPU completing the fence.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
Tested-by: Philipp Zabel <p.zabel@pengutronix.de>
---
New patch in v3.

drivers/gpu/drm/etnaviv/etnaviv_gem.h
drivers/gpu/drm/etnaviv/etnaviv_gem_submit.c
drivers/gpu/drm/etnaviv/etnaviv_gpu.c

index 120410d..c4a091e 100644 (file)
@@ -20,6 +20,7 @@
 #include <linux/reservation.h>
 #include "etnaviv_drv.h"
 
+struct dma_fence;
 struct etnaviv_gem_ops;
 struct etnaviv_gem_object;
 
@@ -104,7 +105,7 @@ struct etnaviv_gem_submit {
        struct drm_device *dev;
        struct etnaviv_gpu *gpu;
        struct ww_acquire_ctx ticket;
-       u32 fence;
+       struct dma_fence *fence;
        unsigned int nr_bos;
        struct etnaviv_gem_submit_bo bos[0];
        u32 flags;
index fb8d5be..1b6f9b8 100644 (file)
@@ -294,6 +294,7 @@ static void submit_cleanup(struct etnaviv_gem_submit *submit)
        }
 
        ww_acquire_fini(&submit->ticket);
+       dma_fence_put(submit->fence);
        kfree(submit);
 }
 
@@ -435,7 +436,7 @@ int etnaviv_ioctl_gem_submit(struct drm_device *dev, void *data,
        if (ret == 0)
                cmdbuf = NULL;
 
-       args->fence = submit->fence;
+       args->fence = submit->fence->seqno;
 
 out:
        submit_unpin_objects(submit);
index 68a4f59..bafbcb4 100644 (file)
@@ -1337,8 +1337,8 @@ int etnaviv_gpu_submit(struct etnaviv_gpu *gpu,
        mutex_lock(&gpu->lock);
 
        gpu->event[event].fence = fence;
-       submit->fence = fence->seqno;
-       gpu->active_fence = submit->fence;
+       submit->fence = dma_fence_get(fence);
+       gpu->active_fence = submit->fence->seqno;
 
        if (gpu->lastctx != cmdbuf->ctx) {
                gpu->mmu->need_flush = true;