[PATCH 1/2] dma-buf: return index of the first signaled fence (v2)

Christian König deathsimple at vodafone.de
Sat Nov 5 12:22:20 UTC 2016


Am 04.11.2016 um 21:16 schrieb Alex Deucher:
> From: "monk.liu" <monk.liu at amd.com>
>
> 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 at amd.com>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> Cc: Sumit Semwal <sumit.semwal at linaro.org>

Both patches are Reviewed-by: Christian König <christian.koenig at amd.com>.

> ---
>
> This is the same patch set I send out yesterday, I just
> squashed the amdgpu patches together and rebased everything on
> the fence -> dma_fence renaming.  This is used by our VK driver
> and we are planning to use it in mesa as well.
>
> drivers/dma-buf/dma-fence.c | 20 +++++++++++++++-----
>   include/linux/dma-fence.h   |  2 +-
>   2 files changed, 16 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 9ef3c2f..dd00990 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -402,14 +402,18 @@ dma_fence_default_wait(struct dma_fence *fence, bool intr, signed long timeout)
>   EXPORT_SYMBOL(dma_fence_default_wait);
>   
>   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;
>   
>   	for (i = 0; i < count; ++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 false;
>   }
> @@ -421,6 +425,7 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count)
>    * @count:	[in]	number of fences to wait on
>    * @intr:	[in]	if true, do an interruptible wait
>    * @timeout:	[in]	timeout value in jiffies, or MAX_SCHEDULE_TIMEOUT
> + * @idx:       [out]   the first signaled fence index, meaninful only on Returns positive
>    *
>    * Returns -EINVAL on custom fence wait implementation, -ERESTARTSYS if
>    * interrupted, 0 if the wait timed out, or the remaining timeout in jiffies
> @@ -432,7 +437,7 @@ dma_fence_test_signaled_any(struct dma_fence **fences, uint32_t count)
>    */
>   signed long
>   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;
>   	signed long ret = timeout;
> @@ -443,8 +448,11 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
>   
>   	if (timeout == 0) {
>   		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 0;
>   	}
> @@ -467,6 +475,8 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
>   		if (dma_fence_add_callback(fence, &cb[i].base,
>   					   dma_fence_default_wait_cb)) {
>   			/* This fence is already signaled */
> +			if (idx)
> +				*idx = i;
>   			goto fence_rm_cb;
>   		}
>   	}
> @@ -477,7 +487,7 @@ dma_fence_wait_any_timeout(struct dma_fence **fences, uint32_t count,
>   		else
>   			set_current_state(TASK_UNINTERRUPTIBLE);
>   
> -		if (dma_fence_test_signaled_any(fences, count))
> +		if (dma_fence_test_signaled_any(fences, count, idx))
>   			break;
>   
>   		ret = schedule_timeout(ret);
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index ba60c04..e578fe7 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -382,7 +382,7 @@ signed long dma_fence_wait_timeout(struct dma_fence *,
>   				   bool intr, signed long timeout);
>   signed long 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);
>   
>   /**
>    * dma_fence_wait - sleep until the fence gets signaled




More information about the dri-devel mailing list