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
next prev 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).