2020-02-23 12:04:40

by xinhui pan

[permalink] [raw]
Subject: [PATCH V2] dma-buf: Fix missing excl fence waiting

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 <[email protected]>
---
change from v1:
init left correctly
---
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..82e4b4f63bef 100644
--- a/drivers/dma-buf/dma-resv.c
+++ b/drivers/dma-buf/dma-resv.c
@@ -632,13 +632,13 @@ 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;
+ left = shared_count = 0;
seq = read_seqcount_begin(&obj->seq);

if (test_all) {
@@ -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)