blob: 6b1c562ffdaf0f0be1549e5eb34b8a199c11b273 [file] [log] [blame]
Steven Rostedt (VMware)bcea3f92018-08-16 11:23:53 -04001// SPDX-License-Identifier: GPL-2.0
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -04002/*
3 * trace_seq.c
4 *
5 * Copyright (C) 2008-2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
6 *
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -04007 * The trace_seq is a handy tool that allows you to pass a descriptor around
8 * to a buffer that other functions can write to. It is similar to the
9 * seq_file functionality but has some differences.
10 *
11 * To use it, the trace_seq must be initialized with trace_seq_init().
12 * This will set up the counters within the descriptor. You can call
13 * trace_seq_init() more than once to reset the trace_seq to start
14 * from scratch.
15 *
16 * The buffer size is currently PAGE_SIZE, although it may become dynamic
17 * in the future.
18 *
19 * A write to the buffer will either succed or fail. That is, unlike
20 * sprintf() there will not be a partial write (well it may write into
21 * the buffer but it wont update the pointers). This allows users to
22 * try to write something into the trace_seq buffer and if it fails
23 * they can flush it and try again.
24 *
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040025 */
26#include <linux/uaccess.h>
27#include <linux/seq_file.h>
28#include <linux/trace_seq.h>
29
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -040030/* How much buffer is left on the trace_seq? */
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040031#define TRACE_SEQ_BUF_LEFT(s) seq_buf_buffer_left(&(s)->seq)
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -040032
33/* How much buffer is written? */
Steven Rostedt (Red Hat)5ac483782014-11-14 15:49:41 -050034#define TRACE_SEQ_BUF_USED(s) seq_buf_used(&(s)->seq)
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040035
36/*
37 * trace_seq should work with being initialized with 0s.
38 */
39static inline void __trace_seq_init(struct trace_seq *s)
40{
41 if (unlikely(!s->seq.size))
42 trace_seq_init(s);
43}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -040044
45/**
46 * trace_print_seq - move the contents of trace_seq into a seq_file
47 * @m: the seq_file descriptor that is the destination
48 * @s: the trace_seq descriptor that is the source.
49 *
50 * Returns 0 on success and non zero on error. If it succeeds to
51 * write to the seq_file it will reset the trace_seq, otherwise
52 * it does not modify the trace_seq to let the caller try again.
53 */
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040054int trace_print_seq(struct seq_file *m, struct trace_seq *s)
55{
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040056 int ret;
57
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040058 __trace_seq_init(s);
59
60 ret = seq_buf_print_seq(m, &s->seq);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040061
62 /*
63 * Only reset this buffer if we successfully wrote to the
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -040064 * seq_file buffer. This lets the caller try again or
65 * do something else with the contents.
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040066 */
67 if (!ret)
68 trace_seq_init(s);
69
70 return ret;
71}
72
73/**
74 * trace_seq_printf - sequence printing of trace information
75 * @s: trace sequence descriptor
76 * @fmt: printf format string
77 *
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040078 * The tracer may use either sequence operations or its own
79 * copy to user routines. To simplify formating of a trace
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -040080 * trace_seq_printf() is used to store strings into a special
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040081 * buffer (@s). Then the output may be either used by
82 * the sequencer or pulled into another buffer.
83 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -050084void trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040085{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040086 unsigned int save_len = s->seq.len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040087 va_list ap;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040088
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040089 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -050090 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040091
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040092 __trace_seq_init(s);
93
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040094 va_start(ap, fmt);
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040095 seq_buf_vprintf(&s->seq, fmt, ap);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -040096 va_end(ap);
97
98 /* If we can't write it all, don't bother writing anything */
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -040099 if (unlikely(seq_buf_has_overflowed(&s->seq))) {
100 s->seq.len = save_len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400101 s->full = 1;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400102 }
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400103}
104EXPORT_SYMBOL_GPL(trace_seq_printf);
105
106/**
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400107 * trace_seq_bitmask - write a bitmask array in its ASCII representation
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400108 * @s: trace sequence descriptor
109 * @maskp: points to an array of unsigned longs that represent a bitmask
110 * @nmaskbits: The number of bits that are valid in @maskp
111 *
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400112 * Writes a ASCII representation of a bitmask string into @s.
113 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500114void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400115 int nmaskbits)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400116{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400117 unsigned int save_len = s->seq.len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400118
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400119 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500120 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400121
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400122 __trace_seq_init(s);
123
Tejun Heo1a402432015-02-13 14:37:39 -0800124 seq_buf_printf(&s->seq, "%*pb", nmaskbits, maskp);
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400125
126 if (unlikely(seq_buf_has_overflowed(&s->seq))) {
127 s->seq.len = save_len;
128 s->full = 1;
129 }
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400130}
131EXPORT_SYMBOL_GPL(trace_seq_bitmask);
132
133/**
134 * trace_seq_vprintf - sequence printing of trace information
135 * @s: trace sequence descriptor
136 * @fmt: printf format string
137 *
138 * The tracer may use either sequence operations or its own
139 * copy to user routines. To simplify formating of a trace
140 * trace_seq_printf is used to store strings into a special
141 * buffer (@s). Then the output may be either used by
142 * the sequencer or pulled into another buffer.
143 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500144void trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400145{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400146 unsigned int save_len = s->seq.len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400147
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400148 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500149 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400150
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400151 __trace_seq_init(s);
152
153 seq_buf_vprintf(&s->seq, fmt, args);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400154
155 /* If we can't write it all, don't bother writing anything */
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400156 if (unlikely(seq_buf_has_overflowed(&s->seq))) {
157 s->seq.len = save_len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400158 s->full = 1;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400159 }
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400160}
161EXPORT_SYMBOL_GPL(trace_seq_vprintf);
162
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400163/**
164 * trace_seq_bprintf - Write the printf string from binary arguments
165 * @s: trace sequence descriptor
166 * @fmt: The format string for the @binary arguments
167 * @binary: The binary arguments for @fmt.
168 *
169 * When recording in a fast path, a printf may be recorded with just
170 * saving the format and the arguments as they were passed to the
171 * function, instead of wasting cycles converting the arguments into
172 * ASCII characters. Instead, the arguments are saved in a 32 bit
173 * word array that is defined by the format string constraints.
174 *
175 * This function will take the format and the binary array and finish
176 * the conversion into the ASCII string within the buffer.
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400177 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500178void trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400179{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400180 unsigned int save_len = s->seq.len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400181
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400182 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500183 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400184
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400185 __trace_seq_init(s);
186
187 seq_buf_bprintf(&s->seq, fmt, binary);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400188
189 /* If we can't write it all, don't bother writing anything */
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400190 if (unlikely(seq_buf_has_overflowed(&s->seq))) {
191 s->seq.len = save_len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400192 s->full = 1;
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500193 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400194 }
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400195}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400196EXPORT_SYMBOL_GPL(trace_seq_bprintf);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400197
198/**
199 * trace_seq_puts - trace sequence printing of simple string
200 * @s: trace sequence descriptor
201 * @str: simple string to record
202 *
203 * The tracer may use either the sequence operations or its own
204 * copy to user routines. This function records a simple string
205 * into a special buffer (@s) for later retrieval by a sequencer
206 * or other mechanism.
207 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500208void trace_seq_puts(struct trace_seq *s, const char *str)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400209{
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400210 unsigned int len = strlen(str);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400211
212 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500213 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400214
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400215 __trace_seq_init(s);
216
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400217 if (len > TRACE_SEQ_BUF_LEFT(s)) {
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400218 s->full = 1;
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500219 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400220 }
221
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400222 seq_buf_putmem(&s->seq, str, len);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400223}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400224EXPORT_SYMBOL_GPL(trace_seq_puts);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400225
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400226/**
227 * trace_seq_putc - trace sequence printing of simple character
228 * @s: trace sequence descriptor
229 * @c: simple character to record
230 *
231 * The tracer may use either the sequence operations or its own
232 * copy to user routines. This function records a simple charater
233 * into a special buffer (@s) for later retrieval by a sequencer
234 * or other mechanism.
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400235 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500236void trace_seq_putc(struct trace_seq *s, unsigned char c)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400237{
238 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500239 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400240
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400241 __trace_seq_init(s);
242
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400243 if (TRACE_SEQ_BUF_LEFT(s) < 1) {
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400244 s->full = 1;
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500245 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400246 }
247
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400248 seq_buf_putc(&s->seq, c);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400249}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400250EXPORT_SYMBOL_GPL(trace_seq_putc);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400251
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400252/**
253 * trace_seq_putmem - write raw data into the trace_seq buffer
254 * @s: trace sequence descriptor
255 * @mem: The raw memory to copy into the buffer
256 * @len: The length of the raw memory to copy (in bytes)
257 *
258 * There may be cases where raw memory needs to be written into the
259 * buffer and a strcpy() would not work. Using this function allows
260 * for such cases.
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400261 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500262void trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400263{
264 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500265 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400266
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400267 __trace_seq_init(s);
268
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400269 if (len > TRACE_SEQ_BUF_LEFT(s)) {
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400270 s->full = 1;
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500271 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400272 }
273
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400274 seq_buf_putmem(&s->seq, mem, len);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400275}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400276EXPORT_SYMBOL_GPL(trace_seq_putmem);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400277
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400278/**
279 * trace_seq_putmem_hex - write raw memory into the buffer in ASCII hex
280 * @s: trace sequence descriptor
281 * @mem: The raw memory to write its hex ASCII representation of
282 * @len: The length of the raw memory to copy (in bytes)
283 *
284 * This is similar to trace_seq_putmem() except instead of just copying the
285 * raw memory into the buffer it writes its ASCII representation of it
286 * in hex characters.
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400287 */
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500288void trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400289 unsigned int len)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400290{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400291 unsigned int save_len = s->seq.len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400292
293 if (s->full)
Steven Rostedt (Red Hat)dba39442014-11-12 18:07:22 -0500294 return;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400295
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400296 __trace_seq_init(s);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400297
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400298 /* Each byte is represented by two chars */
299 if (len * 2 > TRACE_SEQ_BUF_LEFT(s)) {
300 s->full = 1;
301 return;
302 }
Steven Rostedt (Red Hat)6d2289f2014-06-20 23:31:26 -0400303
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400304 /* The added spaces can still cause an overflow */
305 seq_buf_putmem_hex(&s->seq, mem, len);
306
307 if (unlikely(seq_buf_has_overflowed(&s->seq))) {
308 s->seq.len = save_len;
309 s->full = 1;
310 return;
Steven Rostedt (Red Hat)6d2289f2014-06-20 23:31:26 -0400311 }
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400312}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400313EXPORT_SYMBOL_GPL(trace_seq_putmem_hex);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400314
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400315/**
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400316 * trace_seq_path - copy a path into the sequence buffer
317 * @s: trace sequence descriptor
318 * @path: path to write into the sequence buffer.
319 *
320 * Write a path name into the sequence buffer.
321 *
322 * Returns 1 if we successfully written all the contents to
323 * the buffer.
324 * Returns 0 if we the length to write is bigger than the
325 * reserved buffer space. In this case, nothing gets written.
326 */
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400327int trace_seq_path(struct trace_seq *s, const struct path *path)
328{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400329 unsigned int save_len = s->seq.len;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400330
331 if (s->full)
332 return 0;
333
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400334 __trace_seq_init(s);
335
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400336 if (TRACE_SEQ_BUF_LEFT(s) < 1) {
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400337 s->full = 1;
338 return 0;
339 }
340
Steven Rostedt (Red Hat)dd231802014-10-29 13:48:37 -0400341 seq_buf_path(&s->seq, path, "\n");
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400342
343 if (unlikely(seq_buf_has_overflowed(&s->seq))) {
344 s->seq.len = save_len;
345 s->full = 1;
346 return 0;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400347 }
348
Steven Rostedt (Red Hat)dd231802014-10-29 13:48:37 -0400349 return 1;
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400350}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400351EXPORT_SYMBOL_GPL(trace_seq_path);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400352
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400353/**
354 * trace_seq_to_user - copy the squence buffer to user space
355 * @s: trace sequence descriptor
356 * @ubuf: The userspace memory location to copy to
357 * @cnt: The amount to copy
358 *
359 * Copies the sequence buffer into the userspace memory pointed to
360 * by @ubuf. It starts from the last read position (@s->readpos)
361 * and writes up to @cnt characters or till it reaches the end of
362 * the content in the buffer (@s->len), which ever comes first.
363 *
364 * On success, it returns a positive number of the number of bytes
365 * it copied.
366 *
367 * On failure it returns -EBUSY if all of the content in the
368 * sequence has been already read, which includes nothing in the
369 * sequenc (@s->len == @s->readpos).
370 *
371 * Returns -EFAULT if the copy to userspace fails.
372 */
373int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, int cnt)
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400374{
Steven Rostedt (Red Hat)3a161d92014-06-25 15:54:42 -0400375 __trace_seq_init(s);
376 return seq_buf_to_user(&s->seq, ubuf, cnt);
Steven Rostedt (Red Hat)12306272014-06-20 13:38:54 -0400377}
Steven Rostedt (Red Hat)36aabff2014-06-20 17:38:01 -0400378EXPORT_SYMBOL_GPL(trace_seq_to_user);