lkml.org 
[lkml]   [2020]   [Feb]   [23]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
Subject[PATCH] dma-buf: Fix missing excl fence waiting
Date
If shared fence list is not empty, even we want to test all fences, excl fence is ignored.
That is abviously wrong, so fix it.

Signed-off-by: xinhui pan <xinhui.pan@amd.com>
---
drivers/dma-buf/dma-resv.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/drivers/dma-buf/dma-resv.c b/drivers/dma-buf/dma-resv.c
index 4264e64788c4..44dc64c547c6 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -632,14 +632,14 @@ static inline int dma_resv_test_signaled_single(struct dma_fence *passed_fence)
*/
bool dma_resv_test_signaled_rcu(struct dma_resv *obj, bool test_all)
{
- unsigned seq, shared_count;
+ unsigned int seq, shared_count, left;
int ret;

rcu_read_lock();
retry:
ret = true;
shared_count = 0;
- seq = read_seqcount_begin(&obj->seq);
+ left = seq = read_seqcount_begin(&obj->seq);

if (test_all) {
unsigned i;
@@ -647,7 +647,7 @@ bool dma_resv_test_signaled_rcu(struct dma_resv *obj, bool test_all)
struct dma_resv_list *fobj = rcu_dereference(obj->fence);

if (fobj)
- shared_count = fobj->shared_count;
+ left = shared_count = fobj->shared_count;

for (i = 0; i < shared_count; ++i) {
struct dma_fence *fence = rcu_dereference(fobj->shared[i]);
@@ -657,13 +657,14 @@ bool dma_resv_test_signaled_rcu(struct dma_resv *obj, bool test_all)
goto retry;
else if (!ret)
break;
+ left--;
}

if (read_seqcount_retry(&obj->seq, seq))
goto retry;
}

- if (!shared_count) {
+ if (!left) {
struct dma_fence *fence_excl = rcu_dereference(obj->fence_excl);

if (fence_excl) {
--
2.21.0 (Apple Git-122)

\
 
 \ /
  Last update: 2020-02-23 12:56    [W:0.086 / U:3.376 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site