aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorSteven Rostedt (Red Hat) <rostedt@goodmis.org>2014-06-25 15:54:42 -0400
committerSteven Rostedt <rostedt@goodmis.org>2014-11-19 22:01:09 -0500
commit3a161d99c43ce74c76aecff309be4c3ba455e823 (patch)
treecc3aa5d746203cd17e8d9b92c78bef04f6f0ccdb /include/linux
parent16a8ef2751801346f1f76a18685b2beb63cd170f (diff)
tracing: Create seq_buf layer in trace_seq
Create a seq_buf layer that trace_seq sits on. The seq_buf will not be limited to page size. This will allow other usages of seq_buf instead of a hard set PAGE_SIZE one that trace_seq has. Link: http://lkml.kernel.org/r/20141104160221.864997179@goodmis.org Link: http://lkml.kernel.org/r/20141114011412.170377300@goodmis.org Tested-by: Jiri Kosina <jkosina@suse.cz> Acked-by: Jiri Kosina <jkosina@suse.cz> Reviewed-by: Petr Mladek <pmladek@suse.cz> Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/seq_buf.h81
-rw-r--r--include/linux/trace_seq.h12
2 files changed, 86 insertions, 7 deletions
diff --git a/include/linux/seq_buf.h b/include/linux/seq_buf.h
new file mode 100644
index 000000000000..4f7a96a9d71a
--- /dev/null
+++ b/include/linux/seq_buf.h
@@ -0,0 +1,81 @@
1#ifndef _LINUX_SEQ_BUF_H
2#define _LINUX_SEQ_BUF_H
3
4#include <linux/fs.h>
5
6/*
7 * Trace sequences are used to allow a function to call several other functions
8 * to create a string of data to use.
9 */
10
11/**
12 * seq_buf - seq buffer structure
13 * @buffer: pointer to the buffer
14 * @size: size of the buffer
15 * @len: the amount of data inside the buffer
16 * @readpos: The next position to read in the buffer.
17 */
18struct seq_buf {
19 unsigned char *buffer;
20 unsigned int size;
21 unsigned int len;
22 unsigned int readpos;
23};
24
25static inline void
26seq_buf_init(struct seq_buf *s, unsigned char *buf, unsigned int size)
27{
28 s->buffer = buf;
29 s->size = size;
30 s->len = 0;
31 s->readpos = 0;
32}
33
34/*
35 * seq_buf have a buffer that might overflow. When this happens
36 * the len and size are set to be equal.
37 */
38static inline bool
39seq_buf_has_overflowed(struct seq_buf *s)
40{
41 return s->len == s->size;
42}
43
44static inline void
45seq_buf_set_overflow(struct seq_buf *s)
46{
47 s->len = s->size;
48}
49
50/*
51 * How much buffer is left on the seq_buf?
52 */
53static inline unsigned int
54seq_buf_buffer_left(struct seq_buf *s)
55{
56 if (seq_buf_has_overflowed(s))
57 return 0;
58
59 return (s->size - 1) - s->len;
60}
61
62extern __printf(2, 3)
63int seq_buf_printf(struct seq_buf *s, const char *fmt, ...);
64extern __printf(2, 0)
65int seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args);
66extern int
67seq_buf_bprintf(struct seq_buf *s, const char *fmt, const u32 *binary);
68extern int seq_buf_print_seq(struct seq_file *m, struct seq_buf *s);
69extern int seq_buf_to_user(struct seq_buf *s, char __user *ubuf,
70 int cnt);
71extern int seq_buf_puts(struct seq_buf *s, const char *str);
72extern int seq_buf_putc(struct seq_buf *s, unsigned char c);
73extern int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len);
74extern int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
75 unsigned int len);
76extern int seq_buf_path(struct seq_buf *s, const struct path *path);
77
78extern int seq_buf_bitmask(struct seq_buf *s, const unsigned long *maskp,
79 int nmaskbits);
80
81#endif /* _LINUX_SEQ_BUF_H */
diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h
index db8a73224f1a..85d37106be3d 100644
--- a/include/linux/trace_seq.h
+++ b/include/linux/trace_seq.h
@@ -1,7 +1,7 @@
1#ifndef _LINUX_TRACE_SEQ_H 1#ifndef _LINUX_TRACE_SEQ_H
2#define _LINUX_TRACE_SEQ_H 2#define _LINUX_TRACE_SEQ_H
3 3
4#include <linux/fs.h> 4#include <linux/seq_buf.h>
5 5
6#include <asm/page.h> 6#include <asm/page.h>
7 7
@@ -12,16 +12,14 @@
12 12
13struct trace_seq { 13struct trace_seq {
14 unsigned char buffer[PAGE_SIZE]; 14 unsigned char buffer[PAGE_SIZE];
15 unsigned int len; 15 struct seq_buf seq;
16 unsigned int readpos;
17 int full; 16 int full;
18}; 17};
19 18
20static inline void 19static inline void
21trace_seq_init(struct trace_seq *s) 20trace_seq_init(struct trace_seq *s)
22{ 21{
23 s->len = 0; 22 seq_buf_init(&s->seq, s->buffer, PAGE_SIZE);
24 s->readpos = 0;
25 s->full = 0; 23 s->full = 0;
26} 24}
27 25
@@ -37,7 +35,7 @@ trace_seq_init(struct trace_seq *s)
37static inline unsigned char * 35static inline unsigned char *
38trace_seq_buffer_ptr(struct trace_seq *s) 36trace_seq_buffer_ptr(struct trace_seq *s)
39{ 37{
40 return s->buffer + s->len; 38 return s->buffer + s->seq.len;
41} 39}
42 40
43/** 41/**
@@ -49,7 +47,7 @@ trace_seq_buffer_ptr(struct trace_seq *s)
49 */ 47 */
50static inline bool trace_seq_has_overflowed(struct trace_seq *s) 48static inline bool trace_seq_has_overflowed(struct trace_seq *s)
51{ 49{
52 return s->full || s->len > PAGE_SIZE - 1; 50 return s->full || seq_buf_has_overflowed(&s->seq);
53} 51}
54 52
55/* 53/*