dri-devel.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
From: Gustavo Padovan <gustavo@padovan.org>
To: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: devel@driverdev.osuosl.org, daniels@collabora.com,
	"Daniel Vetter" <daniel.vetter@ffwll.ch>,
	"Riley Andrews" <riandrews@android.com>,
	dri-devel@lists.freedesktop.org, linux-kernel@vger.kernel.org,
	"Arve Hjønnevåg" <arve@android.com>,
	"Maarten Lankhorst" <maarten.lankhorst@canonical.com>,
	"Gustavo Padovan" <gustavo.padovan@collabora.co.uk>,
	"John Harrison" <John.C.Harrison@Intel.com>
Subject: [RFC 24/29] dma-buf/fence: add debug to fence timeline
Date: Fri, 15 Jan 2016 12:55:34 -0200	[thread overview]
Message-ID: <1452869739-3304-25-git-send-email-gustavo@padovan.org> (raw)
In-Reply-To: <1452869739-3304-1-git-send-email-gustavo@padovan.org>

From: Gustavo Padovan <gustavo.padovan@collabora.co.uk>

Bring the debug information that belonged to sync_timeline and sync_pt
back.

Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
---
 drivers/dma-buf/Makefile             |   2 +-
 drivers/dma-buf/fence.c              |   4 ++
 drivers/dma-buf/fence_debug.c        | 128 +++++++++++++++++++++++++++++++++++
 drivers/staging/android/sync.h       |   4 --
 drivers/staging/android/sync_debug.c | 105 +---------------------------
 include/linux/fence.h                |  18 +++++
 6 files changed, 154 insertions(+), 107 deletions(-)
 create mode 100644 drivers/dma-buf/fence_debug.c

diff --git a/drivers/dma-buf/Makefile b/drivers/dma-buf/Makefile
index 57a675f..fb03696 100644
--- a/drivers/dma-buf/Makefile
+++ b/drivers/dma-buf/Makefile
@@ -1 +1 @@
-obj-y := dma-buf.o fence.o reservation.o seqno-fence.o
+obj-y := dma-buf.o fence.o fence_debug.o reservation.o seqno-fence.o
diff --git a/drivers/dma-buf/fence.c b/drivers/dma-buf/fence.c
index 0a07fcb..09faf2e 100644
--- a/drivers/dma-buf/fence.c
+++ b/drivers/dma-buf/fence.c
@@ -84,6 +84,8 @@ struct fence_timeline *fence_timeline_create(unsigned num, int size,
 	INIT_LIST_HEAD(&timeline->active_list_head);
 	spin_lock_init(&timeline->lock);
 
+	fence_timeline_debug_add(timeline);
+
 	return timeline;
 }
 EXPORT_SYMBOL(fence_timeline_create);
@@ -100,6 +102,8 @@ static void fence_timeline_free(struct kref *kref)
 	struct fence_timeline *timeline =
 		container_of(kref, struct fence_timeline, kref);
 
+	fence_timeline_debug_remove(timeline);
+
 	kfree(timeline);
 }
 
diff --git a/drivers/dma-buf/fence_debug.c b/drivers/dma-buf/fence_debug.c
new file mode 100644
index 0000000..c7529c6
--- /dev/null
+++ b/drivers/dma-buf/fence_debug.c
@@ -0,0 +1,128 @@
+/*
+ * drivers/dma-buf/fence_debug.c
+ *
+ * Copyright (C) 2012 Google, Inc.
+ *
+ * This software is licensed under the terms of the GNU General Public
+ * License version 2, as published by the Free Software Foundation, and
+ * may be copied, distributed, and modified under those terms.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ */
+
+#include <linux/seq_file.h>
+#include <linux/fence.h>
+
+#ifdef CONFIG_DEBUG_FS
+
+static LIST_HEAD(fence_timeline_list_head);
+static DEFINE_SPINLOCK(fence_timeline_list_lock);
+
+void fence_timeline_debug_add(struct fence_timeline *obj)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&fence_timeline_list_lock, flags);
+	list_add_tail(&obj->fence_timeline_list, &fence_timeline_list_head);
+	spin_unlock_irqrestore(&fence_timeline_list_lock, flags);
+}
+EXPORT_SYMBOL(fence_timeline_debug_add);
+
+void fence_timeline_debug_remove(struct fence_timeline *obj)
+{
+	unsigned long flags;
+
+	spin_lock_irqsave(&fence_timeline_list_lock, flags);
+	list_del(&obj->fence_timeline_list);
+	spin_unlock_irqrestore(&fence_timeline_list_lock, flags);
+}
+EXPORT_SYMBOL(fence_timeline_debug_remove);
+
+const char *fence_status_str(int status)
+{
+	if (status == 0)
+		return "signaled";
+
+	if (status > 0)
+		return "active";
+
+	return "error";
+}
+EXPORT_SYMBOL(fence_status_str);
+
+void fence_print(struct seq_file *s, struct fence *fence, bool show)
+{
+	int status = 1;
+	struct fence_timeline *parent = fence_parent(fence);
+
+	if (fence_is_signaled_locked(fence))
+		status = fence->status;
+
+	seq_printf(s, "  %s%sfence %s",
+		   show ? parent->name : "",
+		   show ? "_" : "",
+		   fence_status_str(status));
+
+	if (status <= 0) {
+		struct timespec64 ts64 =
+			ktime_to_timespec64(fence->timestamp);
+
+		seq_printf(s, "@%lld.%09ld", (s64)ts64.tv_sec, ts64.tv_nsec);
+	}
+
+	if (fence->ops->timeline_value_str &&
+	    fence->ops->fence_value_str) {
+		char value[64];
+
+		fence->ops->fence_value_str(fence, value, sizeof(value));
+		seq_printf(s, ": %s", value);
+		if (show) {
+			fence->ops->timeline_value_str(fence, value,
+						       sizeof(value));
+			seq_printf(s, " / %s", value);
+		}
+	}
+
+	seq_puts(s, "\n");
+}
+EXPORT_SYMBOL(fence_print);
+
+void fence_timeline_print(struct seq_file *s, struct fence_timeline *obj)
+{
+	struct list_head *pos;
+	unsigned long flags;
+
+	seq_printf(s, "%s %s: %u\n", obj->name, obj->drv_name, obj->value);
+
+	spin_lock_irqsave(&obj->lock, flags);
+	list_for_each(pos, &obj->child_list_head) {
+		struct fence *fence =
+			container_of(pos, struct fence, child_list);
+		fence_print(s, fence, false);
+	}
+	spin_unlock_irqrestore(&obj->lock, flags);
+}
+EXPORT_SYMBOL(fence_timeline_print);
+
+void fence_timeline_print_all(struct seq_file* s)
+{
+	unsigned long flags;
+	struct list_head *pos;
+
+	spin_lock_irqsave(&fence_timeline_list_lock, flags);
+	list_for_each(pos, &fence_timeline_list_head) {
+		struct fence_timeline *obj =
+			container_of(pos, struct fence_timeline,
+				     fence_timeline_list);
+
+		fence_timeline_print(s, obj);
+		seq_puts(s, "\n");
+	}
+	spin_unlock_irqrestore(&fence_timeline_list_lock, flags);
+}
+EXPORT_SYMBOL(fence_timeline_print_all);
+#endif
diff --git a/drivers/staging/android/sync.h b/drivers/staging/android/sync.h
index 256315c..8e6827b 100644
--- a/drivers/staging/android/sync.h
+++ b/drivers/staging/android/sync.h
@@ -184,15 +184,11 @@ int sync_fence_wait(struct sync_fence *fence, long timeout);
 
 #ifdef CONFIG_DEBUG_FS
 
-void sync_timeline_debug_add(struct fence_timeline *obj);
-void sync_timeline_debug_remove(struct fence_timeline *obj);
 void sync_fence_debug_add(struct sync_fence *fence);
 void sync_fence_debug_remove(struct sync_fence *fence);
 void sync_dump(void);
 
 #else
-# define sync_timeline_debug_add(obj)
-# define sync_timeline_debug_remove(obj)
 # define sync_fence_debug_add(fence)
 # define sync_fence_debug_remove(fence)
 # define sync_dump()
diff --git a/drivers/staging/android/sync_debug.c b/drivers/staging/android/sync_debug.c
index 13d225f..8e2ca57 100644
--- a/drivers/staging/android/sync_debug.c
+++ b/drivers/staging/android/sync_debug.c
@@ -33,29 +33,9 @@
 
 static struct dentry *dbgfs;
 
-static LIST_HEAD(sync_timeline_list_head);
-static DEFINE_SPINLOCK(sync_timeline_list_lock);
 static LIST_HEAD(sync_fence_list_head);
 static DEFINE_SPINLOCK(sync_fence_list_lock);
 
-void sync_timeline_debug_add(struct fence_timeline *obj)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&sync_timeline_list_lock, flags);
-	list_add_tail(&obj->fence_timeline_list, &sync_timeline_list_head);
-	spin_unlock_irqrestore(&sync_timeline_list_lock, flags);
-}
-
-void sync_timeline_debug_remove(struct fence_timeline *obj)
-{
-	unsigned long flags;
-
-	spin_lock_irqsave(&sync_timeline_list_lock, flags);
-	list_del(&obj->fence_timeline_list);
-	spin_unlock_irqrestore(&sync_timeline_list_lock, flags);
-}
-
 void sync_fence_debug_add(struct sync_fence *sync_fence)
 {
 	unsigned long flags;
@@ -74,76 +54,6 @@ void sync_fence_debug_remove(struct sync_fence *sync_fence)
 	spin_unlock_irqrestore(&sync_fence_list_lock, flags);
 }
 
-static const char *sync_status_str(int status)
-{
-	if (status == 0)
-		return "signaled";
-
-	if (status > 0)
-		return "active";
-
-	return "error";
-}
-
-static void sync_print_fence(struct seq_file *s, struct fence *fence, bool show)
-{
-	int status = 1;
-	struct fence_timeline *parent = fence_parent(fence);
-
-	if (fence_is_signaled_locked(fence))
-		status = fence->status;
-
-	seq_printf(s, "  %s%sfence %s",
-		   show ? parent->name : "",
-		   show ? "_" : "",
-		   sync_status_str(status));
-
-	if (status <= 0) {
-		struct timespec64 ts64 =
-			ktime_to_timespec64(fence->timestamp);
-
-		seq_printf(s, "@%lld.%09ld", (s64)ts64.tv_sec, ts64.tv_nsec);
-	}
-
-	if ((!fence || fence->ops->timeline_value_str) &&
-		fence->ops->fence_value_str) {
-		char value[64];
-		bool success;
-
-		fence->ops->fence_value_str(fence, value, sizeof(value));
-		success = strlen(value);
-
-		if (success)
-			seq_printf(s, ": %s", value);
-
-		if (success && fence) {
-			fence->ops->timeline_value_str(fence, value,
-						       sizeof(value));
-
-			if (strlen(value))
-				seq_printf(s, " / %s", value);
-		}
-	}
-
-	seq_puts(s, "\n");
-}
-
-static void sync_print_obj(struct seq_file *s, struct fence_timeline *obj)
-{
-	struct list_head *pos;
-	unsigned long flags;
-
-	seq_printf(s, "%s %s: %d\n", obj->name, obj->drv_name, obj->value);
-
-	spin_lock_irqsave(&obj->lock, flags);
-	list_for_each(pos, &obj->child_list_head) {
-		struct fence *fence =
-			container_of(pos, struct fence, child_list);
-		sync_print_fence(s, fence, false);
-	}
-	spin_unlock_irqrestore(&obj->lock, flags);
-}
-
 static void sync_print_sync_fence(struct seq_file *s,
 				  struct sync_fence *sync_fence)
 {
@@ -152,10 +62,10 @@ static void sync_print_sync_fence(struct seq_file *s,
 	int i;
 
 	seq_printf(s, "[%p] %s: %s\n", sync_fence, sync_fence->name,
-		   sync_status_str(atomic_read(&sync_fence->status)));
+		   fence_status_str(atomic_read(&sync_fence->status)));
 
 	for (i = 0; i < sync_fence->num_fences; ++i) {
-		sync_print_fence(s, sync_fence->cbs[i].fence, true);
+		fence_print(s, sync_fence->cbs[i].fence, true);
 	}
 
 	spin_lock_irqsave(&sync_fence->wq.lock, flags);
@@ -179,16 +89,7 @@ static int sync_debugfs_show(struct seq_file *s, void *unused)
 
 	seq_puts(s, "objs:\n--------------\n");
 
-	spin_lock_irqsave(&sync_timeline_list_lock, flags);
-	list_for_each(pos, &sync_timeline_list_head) {
-		struct fence_timeline *obj =
-			container_of(pos, struct fence_timeline,
-				     fence_timeline_list);
-
-		sync_print_obj(s, obj);
-		seq_puts(s, "\n");
-	}
-	spin_unlock_irqrestore(&sync_timeline_list_lock, flags);
+	fence_timeline_print_all(s);
 
 	seq_puts(s, "fences:\n--------------\n");
 
diff --git a/include/linux/fence.h b/include/linux/fence.h
index adece43..32a26ab 100644
--- a/include/linux/fence.h
+++ b/include/linux/fence.h
@@ -407,6 +407,24 @@ static inline signed long fence_wait(struct fence *fence, bool intr)
 
 unsigned fence_context_alloc(unsigned num);
 
+#ifdef CONFIG_DEBUG_FS
+
+void fence_timeline_debug_add(struct fence_timeline *obj);
+void fence_timeline_debug_remove(struct fence_timeline *obj);
+const char *fence_status_str(int status);
+void fence_print(struct seq_file *s, struct fence *fence, bool show);
+void fence_timeline_print(struct seq_file *s, struct fence_timeline *obj);
+void fence_timeline_print_all(struct seq_file* s);
+
+#else
+#define fence_timeline_debug_add(obj)
+#define fence_timeline_debug_remove(obj)
+#define fence_status_str(status)
+#define fence_print(s, fence, show)
+#define fence_timeline_print(s, obj)
+#define fence_timeline_print_all(s)
+#endif
+
 #define FENCE_TRACE(f, fmt, args...) \
 	do {								\
 		struct fence *__ff = (f);				\
-- 
2.5.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

  parent reply	other threads:[~2016-01-15 14:57 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-15 14:55 [RFC 00/29] De-stage android's sync framework Gustavo Padovan
2016-01-15 14:55 ` [RFC 01/29] staging/android: fix sync framework documentation Gustavo Padovan
2016-01-15 14:55 ` [RFC 02/29] staging/android: fix checkpatch warning Gustavo Padovan
2016-01-15 14:55 ` [RFC 03/29] staging/android: rename sync_fence_release Gustavo Padovan
2016-01-15 14:55 ` [RFC 04/29] staging/android: rename 'android_fence' to 'sync_fence' Gustavo Padovan
2016-01-15 14:55 ` [RFC 05/29] staging/android: remove not used sync_timeline ops Gustavo Padovan
2016-01-15 14:55 ` [RFC 06/29] staging/android: create a 'sync' dir for debugfs information Gustavo Padovan
2016-01-15 14:55 ` [RFC 07/29] staging/android: move sw_sync file to debugfs file Gustavo Padovan
2016-01-15 14:55 ` [RFC 08/29] staging/android: Remove WARN_ON_ONCE when releasing sync_fence Gustavo Padovan
2016-01-15 14:55 ` [RFC 09/29] staging/android: rename struct sync_fence's variables to 'sync_fence' Gustavo Padovan
2016-01-15 14:55 ` [RFC 10/29] staging/android: rename 'sync_pt' to 'fence' in struct sync_fence_cb Gustavo Padovan
2016-01-15 14:55 ` [RFC 11/29] dma-buf/fence: move sync_timeline to fence_timeline Gustavo Padovan
2016-01-20  0:56   ` Greg Hackmann
2016-01-15 14:55 ` [RFC 12/29] staging/android: remove struct sync_pt Gustavo Padovan
2016-01-15 14:55 ` [RFC 13/29] dma-buf/fence: create fence_default_enable_signaling() Gustavo Padovan
2016-01-15 14:55 ` [RFC 14/29] dma-buf/fence: create fence_default_release() Gustavo Padovan
2016-01-15 14:55 ` [RFC 15/29] dma-buf/fence: create fence_default_get_driver_name() Gustavo Padovan
2016-01-15 14:55 ` [RFC 16/29] dma-buf/fence: create fence_default_timeline_name() Gustavo Padovan
2016-01-15 14:55 ` [RFC 17/29] dma-buf/fence: store last signaled value on fence timeline Gustavo Padovan
2016-01-15 14:55 ` [RFC 18/29] dma-buf/fence: create default .fence_value_str() and .timeline_value_str() Gustavo Padovan
2016-01-15 14:55 ` [RFC 19/29] dma-buf/fence: create fence_default_fill_driver_data() Gustavo Padovan
2016-01-15 14:55 ` [RFC 20/29] dma-buf/fence: remove fence_timeline_ops Gustavo Padovan
2016-01-15 14:55 ` [RFC 21/29] dma-buf/fence: add fence_create_on_timeline() Gustavo Padovan
2016-01-15 14:55 ` [RFC 22/29] staging/android: remove sync_pt_create() Gustavo Padovan
2016-01-15 14:55 ` [RFC 23/29] staging/android: remove sw_sync_timeline and sw_sync_pt Gustavo Padovan
2016-01-15 14:55 ` Gustavo Padovan [this message]
2016-01-15 14:55 ` [RFC 25/29] dma-buf/fence: remove unused var from fence_timeline_signal() Gustavo Padovan
2016-01-15 14:55 ` [RFC 26/29] dma-buf/fence: remove pointless fence_timeline_signal at destroy phase Gustavo Padovan
2016-01-15 17:48   ` John Harrison
2016-01-15 18:02     ` Gustavo Padovan
2016-01-15 23:42       ` Greg Hackmann
2016-02-09 22:55         ` Tom Cherry
2016-02-25 15:26           ` Gustavo Padovan
2016-01-15 14:55 ` [RFC 27/29] dma-buf/fence: add .cleanup() callback Gustavo Padovan
2016-01-15 14:55 ` [RFC 28/29] staging/android: use .cleanup() to interrupt any sync_fence waiter Gustavo Padovan
2016-01-15 14:55 ` [RFC 29/29] dma-buf/fence: de-stage sync framework Gustavo Padovan
2016-01-15 19:11 ` [RFC 00/29] De-stage android's " Joe Perches
2016-01-19 11:00 ` Daniel Vetter
2016-01-19 15:23   ` Gustavo Padovan
2016-01-19 16:12     ` John Harrison
2016-01-19 17:52       ` Gustavo Padovan
2016-01-19 18:04         ` Daniel Vetter
2016-01-19 18:15           ` Gustavo Padovan
2016-03-23 15:07       ` Tomeu Vizoso
2016-01-19 20:10   ` Gustavo Padovan
2016-01-19 20:32     ` Daniel Vetter
2016-01-20 10:28 ` Maarten Lankhorst
2016-01-20 14:32   ` Gustavo Padovan
2016-01-20 15:02     ` Maarten Lankhorst
2016-01-20 16:29       ` Daniel Vetter
2016-01-20 18:28       ` Gustavo Padovan

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1452869739-3304-25-git-send-email-gustavo@padovan.org \
    --to=gustavo@padovan.org \
    --cc=John.C.Harrison@Intel.com \
    --cc=arve@android.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniels@collabora.com \
    --cc=devel@driverdev.osuosl.org \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=gustavo.padovan@collabora.co.uk \
    --cc=linux-kernel@vger.kernel.org \
    --cc=maarten.lankhorst@canonical.com \
    --cc=riandrews@android.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).