summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2015-10-21 13:58:17 +0300
committerAlex Deucher <alexander.deucher@amd.com>2015-10-30 08:47:27 +0300
commit6c455ac17bcf4beae6c094a1007b976b60b4bb57 (patch)
tree61986caaccbc9aca6cf3cedd715ed42b88a31223 /include
parenta519435a96597d8cd96123246fea4ae5a6c90b02 (diff)
downloadlinux-6c455ac17bcf4beae6c094a1007b976b60b4bb57.tar.xz
dma-buf/fence: add fence_is_later()
Return true when fence 1 is later than fence 2 without checking if any of them are signaled. Useful for driver specific resource handling based on fences. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'include')
-rw-r--r--include/linux/fence.h22
1 files changed, 19 insertions, 3 deletions
diff --git a/include/linux/fence.h b/include/linux/fence.h
index a4084d6bb851..bb522011383b 100644
--- a/include/linux/fence.h
+++ b/include/linux/fence.h
@@ -280,6 +280,22 @@ fence_is_signaled(struct fence *fence)
}
/**
+ * fence_is_later - return if f1 is chronologically later than f2
+ * @f1: [in] the first fence from the same context
+ * @f2: [in] the second fence from the same context
+ *
+ * Returns true if f1 is chronologically later than f2. Both fences must be
+ * from the same context, since a seqno is not re-used across contexts.
+ */
+static inline bool fence_is_later(struct fence *f1, struct fence *f2)
+{
+ if (WARN_ON(f1->context != f2->context))
+ return false;
+
+ return f1->seqno - f2->seqno < INT_MAX;
+}
+
+/**
* fence_later - return the chronologically later fence
* @f1: [in] the first fence from the same context
* @f2: [in] the second fence from the same context
@@ -298,10 +314,10 @@ static inline struct fence *fence_later(struct fence *f1, struct fence *f2)
* set if enable_signaling wasn't called, and enabling that here is
* overkill.
*/
- if (f2->seqno - f1->seqno <= INT_MAX)
- return fence_is_signaled(f2) ? NULL : f2;
- else
+ if (fence_is_later(f1, f2))
return fence_is_signaled(f1) ? NULL : f1;
+ else
+ return fence_is_signaled(f2) ? NULL : f2;
}
signed long fence_wait_timeout(struct fence *, bool intr, signed long timeout);