forked from luck/tmp_suning_uos_patched
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: monk.liu <monk.liu@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com> Cc: Sumit Semwal <sumit.semwal@linaro.org> Signed-off-by: Sumit 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
This commit is contained in:
parent
c5ec903d8e
commit
7392b4bb70
|
@ -403,14 +403,18 @@ 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)
|
||||||
* @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)
|
||||||
*/
|
*/
|
||||||
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,
|
||||||
|
|
||||||
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,
|
||||||
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,
|
||||||
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 *,
|
||||||
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
|
||||||
|
|
Loading…
Reference in New Issue
Block a user