Commit 7392b4bb authored by monk.liu's avatar monk.liu Committed by Sumit Semwal

dma-buf: return index of the first signaled fence (v2)

Return the index of the first signaled fence.  This information
is useful in some APIs like Vulkan.

v2: rebase on drm-next (fence -> dma_fence)
Signed-off-by: default avatarmonk.liu <monk.liu@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Cc: Sumit Semwal <sumit.semwal@linaro.org>
Signed-off-by: default avatarSumit Semwal <sumit.semwal@linaro.org>
 [sumits: fix warnings]
Link: http://patchwork.freedesktop.org/patch/msgid/1478290570-30982-1-git-send-email-alexander.deucher@amd.com
parent c5ec903d
...@@ -403,15 +403,19 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout) ...@@ -403,15 +403,19 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
EXPORT_SYMBOL(dma_fence_default_wait); EXPORT_SYMBOL(dma_fence_default_wait);
static bool static bool
dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count) dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count,
uint32_t *idx)
{ {
int i; int i;
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
struct dma_fence *fence = fences[i]; struct dma_fence *fence = fences[i];
if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) if (test_bit(DMA_FENCE_FLAG_SIGNALED_BIT, &fence->flags)) {
if (idx)
*idx = i;
return true; return true;
} }
}
return false; return false;
} }
...@@ -422,6 +426,8 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count) ...@@ -422,6 +426,8 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count)
* @count: [in] number of fences to wait on * @count: [in] number of fences to wait on
* @intr: [in] if true, do an interruptible wait * @intr: [in] if true, do an interruptible wait
* @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT * @timeout: [in] timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
* @idx: [out] the first signaled fence index, meaningful only on
* positive return
* *
* Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if * Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if
* interrupted, 0 if the wait timed out, or the remaining timeout in jiffies * interrupted, 0 if the wait timed out, or the remaining timeout in jiffies
...@@ -433,7 +439,7 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count) ...@@ -433,7 +439,7 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count)
*/ */
signed long signed long
dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count, dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
bool intr, signed long timeout) bool intr, signed long timeout, uint32_t *idx)
{ {
struct default_wait_cb *cb; struct default_wait_cb *cb;
signed long ret = timeout; signed long ret = timeout;
...@@ -444,8 +450,11 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count, ...@@ -444,8 +450,11 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
if (timeout == 0) { if (timeout == 0) {
for (i = 0; i < count; ++i) for (i = 0; i < count; ++i)
if (dma_fence_is_signaled(fences[i])) if (dma_fence_is_signaled(fences[i])) {
if (idx)
*idx = i;
return 1; return 1;
}
return 0; return 0;
} }
...@@ -468,6 +477,8 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count, ...@@ -468,6 +477,8 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
if (dma_fence_add_callback(fence, &cb[i].base, if (dma_fence_add_callback(fence, &cb[i].base,
dma_fence_default_wait_cb)) { dma_fence_default_wait_cb)) {
/* This fence is already signaled */ /* This fence is already signaled */
if (idx)
*idx = i;
goto fence_rm_cb; goto fence_rm_cb;
} }
} }
...@@ -478,7 +489,7 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count, ...@@ -478,7 +489,7 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
else else
set_current_state(TASK_UNINTERRUPTIBLE); set_current_state(TASK_UNINTERRUPTIBLE);
if (dma_fence_test_signaled_any(fences, count)) if (dma_fence_test_signaled_any(fences, count, idx))
break; break;
ret = schedule_timeout(ret); ret = schedule_timeout(ret);
......
...@@ -382,7 +382,8 @@ signed long dma_fence_wait_timeout(struct dma_fence *, ...@@ -382,7 +382,8 @@ signed long dma_fence_wait_timeout(struct dma_fence *,
bool intr, signed long timeout); bool intr, signed long timeout);
signed long dma_fence_wait_any_timeout(struct dma_fence **fences, signed long dma_fence_wait_any_timeout(struct dma_fence **fences,
uint32_t count, uint32_t count,
bool intr, signed long timeout); bool intr, signed long timeout,
uint32_t *idx);
/** /**
* dma_fence_wait - sleep until the fence gets signaled * dma_fence_wait - sleep until the fence gets signaled
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment