aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-06-20 17:38:01 -0400
committerSteven Rostedt <rostedt@goodmis.org>2014-07-01 07:13:36 -0400
commit36aabfff50b6a03bcfd2c3cfbd7b83eb0a9ce0c1 (patch)
treea8e9df6eb61e93288596fcd3e60ba138214118a2
parent12306276fabcb746a14979e96f43a13c724dec49 (diff)
tracing: Clean up trace_seq.c
For using trace_seq_*() functions in NMI context, I posted a patch to move it to the lib/ directory. This caused Andrew Morton to take a look at the code. He went through and gave a lot of comments about missing kernel doc, inconsistent types for the save variable, mix match of EXPORT_SYMBOL_GPL() and EXPORT_SYMBOL() as well as missing EXPORT_SYMBOL*()s. There were a few comments about the way variables were being compared (int vs uint). All these were good review comments and should be implemented regardless of if trace_seq.c should be moved to lib/ or not. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--include/linux/trace_seq.h20
-rw-r--r--kernel/trace/trace_seq.c207
2 files changed, 185 insertions, 42 deletions
diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h
index 66ea365acf01..1f05317f51c4 100644
--- a/include/linux/trace_seq.h
+++ b/include/linux/trace_seq.h
@@ -38,14 +38,14 @@ int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args);
38extern int 38extern int
39trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); 39trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary);
40extern int trace_print_seq(struct seq_file *m, struct trace_seq *s); 40extern int trace_print_seq(struct seq_file *m, struct trace_seq *s);
41extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, 41extern int trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
42 size_t cnt); 42 int cnt);
43extern int trace_seq_puts(struct trace_seq *s, const char *str); 43extern int trace_seq_puts(struct trace_seq *s, const char *str);
44extern int trace_seq_putc(struct trace_seq *s, unsigned char c); 44extern int trace_seq_putc(struct trace_seq *s, unsigned char c);
45extern int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len); 45extern int trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len);
46extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, 46extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
47 size_t len); 47 unsigned int len);
48extern void *trace_seq_reserve(struct trace_seq *s, size_t len); 48extern void *trace_seq_reserve(struct trace_seq *s, unsigned int len);
49extern int trace_seq_path(struct trace_seq *s, const struct path *path); 49extern int trace_seq_path(struct trace_seq *s, const struct path *path);
50 50
51extern int trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp, 51extern int trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
@@ -73,8 +73,8 @@ static inline int trace_print_seq(struct seq_file *m, struct trace_seq *s)
73{ 73{
74 return 0; 74 return 0;
75} 75}
76static inline ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, 76static inline int trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
77 size_t cnt) 77 int cnt)
78{ 78{
79 return 0; 79 return 0;
80} 80}
@@ -87,16 +87,16 @@ static inline int trace_seq_putc(struct trace_seq *s, unsigned char c)
87 return 0; 87 return 0;
88} 88}
89static inline int 89static inline int
90trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) 90trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len)
91{ 91{
92 return 0; 92 return 0;
93} 93}
94static inline int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, 94static inline int trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
95 size_t len) 95 unsigned int len)
96{ 96{
97 return 0; 97 return 0;
98} 98}
99static inline void *trace_seq_reserve(struct trace_seq *s, size_t len) 99static inline void *trace_seq_reserve(struct trace_seq *s, unsigned int len)
100{ 100{
101 return NULL; 101 return NULL;
102} 102}
diff --git a/kernel/trace/trace_seq.c b/kernel/trace/trace_seq.c
index 5ba99c6cf834..0fabca773e51 100644
--- a/kernel/trace/trace_seq.c
+++ b/kernel/trace/trace_seq.c
@@ -3,21 +3,55 @@
3 * 3 *
4 * Copyright (C) 2008-2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 4 * Copyright (C) 2008-2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
5 * 5 *
6 * The trace_seq is a handy tool that allows you to pass a descriptor around
7 * to a buffer that other functions can write to. It is similar to the
8 * seq_file functionality but has some differences.
9 *
10 * To use it, the trace_seq must be initialized with trace_seq_init().
11 * This will set up the counters within the descriptor. You can call
12 * trace_seq_init() more than once to reset the trace_seq to start
13 * from scratch.
14 *
15 * The buffer size is currently PAGE_SIZE, although it may become dynamic
16 * in the future.
17 *
18 * A write to the buffer will either succed or fail. That is, unlike
19 * sprintf() there will not be a partial write (well it may write into
20 * the buffer but it wont update the pointers). This allows users to
21 * try to write something into the trace_seq buffer and if it fails
22 * they can flush it and try again.
23 *
6 */ 24 */
7#include <linux/uaccess.h> 25#include <linux/uaccess.h>
8#include <linux/seq_file.h> 26#include <linux/seq_file.h>
9#include <linux/trace_seq.h> 27#include <linux/trace_seq.h>
10 28
29/* How much buffer is left on the trace_seq? */
30#define TRACE_SEQ_BUF_LEFT(s) ((PAGE_SIZE - 1) - (s)->len)
31
32/* How much buffer is written? */
33#define TRACE_SEQ_BUF_USED(s) min((s)->len, (unsigned int)(PAGE_SIZE - 1))
34
35/**
36 * trace_print_seq - move the contents of trace_seq into a seq_file
37 * @m: the seq_file descriptor that is the destination
38 * @s: the trace_seq descriptor that is the source.
39 *
40 * Returns 0 on success and non zero on error. If it succeeds to
41 * write to the seq_file it will reset the trace_seq, otherwise
42 * it does not modify the trace_seq to let the caller try again.
43 */
11int trace_print_seq(struct seq_file *m, struct trace_seq *s) 44int trace_print_seq(struct seq_file *m, struct trace_seq *s)
12{ 45{
13 int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len; 46 unsigned int len = TRACE_SEQ_BUF_USED(s);
14 int ret; 47 int ret;
15 48
16 ret = seq_write(m, s->buffer, len); 49 ret = seq_write(m, s->buffer, len);
17 50
18 /* 51 /*
19 * Only reset this buffer if we successfully wrote to the 52 * Only reset this buffer if we successfully wrote to the
20 * seq_file buffer. 53 * seq_file buffer. This lets the caller try again or
54 * do something else with the contents.
21 */ 55 */
22 if (!ret) 56 if (!ret)
23 trace_seq_init(s); 57 trace_seq_init(s);
@@ -30,19 +64,20 @@ int trace_print_seq(struct seq_file *m, struct trace_seq *s)
30 * @s: trace sequence descriptor 64 * @s: trace sequence descriptor
31 * @fmt: printf format string 65 * @fmt: printf format string
32 * 66 *
33 * It returns 0 if the trace oversizes the buffer's free
34 * space, 1 otherwise.
35 *
36 * The tracer may use either sequence operations or its own 67 * The tracer may use either sequence operations or its own
37 * copy to user routines. To simplify formating of a trace 68 * copy to user routines. To simplify formating of a trace
38 * trace_seq_printf is used to store strings into a special 69 * trace_seq_printf() is used to store strings into a special
39 * buffer (@s). Then the output may be either used by 70 * buffer (@s). Then the output may be either used by
40 * the sequencer or pulled into another buffer. 71 * the sequencer or pulled into another buffer.
72 *
73 * Returns 1 if we successfully written all the contents to
74 * the buffer.
75 * Returns 0 if we the length to write is bigger than the
76 * reserved buffer space. In this case, nothing gets written.
41 */ 77 */
42int 78int trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
43trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
44{ 79{
45 int len = (PAGE_SIZE - 1) - s->len; 80 unsigned int len = TRACE_SEQ_BUF_LEFT(s);
46 va_list ap; 81 va_list ap;
47 int ret; 82 int ret;
48 83
@@ -66,21 +101,22 @@ trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
66EXPORT_SYMBOL_GPL(trace_seq_printf); 101EXPORT_SYMBOL_GPL(trace_seq_printf);
67 102
68/** 103/**
69 * trace_seq_bitmask - put a list of longs as a bitmask print output 104 * trace_seq_bitmask - write a bitmask array in its ASCII representation
70 * @s: trace sequence descriptor 105 * @s: trace sequence descriptor
71 * @maskp: points to an array of unsigned longs that represent a bitmask 106 * @maskp: points to an array of unsigned longs that represent a bitmask
72 * @nmaskbits: The number of bits that are valid in @maskp 107 * @nmaskbits: The number of bits that are valid in @maskp
73 * 108 *
74 * It returns 0 if the trace oversizes the buffer's free
75 * space, 1 otherwise.
76 *
77 * Writes a ASCII representation of a bitmask string into @s. 109 * Writes a ASCII representation of a bitmask string into @s.
110 *
111 * Returns 1 if we successfully written all the contents to
112 * the buffer.
113 * Returns 0 if we the length to write is bigger than the
114 * rese