[PATCH 1/3] dma-buf: add dma_fence_get_stub

Chunming Zhou zhoucm1 at amd.com
Mon Dec 3 13:33:58 UTC 2018


The series is Reviewed-by: Chunming Zhou <david1.zhou at amd.com>

for patch#2, please remove my Signed-off-by, it's new when using stub 
from dma-fence.


-David


在 2018/12/3 21:07, Christian König 写道:
> Extract of useful code from the timeline work. This provides a function
> to return a stub or dummy fence which is always signaled.
>
> Signed-off-by: Christian König <christian.koenig at amd.com>
> ---
>   drivers/dma-buf/dma-fence.c | 36 +++++++++++++++++++++++++++++++++++-
>   include/linux/dma-fence.h   |  1 +
>   2 files changed, 36 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 1551ca7df394..136ec04d683f 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -30,13 +30,16 @@
>   EXPORT_TRACEPOINT_SYMBOL(dma_fence_emit);
>   EXPORT_TRACEPOINT_SYMBOL(dma_fence_enable_signal);
>   
> +static DEFINE_SPINLOCK(dma_fence_stub_lock);
> +static struct dma_fence dma_fence_stub;
> +
>   /*
>    * fence context counter: each execution context should have its own
>    * fence context, this allows checking if fences belong to the same
>    * context or not. One device can have multiple separate contexts,
>    * and they're used if some engine can run independently of another.
>    */
> -static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
> +static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(1);
>   
>   /**
>    * DOC: DMA fences overview
> @@ -68,6 +71,37 @@ static atomic64_t dma_fence_context_counter = ATOMIC64_INIT(0);
>    *   &dma_buf.resv pointer.
>    */
>   
> +static const char *dma_fence_stub_get_name(struct dma_fence *fence)
> +{
> +        return "stub";
> +}
> +
> +static const struct dma_fence_ops dma_fence_stub_ops = {
> +	.get_driver_name = dma_fence_stub_get_name,
> +	.get_timeline_name = dma_fence_stub_get_name,
> +};
> +
> +/**
> + * dma_fence_get_stub - return a signaled fence
> + *
> + * Return a stub fence which is already signaled.
> + */
> +struct dma_fence *dma_fence_get_stub(void)
> +{
> +	spin_lock(&dma_fence_stub_lock);
> +	if (!dma_fence_stub.ops) {
> +		dma_fence_init(&dma_fence_stub,
> +			       &dma_fence_stub_ops,
> +			       &dma_fence_stub_lock,
> +			       0, 0);
> +		dma_fence_signal_locked(&dma_fence_stub);
> +	}
> +	spin_unlock(&dma_fence_stub_lock);
> +
> +	return dma_fence_get(&dma_fence_stub);
> +}
> +EXPORT_SYMBOL(dma_fence_get_stub);
> +
>   /**
>    * dma_fence_context_alloc - allocate an array of fence contexts
>    * @num: amount of contexts to allocate
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index 02dba8cd033d..999e4b104410 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -541,6 +541,7 @@ static inline signed long dma_fence_wait(struct dma_fence *fence, bool intr)
>   	return ret < 0 ? ret : 0;
>   }
>   
> +struct dma_fence *dma_fence_get_stub(void);
>   u64 dma_fence_context_alloc(unsigned num);
>   
>   #define DMA_FENCE_TRACE(f, fmt, args...) \



More information about the dri-devel mailing list