From: Steven Rostedt <rostedt@goodmis.org>
To: linux-kernel@vger.kernel.org
Cc: Ingo Molnar <mingo@elte.hu>,
Andrew Morton <akpm@linux-foundation.org>,
Thomas Gleixner <tglx@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Frederic Weisbecker <fweisbec@gmail.com>,
Theodore Tso <tytso@mit.edu>,
Arjan van de Ven <arjan@infradead.org>,
Christoph Hellwig <hch@lst.de>,
Mathieu Desnoyers <compudj@krystal.dyndns.org>,
Jeremy Fitzhardinge <jeremy@goop.org>,
Lai Jiangshan <laijs@cn.fujitsu.com>,
Zhaolei <zhaolei@cn.fujitsu.com>, Li Zefan <lizf@cn.fujitsu.com>,
KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com>,
Masami Hiramatsu <mhiramat@redhat.com>,
"Frank Ch. Eigler" <fche@elastic.org>,
Tom Zanussi <tzanussi@gmail.com>,
Jiaying Zhang <jiayingz@google.com>,
Michael Rubin <mrubin@google.com>,
Martin Bligh <mbligh@google.com>
Subject: [PATCH 3/8] tracing: make trace_seq operations available for core kernel
Date: Tue, 14 Apr 2009 13:23:40 -0400 [thread overview]
Message-ID: <20090414172640.993528505@goodmis.org> (raw)
In-Reply-To: 20090414172337.280621613@goodmis.org
[-- Attachment #1: 0003-tracing-make-trace_seq-operations-available-for-cor.patch --]
[-- Type: text/plain, Size: 6057 bytes --]
From: Steven Rostedt <srostedt@redhat.com>
In the process to make TRACE_EVENT macro work for modules, the trace_seq
operations must be available for core kernel code.
These operations are quite useful and can be used for other implementations.
The main idea is that we create a trace_seq handle that acts very much
like the seq_file handle.
struct trace_seq *s = kmalloc(sizeof(*s, GFP_KERNEL);
trace_seq_init(s);
trace_seq_printf(s, "some data %d\n", variable);
printk("%s", s->buffer);
The main use is to allow a top level function call several other functions
that may store printf like data into the buffer. Then at the end, the top
level function can process all the data with any method it would like to.
It could be passed to userspace, output via printk or even use seq_file:
trace_seq_to_user(s, ubuf, cnt);
seq_puts(m, s->buffer);
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
---
include/linux/trace_seq.h | 89 +++++++++++++++++++++++++++++++++++++++++++
kernel/trace/trace.h | 15 +------
kernel/trace/trace_output.h | 16 +-------
3 files changed, 92 insertions(+), 28 deletions(-)
create mode 100644 include/linux/trace_seq.h
diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h
new file mode 100644
index 0000000..28051da
--- /dev/null
+++ b/include/linux/trace_seq.h
@@ -0,0 +1,89 @@
+#ifndef _LINUX_TRACE_SEQ_H
+#define _LINUX_TRACE_SEQ_H
+
+/*
+ * Trace sequences are used to allow a function to call several other functions
+ * to create a string of data to use (up to a max of PAGE_SIZE.
+ */
+
+struct trace_seq {
+ unsigned char buffer[PAGE_SIZE];
+ unsigned int len;
+ unsigned int readpos;
+};
+
+static inline void
+trace_seq_init(struct trace_seq *s)
+{
+ s->len = 0;
+ s->readpos = 0;
+}
+
+/*
+ * Currently only defined when tracing is enabled.
+ */
+#ifdef CONFIG_TRACING
+extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
+ __attribute__ ((format (printf, 2, 3)));
+extern int
+trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary);
+extern void trace_print_seq(struct seq_file *m, struct trace_seq *s);
+extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
+ size_t cnt);
+extern int trace_seq_puts(struct trace_seq *s, const char *str);
+extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
+extern int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len);
+extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
+ size_t len);
+extern void *trace_seq_reserve(struct trace_seq *s, size_t len);
+extern int trace_seq_path(struct trace_seq *s, struct path *path);
+
+#else /* CONFIG_TRACING */
+static inline int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
+ __attribute__ ((format (printf, 2, 3)))
+{
+ return 0;
+}
+static inline int
+trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)
+{
+ return 0;
+}
+
+static inline void trace_print_seq(struct seq_file *m, struct trace_seq *s)
+{
+}
+static inline ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
+ size_t cnt)
+{
+ return 0;
+}
+static inline int trace_seq_puts(struct trace_seq *s, const char *str)
+{
+ return 0;
+}
+static inline int trace_seq_putc(struct trace_seq *s, unsigned char c);
+{
+ return 0;
+}
+static inline int
+trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len)
+{
+ return 0;
+}
+static inline int trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
+ size_t len)
+{
+ return 0;
+}
+static inline void *trace_seq_reserve(struct trace_seq *s, size_t len)
+{
+ return NULL;
+}
+static inline int trace_seq_path(struct trace_seq *s, struct path *path)
+{
+ return 0;
+}
+#endif /* CONFIG_TRACING */
+
+#endif /* _LINUX_TRACE_SEQ_H */
diff --git a/kernel/trace/trace.h b/kernel/trace/trace.h
index b05b6ac..1882846 100644
--- a/kernel/trace/trace.h
+++ b/kernel/trace/trace.h
@@ -12,6 +12,8 @@
#include <linux/kmemtrace.h>
#include <trace/power.h>
+#include <linux/trace_seq.h>
+
enum trace_type {
__TRACE_FIRST_TYPE = 0,
@@ -423,19 +425,6 @@ struct tracer {
struct tracer_stat *stats;
};
-struct trace_seq {
- unsigned char buffer[PAGE_SIZE];
- unsigned int len;
- unsigned int readpos;
-};
-
-static inline void
-trace_seq_init(struct trace_seq *s)
-{
- s->len = 0;
- s->readpos = 0;
-}
-
#define TRACE_PIPE_ALL_CPU -1
diff --git a/kernel/trace/trace_output.h b/kernel/trace/trace_output.h
index 9163021..5c7cbfb 100644
--- a/kernel/trace/trace_output.h
+++ b/kernel/trace/trace_output.h
@@ -1,6 +1,7 @@
#ifndef __TRACE_EVENTS_H
#define __TRACE_EVENTS_H
+#include <linux/trace_seq.h>
#include "trace.h"
typedef enum print_line_t (*trace_print_func)(struct trace_iterator *iter,
@@ -20,24 +21,9 @@ trace_print_bprintk_msg_only(struct trace_iterator *iter);
extern enum print_line_t
trace_print_printk_msg_only(struct trace_iterator *iter);
-extern void trace_print_seq(struct seq_file *m, struct trace_seq *s);
-
-extern int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
- __attribute__ ((format (printf, 2, 3)));
-extern int
-trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary);
extern int
seq_print_ip_sym(struct trace_seq *s, unsigned long ip,
unsigned long sym_flags);
-extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
- size_t cnt);
-extern int trace_seq_puts(struct trace_seq *s, const char *str);
-extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
-extern int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len);
-extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
- size_t len);
-extern void *trace_seq_reserve(struct trace_seq *s, size_t len);
-extern int trace_seq_path(struct trace_seq *s, struct path *path);
extern int seq_print_userip_objs(const struct userstack_entry *entry,
struct trace_seq *s, unsigned long sym_flags);
extern int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm,
--
1.6.2.1
--
next prev parent reply other threads:[~2009-04-14 17:29 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-04-14 17:23 [PATCH 0/8] [GIT PULL] TRACE_EVENT for modules Steven Rostedt
2009-04-14 17:23 ` [PATCH 1/8] tracing: consolidate trace and trace_event headers Steven Rostedt
2009-04-14 21:51 ` Frederic Weisbecker
2009-04-14 22:04 ` Steven Rostedt
2009-04-14 17:23 ` [PATCH 2/8] tracing: create automated trace defines Steven Rostedt
2009-04-14 23:44 ` Jeremy Fitzhardinge
2009-04-15 1:45 ` Mathieu Desnoyers
2009-04-15 16:07 ` Jeremy Fitzhardinge
2009-04-16 2:34 ` Mathieu Desnoyers
2009-04-16 2:56 ` Jeremy Fitzhardinge
2009-04-16 23:44 ` Mathieu Desnoyers
2009-04-17 0:03 ` Jeremy Fitzhardinge
2009-04-17 0:13 ` Mathieu Desnoyers
2009-04-17 0:18 ` Jeremy Fitzhardinge
2009-04-17 0:28 ` Mathieu Desnoyers
2009-04-17 0:43 ` Jeremy Fitzhardinge
2009-04-17 3:05 ` [PATCH] tracepoints : let subsystem nop-out the tracepoints at build time Mathieu Desnoyers
2009-04-20 7:12 ` [PATCH 2/8] tracing: create automated trace defines Andi Kleen
2009-04-21 15:51 ` Mathieu Desnoyers
2009-04-21 17:18 ` Jeremy Fitzhardinge
2009-04-21 17:21 ` Steven Rostedt
2009-04-21 17:43 ` Jeremy Fitzhardinge
2009-04-21 20:28 ` Andi Kleen
2009-04-21 21:17 ` Steven Rostedt
2009-04-21 21:23 ` Frank Ch. Eigler
2009-04-21 21:33 ` Steven Rostedt
2009-04-22 5:47 ` Mathieu Desnoyers
2009-04-22 6:07 ` Andi Kleen
2009-04-22 6:24 ` Steven Rostedt
2009-04-22 7:26 ` Andi Kleen
2009-04-15 7:04 ` Zhaolei
2009-04-14 17:23 ` Steven Rostedt [this message]
2009-04-14 19:12 ` [PATCH 3/8] tracing: make trace_seq operations available for core kernel Peter Zijlstra
2009-04-15 2:19 ` Steven Rostedt
2009-04-14 17:23 ` [PATCH 4/8] tracing/events: move declarations from trace directory to core include Steven Rostedt
2009-04-14 17:23 ` [PATCH 5/8] tracing/events: move the ftrace event tracing code to core Steven Rostedt
2009-04-14 19:23 ` Peter Zijlstra
2009-04-15 2:25 ` Steven Rostedt
2009-04-15 3:40 ` Jiaying Zhang
2009-04-14 17:23 ` [PATCH 6/8] tracing/events: convert event call sites to use a link list Steven Rostedt
2009-04-14 17:23 ` [PATCH 7/8] tracing/events: add export symbols for trace events in modules Steven Rostedt
2009-04-14 17:23 ` [PATCH 8/8] tracing/events: add support for modules to TRACE_EVENT Steven Rostedt
2009-04-15 3:22 ` Rusty Russell
2009-04-14 18:15 ` [PATCH 0/8] [GIT PULL] TRACE_EVENT for modules Ingo Molnar
2009-04-14 18:25 ` Ingo Molnar
2009-04-14 18:21 ` Ingo Molnar
2009-04-14 18:33 ` Steven Rostedt
2009-04-14 18:35 ` Ingo Molnar
2009-04-14 21:04 ` Theodore Tso
2009-04-14 21:23 ` Steven Rostedt
2009-04-14 21:59 ` Steven Rostedt
2009-04-14 21:29 ` Frank Ch. Eigler
2009-04-14 22:00 ` Steven Rostedt
2009-04-16 16:53 ` Christoph Hellwig
2009-04-14 21:48 ` Jeremy Fitzhardinge
2009-04-14 21:55 ` Steven Rostedt
2009-04-14 22:33 ` Jeremy Fitzhardinge
2009-04-15 8:29 ` Ingo Molnar
2009-04-16 2:29 ` Mathieu Desnoyers
2009-04-16 16:52 ` Christoph Hellwig
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=20090414172640.993528505@goodmis.org \
--to=rostedt@goodmis.org \
--cc=akpm@linux-foundation.org \
--cc=arjan@infradead.org \
--cc=compudj@krystal.dyndns.org \
--cc=fche@elastic.org \
--cc=fweisbec@gmail.com \
--cc=hch@lst.de \
--cc=jeremy@goop.org \
--cc=jiayingz@google.com \
--cc=kosaki.motohiro@jp.fujitsu.com \
--cc=laijs@cn.fujitsu.com \
--cc=linux-kernel@vger.kernel.org \
--cc=lizf@cn.fujitsu.com \
--cc=mbligh@google.com \
--cc=mhiramat@redhat.com \
--cc=mingo@elte.hu \
--cc=mrubin@google.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
--cc=tytso@mit.edu \
--cc=tzanussi@gmail.com \
--cc=zhaolei@cn.fujitsu.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