[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20181206014103.1364-1-jglisse@redhat.com>
Date: Wed, 5 Dec 2018 20:41:03 -0500
From: jglisse@...hat.com
To: linux-kernel@...r.kernel.org
Cc: Jérôme Glisse <jglisse@...hat.com>,
Christian König <christian.koenig@....com>,
Daniel Vetter <daniel.vetter@...ll.ch>,
Sumit Semwal <sumit.semwal@...aro.org>,
linux-media@...r.kernel.org, dri-devel@...ts.freedesktop.org,
linaro-mm-sig@...ts.linaro.org,
Stéphane Marchesin <marcheu@...omium.org>,
stable@...r.kernel.org
Subject: [PATCH] dma-buf: fix debugfs versus rcu and fence dumping
From: Jérôme Glisse <jglisse@...hat.com>
The debugfs take reference on fence without dropping them. Also the
rcu section are not well balance. Fix all that ...
Signed-off-by: Jérôme Glisse <jglisse@...hat.com>
Cc: Christian König <christian.koenig@....com>
Cc: Daniel Vetter <daniel.vetter@...ll.ch>
Cc: Sumit Semwal <sumit.semwal@...aro.org>
Cc: linux-media@...r.kernel.org
Cc: dri-devel@...ts.freedesktop.org
Cc: linaro-mm-sig@...ts.linaro.org
Cc: Stéphane Marchesin <marcheu@...omium.org>
Cc: stable@...r.kernel.org
---
drivers/dma-buf/dma-buf.c | 11 +++++++++--
1 file changed, 9 insertions(+), 2 deletions(-)
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c
index 13884474d158..f6f4de42ac49 100644
--- a/drivers/dma-buf/dma-buf.c
+++ b/drivers/dma-buf/dma-buf.c
@@ -1051,24 +1051,31 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused)
fobj = rcu_dereference(robj->fence);
shared_count = fobj ? fobj->shared_count : 0;
fence = rcu_dereference(robj->fence_excl);
+ fence = dma_fence_get_rcu(fence);
if (!read_seqcount_retry(&robj->seq, seq))
break;
rcu_read_unlock();
}
-
- if (fence)
+ if (fence) {
seq_printf(s, "\tExclusive fence: %s %s %ssignalled\n",
fence->ops->get_driver_name(fence),
fence->ops->get_timeline_name(fence),
dma_fence_is_signaled(fence) ? "" : "un");
+ dma_fence_put(fence);
+ }
+
+ rcu_read_lock();
for (i = 0; i < shared_count; i++) {
fence = rcu_dereference(fobj->shared[i]);
if (!dma_fence_get_rcu(fence))
continue;
+ rcu_read_unlock();
seq_printf(s, "\tShared fence: %s %s %ssignalled\n",
fence->ops->get_driver_name(fence),
fence->ops->get_timeline_name(fence),
dma_fence_is_signaled(fence) ? "" : "un");
+ dma_fence_put(fence);
+ rcu_read_lock();
}
rcu_read_unlock();
--
2.17.2
Powered by blists - more mailing lists