Re: [PATCH] dma-buf: keep the signaling time of merged fences

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Alex, Luben or somebody else at least a bit familiar with that, can I get a quick rb or acked-by?

This is an important bug fix for Android CTS.

Thanks,
Christian.

Am 21.06.23 um 09:32 schrieb Christian König:
Some Android CTS is testing for that.

Signed-off-by: Christian König <christian.koenig@xxxxxxx>
CC: stable@xxxxxxxxxxxxxxx
---
  drivers/dma-buf/dma-fence-unwrap.c | 11 +++++++++--
  drivers/dma-buf/dma-fence.c        |  5 +++--
  drivers/gpu/drm/drm_syncobj.c      |  2 +-
  include/linux/dma-fence.h          |  2 +-
  4 files changed, 14 insertions(+), 6 deletions(-)

diff --git a/drivers/dma-buf/dma-fence-unwrap.c b/drivers/dma-buf/dma-fence-unwrap.c
index 7002bca792ff..06eb91306c01 100644
--- a/drivers/dma-buf/dma-fence-unwrap.c
+++ b/drivers/dma-buf/dma-fence-unwrap.c
@@ -66,18 +66,25 @@ struct dma_fence *__dma_fence_unwrap_merge(unsigned int num_fences,
  {
  	struct dma_fence_array *result;
  	struct dma_fence *tmp, **array;
+	ktime_t timestamp;
  	unsigned int i;
  	size_t count;
count = 0;
+	timestamp = ns_to_ktime(0);
  	for (i = 0; i < num_fences; ++i) {
-		dma_fence_unwrap_for_each(tmp, &iter[i], fences[i])
+		dma_fence_unwrap_for_each(tmp, &iter[i], fences[i]) {
  			if (!dma_fence_is_signaled(tmp))
  				++count;
+			else if (test_bit(DMA_FENCE_FLAG_TIMESTAMP_BIT,
+					  &tmp->flags) &&
+				 ktime_after(tmp->timestamp, timestamp))
+				timestamp = tmp->timestamp;
+		}
  	}
if (count == 0)
-		return dma_fence_get_stub();
+		return dma_fence_allocate_private_stub(timestamp);
array = kmalloc_array(count, sizeof(*array), GFP_KERNEL);
  	if (!array)
diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
index f177c56269bb..ad076f208760 100644
--- a/drivers/dma-buf/dma-fence.c
+++ b/drivers/dma-buf/dma-fence.c
@@ -150,10 +150,11 @@ EXPORT_SYMBOL(dma_fence_get_stub);
/**
   * dma_fence_allocate_private_stub - return a private, signaled fence
+ * @timestamp: timestamp when the fence was signaled
   *
   * Return a newly allocated and signaled stub fence.
   */
-struct dma_fence *dma_fence_allocate_private_stub(void)
+struct dma_fence *dma_fence_allocate_private_stub(ktime_t timestamp)
  {
  	struct dma_fence *fence;
@@ -169,7 +170,7 @@ struct dma_fence *dma_fence_allocate_private_stub(void)
  	set_bit(DMA_FENCE_FLAG_ENABLE_SIGNAL_BIT,
  		&fence->flags);
- dma_fence_signal(fence);
+	dma_fence_signal_timestamp(fence, timestamp);
return fence;
  }
diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
index 0c2be8360525..04589a35eb09 100644
--- a/drivers/gpu/drm/drm_syncobj.c
+++ b/drivers/gpu/drm/drm_syncobj.c
@@ -353,7 +353,7 @@ EXPORT_SYMBOL(drm_syncobj_replace_fence);
   */
  static int drm_syncobj_assign_null_handle(struct drm_syncobj *syncobj)
  {
-	struct dma_fence *fence = dma_fence_allocate_private_stub();
+	struct dma_fence *fence = dma_fence_allocate_private_stub(ktime_get());
if (IS_ERR(fence))
  		return PTR_ERR(fence);
diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
index d54b595a0fe0..0d678e9a7b24 100644
--- a/include/linux/dma-fence.h
+++ b/include/linux/dma-fence.h
@@ -606,7 +606,7 @@ static inline signed long dma_fence_wait(struct dma_fence *fence, bool intr)
  void dma_fence_set_deadline(struct dma_fence *fence, ktime_t deadline);
struct dma_fence *dma_fence_get_stub(void);
-struct dma_fence *dma_fence_allocate_private_stub(void);
+struct dma_fence *dma_fence_allocate_private_stub(ktime_t timestamp);
  u64 dma_fence_context_alloc(unsigned num);
extern const struct dma_fence_ops dma_fence_array_ops;




[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux