dma-buf: fence debugging
authorRussell King <rmk+kernel@arm.linux.org.uk>
Fri, 31 Mar 2017 10:00:42 +0000 (11:00 +0100)
committerGustavo Padovan <gustavo.padovan@collabora.com>
Fri, 31 Mar 2017 15:52:22 +0000 (17:52 +0200)
Add debugfs output to report shared and exclusive fences on a dma_buf
object.  This produces output such as:

Dma-buf Objects:
size    flags   mode    count   exp_name
08294400        00000000        00000005        00000005        drm
        Exclusive fence: etnaviv 134000.gpu signalled
        Attached Devices:
        gpu-subsystem
Total 1 devices attached

Total 1 objects, 8294400 bytes

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.com>
Link: http://patchwork.freedesktop.org/patch/msgid/E1cttMI-00068z-3X@rmk-PC.armlinux.org.uk
drivers/dma-buf/dma-buf.c

index 0007b792827b7ec16a21351f924522e7344a6c92..ebaf1923ad6b6ca84bac52fe24e807a835b6faa2 100644 (file)
@@ -1059,7 +1059,11 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused)
        int ret;
        struct dma_buf *buf_obj;
        struct dma_buf_attachment *attach_obj;
-       int count = 0, attach_count;
+       struct reservation_object *robj;
+       struct reservation_object_list *fobj;
+       struct dma_fence *fence;
+       unsigned seq;
+       int count = 0, attach_count, shared_count, i;
        size_t size = 0;
 
        ret = mutex_lock_interruptible(&db_list.lock);
@@ -1085,6 +1089,34 @@ static int dma_buf_debug_show(struct seq_file *s, void *unused)
                                file_count(buf_obj->file),
                                buf_obj->exp_name);
 
+               robj = buf_obj->resv;
+               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);
+                       if (!read_seqcount_retry(&robj->seq, seq))
+                               break;
+                       rcu_read_unlock();
+               }
+
+               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++) {
+                       fence = rcu_dereference(fobj->shared[i]);
+                       if (!dma_fence_get_rcu(fence))
+                               continue;
+                       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");
+               }
+               rcu_read_unlock();
+
                seq_puts(s, "\tAttached Devices:\n");
                attach_count = 0;