]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
dma-buf: fix reservation_object_wait_timeout_rcu once more v2
authorChristian König <ckoenig.leichtzumerken@gmail.com>
Mon, 22 Jan 2018 20:00:03 +0000 (21:00 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Tue, 23 Jan 2018 15:46:39 +0000 (10:46 -0500)
We need to set shared_count even if we already have a fence to wait for.

v2: init i to -1 as well

Signed-off-by: Christian König <christian.koenig@amd.com>
Cc: stable@vger.kernel.org
Tested-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Reviewed-by: Chris Wilson <chris@chris-wilson.co.uk>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20180122200003.6665-1-christian.koenig@amd.com
drivers/dma-buf/reservation.c

index b759a569b7b8fd1846e80de9a73aadaa1abeadba..04ebe2204c12abfce20c4666369e5c97be75bf75 100644 (file)
@@ -471,13 +471,15 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj,
                                         unsigned long timeout)
 {
        struct dma_fence *fence;
-       unsigned seq, shared_count, i = 0;
+       unsigned seq, shared_count;
        long ret = timeout ? timeout : 1;
+       int i;
 
 retry:
        shared_count = 0;
        seq = read_seqcount_begin(&obj->seq);
        rcu_read_lock();
+       i = -1;
 
        fence = rcu_dereference(obj->fence_excl);
        if (fence && !test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
@@ -493,14 +495,14 @@ long reservation_object_wait_timeout_rcu(struct reservation_object *obj,
                fence = NULL;
        }
 
-       if (!fence && wait_all) {
+       if (wait_all) {
                struct reservation_object_list *fobj =
                                                rcu_dereference(obj->fence);
 
                if (fobj)
                        shared_count = fobj->shared_count;
 
-               for (i = 0; i < shared_count; ++i) {
+               for (i = 0; !fence && i < shared_count; ++i) {
                        struct dma_fence *lfence = rcu_dereference(fobj->shared[i]);
 
                        if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT,