drm/etnaviv: move submit free out of critical section
authorLucas Stach <l.stach@pengutronix.de>
Wed, 29 Nov 2017 13:33:57 +0000 (14:33 +0100)
committerLucas Stach <l.stach@pengutronix.de>
Tue, 2 Jan 2018 16:36:28 +0000 (17:36 +0100)
There is no need to hold the GPU lock while freeing the submit
object. Only move the retired submits from the GPU active list to
a temporary retire list under the GPU lock.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
drivers/gpu/drm/etnaviv/etnaviv_gpu.c

index 072384f3637efb16e2cc796ff52b97a577d53e26..21d0d22f11688fbaf7606faa8e7011e6ba82a932 100644 (file)
@@ -1201,20 +1201,22 @@ static void retire_worker(struct work_struct *work)
                                               retire_work);
        u32 fence = gpu->completed_fence;
        struct etnaviv_gem_submit *submit, *tmp;
+       LIST_HEAD(retire_list);
 
        mutex_lock(&gpu->lock);
        list_for_each_entry_safe(submit, tmp, &gpu->active_submit_list, node) {
                if (!dma_fence_is_signaled(submit->out_fence))
                        break;
 
-               list_del(&submit->node);
-
-               etnaviv_submit_put(submit);
+               list_move(&submit->node, &retire_list);
        }
 
        gpu->retired_fence = fence;
 
        mutex_unlock(&gpu->lock);
+
+       list_for_each_entry_safe(submit, tmp, &retire_list, node)
+               etnaviv_submit_put(submit);
 }
 
 int etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu,