diff options
author | Christian König <christian.koenig@amd.com> | 2015-10-21 13:58:17 +0300 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2015-10-30 08:47:27 +0300 |
commit | 6c455ac17bcf4beae6c094a1007b976b60b4bb57 (patch) | |
tree | 61986caaccbc9aca6cf3cedd715ed42b88a31223 /include/linux/fence.h | |
parent | a519435a96597d8cd96123246fea4ae5a6c90b02 (diff) | |
download | linux-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/linux/fence.h')
-rw-r--r-- | include/linux/fence.h | 22 |
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); |