diff options
| author | Steven Rostedt (Red Hat) <rostedt@goodmis.org> | 2014-06-20 17:38:01 -0400 |
|---|---|---|
| committer | Steven Rostedt <rostedt@goodmis.org> | 2014-07-01 07:13:36 -0400 |
| commit | 36aabfff50b6a03bcfd2c3cfbd7b83eb0a9ce0c1 (patch) | |
| tree | a8e9df6eb61e93288596fcd3e60ba138214118a2 | |
| parent | 12306276fabcb746a14979e96f43a13c724dec49 (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.h | 20 | ||||
| -rw-r--r-- | kernel/trace/trace_seq.c | 207 |
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); | |||
| 38 | extern int | 38 | extern int |
| 39 | trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); | 39 | trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); |
| 40 | extern int trace_print_seq(struct seq_file *m, struct trace_seq *s); | 40 | extern int trace_print_seq(struct seq_file *m, struct trace_seq *s); |
| 41 | extern ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, | 41 | extern int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, |
| 42 | size_t cnt); | 42 | int cnt); |
| 43 | extern int trace_seq_puts(struct trace_seq *s, const char *str); | 43 | extern int trace_seq_puts(struct trace_seq *s, const char *str); |
| 44 | extern int trace_seq_putc(struct trace_seq *s, unsigned char c); | 44 | extern int trace_seq_putc(struct trace_seq *s, unsigned char c); |
| 45 | extern int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len); | 45 | extern int trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len); |
| 46 | extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, | 46 | extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, |
| 47 | size_t len); | 47 | unsigned int len); |
| 48 | extern void *trace_seq_reserve(struct trace_seq *s, size_t len); | 48 | extern void *trace_seq_reserve(struct trace_seq *s, unsigned int len); |
| 49 | extern int trace_seq_path(struct trace_seq *s, const struct path *path); | 49 | extern int trace_seq_path(struct trace_seq *s, const struct path *path); |
| 50 | 50 | ||
| 51 | extern int trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp, | 51 | extern 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 | } |
| 76 | static inline ssize_t trace_seq_to_user(struct trace_seq *s, char __user *ubuf, | 76 | static 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 | } |
| 89 | static inline int | 89 | static inline int |
| 90 | trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) | 90 | trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len) |
| 91 | { | 91 | { |
| 92 | return 0; | 92 | return 0; |
| 93 | } | 93 | } |
| 94 | static inline int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, | 94 | static 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 | } |
| 99 | static inline void *trace_seq_reserve(struct trace_seq *s, size_t len) | 99 | static 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 | */ | ||
| 11 | int trace_print_seq(struct seq_file *m, struct trace_seq *s) | 44 | int 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 | */ |
| 42 | int | 78 | int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) |
| 43 | trace_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, ...) | |||
| 66 | EXPORT_SYMBOL_GPL(trace_seq_printf); | 101 | EXPORT_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 | ||
