Message ID | 20181206154704.5366-1-jglisse@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | dma-buf: fix debugfs versus rcu and fence dumping v2 | expand |
Quoting jglisse@redhat.com (2018-12-06 15:47:04) > From: Jérôme Glisse <jglisse@redhat.com> > > The debugfs take reference on fence without dropping them. Also the > rcu section are not well balance. Fix all that ... Wouldn't the code be a lot simpler (and a consistent snapshot) if it used reservation_object_get_fences_rcu()? -Chris
Am 06.12.18 um 17:58 schrieb Chris Wilson: > Quoting jglisse@redhat.com (2018-12-06 15:47:04) >> From: Jérôme Glisse <jglisse@redhat.com> >> >> The debugfs take reference on fence without dropping them. Also the >> rcu section are not well balance. Fix all that ... > Wouldn't the code be a lot simpler (and a consistent snapshot) if it used > reservation_object_get_fences_rcu()? Yeah, thought about that as well. Or even better move that code into reservation_object.c as reservation_object_show_fences() or something like that. Christian. > -Chris
Hi, [This is an automated email] This commit has been processed because it contains a -stable tag. The stable tag indicates that it's relevant for the following trees: all The bot has tested the following trees: v4.19.7, v4.14.86, v4.9.143, v4.4.166, v3.18.128, v4.19.7: Build OK! v4.14.86: Build OK! v4.9.143: Failed to apply! Possible dependencies: 5eb2c72c8acc ("dma-buf: fence debugging") v4.4.166: Failed to apply! Possible dependencies: 5eb2c72c8acc ("dma-buf: fence debugging") v3.18.128: Failed to apply! Possible dependencies: 5eb2c72c8acc ("dma-buf: fence debugging") How should we proceed with this patch? -- Thanks, Sasha
diff --git a/drivers/dma-buf/dma-buf.c b/drivers/dma-buf/dma-buf.c index 13884474d158..9688d99894d6 100644 --- a/drivers/dma-buf/dma-buf.c +++ b/drivers/dma-buf/dma-buf.c @@ -1048,27 +1048,38 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused) while (true) { seq = read_seqcount_begin(&robj->seq); rcu_read_lock(); - 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"); - for (i = 0; i < shared_count; i++) { + dma_fence_put(fence); + } + + rcu_read_lock(); + fobj = rcu_dereference(robj->fence); + shared_count = fobj ? fobj->shared_count : 0; + for (i = 0, fence = NULL; 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(); + fobj = rcu_dereference(robj->fence); + shared_count = fobj ? fobj->shared_count : 0; } rcu_read_unlock();