dma-buf: fix check in dma_resv_add_fence
authorChristian König <christian.koenig@amd.com>
Tue, 14 Nov 2023 12:37:09 +0000 (13:37 +0100)
committerChristian König <christian.koenig@amd.com>
Mon, 27 Nov 2023 19:00:47 +0000 (20:00 +0100)
It's valid to add the same fence multiple times to a dma-resv object and
we shouldn't need one extra slot for each.

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Fixes: a3f7c10a269d5 ("dma-buf/dma-resv: check if the new fence is really later")
Cc: stable@vger.kernel.org # v5.19+
Link: https://patchwork.freedesktop.org/patch/msgid/20231115093035.1889-1-christian.koenig@amd.com
drivers/dma-buf/dma-resv.c
include/linux/dma-fence.h

index 38b4110378de05a00a070746688ce0427234f49f..eb8b733065b24d64de661fd5f0781766f1a6bfa2 100644 (file)
@@ -301,7 +301,7 @@ void dma_resv_add_fence(struct dma_resv *obj, struct dma_fence *fence,
 
                dma_resv_list_entry(fobj, i, obj, &old, &old_usage);
                if ((old->context == fence->context && old_usage >= usage &&
-                    dma_fence_is_later(fence, old)) ||
+                    dma_fence_is_later_or_same(fence, old)) ||
                    dma_fence_is_signaled(old)) {
                        dma_resv_list_set(fobj, i, fence, usage);
                        dma_fence_put(old);
index ebe78bd3d121dd82e795824b6a9e00b770049e77..b3772edca2e6e0ac742e5d41bd9b2fad6fba1647 100644 (file)
@@ -498,6 +498,21 @@ static inline bool dma_fence_is_later(struct dma_fence *f1,
        return __dma_fence_is_later(f1->seqno, f2->seqno, f1->ops);
 }
 
+/**
+ * dma_fence_is_later_or_same - return true if f1 is later or same as f2
+ * @f1: the first fence from the same context
+ * @f2: the second fence from the same context
+ *
+ * Returns true if f1 is chronologically later than f2 or the same fence. Both
+ * fences must be from the same context, since a seqno is not re-used across
+ * contexts.
+ */
+static inline bool dma_fence_is_later_or_same(struct dma_fence *f1,
+                                             struct dma_fence *f2)
+{
+       return f1 == f2 || dma_fence_is_later(f1, f2);
+}
+
 /**
  * dma_fence_later - return the chronologically later fence
  * @f1:        the first fence from the same context