Blame view

kernel/trace/trace_seq.c 9.88 KB
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
1
2
3
4
5
  /*
   * trace_seq.c
   *
   * Copyright (C) 2008-2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
   *
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
   * The trace_seq is a handy tool that allows you to pass a descriptor around
   * to a buffer that other functions can write to. It is similar to the
   * seq_file functionality but has some differences.
   *
   * To use it, the trace_seq must be initialized with trace_seq_init().
   * This will set up the counters within the descriptor. You can call
   * trace_seq_init() more than once to reset the trace_seq to start
   * from scratch.
   * 
   * The buffer size is currently PAGE_SIZE, although it may become dynamic
   * in the future.
   *
   * A write to the buffer will either succed or fail. That is, unlike
   * sprintf() there will not be a partial write (well it may write into
   * the buffer but it wont update the pointers). This allows users to
   * try to write something into the trace_seq buffer and if it fails
   * they can flush it and try again.
   *
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
24
25
26
27
   */
  #include <linux/uaccess.h>
  #include <linux/seq_file.h>
  #include <linux/trace_seq.h>
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
28
  /* How much buffer is left on the trace_seq? */
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
29
  #define TRACE_SEQ_BUF_LEFT(s) seq_buf_buffer_left(&(s)->seq)
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
30
31
  
  /* How much buffer is written? */
5ac483784   Steven Rostedt (Red Hat)   tracing: Use trac...
32
  #define TRACE_SEQ_BUF_USED(s) seq_buf_used(&(s)->seq)
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
33
34
35
36
37
38
39
40
41
  
  /*
   * trace_seq should work with being initialized with 0s.
   */
  static inline void __trace_seq_init(struct trace_seq *s)
  {
  	if (unlikely(!s->seq.size))
  		trace_seq_init(s);
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
42
43
44
45
46
47
48
49
50
51
  
  /**
   * trace_print_seq - move the contents of trace_seq into a seq_file
   * @m: the seq_file descriptor that is the destination
   * @s: the trace_seq descriptor that is the source.
   *
   * Returns 0 on success and non zero on error. If it succeeds to
   * write to the seq_file it will reset the trace_seq, otherwise
   * it does not modify the trace_seq to let the caller try again.
   */
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
52
53
  int trace_print_seq(struct seq_file *m, struct trace_seq *s)
  {
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
54
  	int ret;
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
55
56
57
  	__trace_seq_init(s);
  
  	ret = seq_buf_print_seq(m, &s->seq);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
58
59
60
  
  	/*
  	 * Only reset this buffer if we successfully wrote to the
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
61
62
  	 * seq_file buffer. This lets the caller try again or
  	 * do something else with the contents.
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
63
64
65
66
67
68
69
70
71
72
73
74
  	 */
  	if (!ret)
  		trace_seq_init(s);
  
  	return ret;
  }
  
  /**
   * trace_seq_printf - sequence printing of trace information
   * @s: trace sequence descriptor
   * @fmt: printf format string
   *
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
75
76
   * The tracer may use either sequence operations or its own
   * copy to user routines. To simplify formating of a trace
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
77
   * trace_seq_printf() is used to store strings into a special
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
78
79
80
   * buffer (@s). Then the output may be either used by
   * the sequencer or pulled into another buffer.
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
81
  void trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
82
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
83
  	unsigned int save_len = s->seq.len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
84
  	va_list ap;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
85

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
86
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
87
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
88

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
89
  	__trace_seq_init(s);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
90
  	va_start(ap, fmt);
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
91
  	seq_buf_vprintf(&s->seq, fmt, ap);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
92
93
94
  	va_end(ap);
  
  	/* If we can't write it all, don't bother writing anything */
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
95
96
  	if (unlikely(seq_buf_has_overflowed(&s->seq))) {
  		s->seq.len = save_len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
97
  		s->full = 1;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
98
  	}
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
99
100
101
102
  }
  EXPORT_SYMBOL_GPL(trace_seq_printf);
  
  /**
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
103
   * trace_seq_bitmask - write a bitmask array in its ASCII representation
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
104
105
106
107
   * @s:		trace sequence descriptor
   * @maskp:	points to an array of unsigned longs that represent a bitmask
   * @nmaskbits:	The number of bits that are valid in @maskp
   *
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
108
109
   * Writes a ASCII representation of a bitmask string into @s.
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
110
  void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
111
  		      int nmaskbits)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
112
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
113
  	unsigned int save_len = s->seq.len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
114

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
115
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
116
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
117

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
118
  	__trace_seq_init(s);
1a40243ba   Tejun Heo   tracing: use %*pb...
119
  	seq_buf_printf(&s->seq, "%*pb", nmaskbits, maskp);
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
120
121
122
123
124
  
  	if (unlikely(seq_buf_has_overflowed(&s->seq))) {
  		s->seq.len = save_len;
  		s->full = 1;
  	}
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
125
126
127
128
129
130
131
132
133
134
135
136
137
138
  }
  EXPORT_SYMBOL_GPL(trace_seq_bitmask);
  
  /**
   * trace_seq_vprintf - sequence printing of trace information
   * @s: trace sequence descriptor
   * @fmt: printf format string
   *
   * The tracer may use either sequence operations or its own
   * copy to user routines. To simplify formating of a trace
   * trace_seq_printf is used to store strings into a special
   * buffer (@s). Then the output may be either used by
   * the sequencer or pulled into another buffer.
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
139
  void trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
140
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
141
  	unsigned int save_len = s->seq.len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
142

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
143
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
144
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
145

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
146
147
148
  	__trace_seq_init(s);
  
  	seq_buf_vprintf(&s->seq, fmt, args);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
149
150
  
  	/* If we can't write it all, don't bother writing anything */
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
151
152
  	if (unlikely(seq_buf_has_overflowed(&s->seq))) {
  		s->seq.len = save_len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
153
  		s->full = 1;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
154
  	}
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
155
156
  }
  EXPORT_SYMBOL_GPL(trace_seq_vprintf);
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
157
158
159
160
161
162
163
164
165
166
167
168
169
170
  /**
   * trace_seq_bprintf - Write the printf string from binary arguments
   * @s: trace sequence descriptor
   * @fmt: The format string for the @binary arguments
   * @binary: The binary arguments for @fmt.
   *
   * When recording in a fast path, a printf may be recorded with just
   * saving the format and the arguments as they were passed to the
   * function, instead of wasting cycles converting the arguments into
   * ASCII characters. Instead, the arguments are saved in a 32 bit
   * word array that is defined by the format string constraints.
   *
   * This function will take the format and the binary array and finish
   * the conversion into the ASCII string within the buffer.
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
171
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
172
  void trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
173
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
174
  	unsigned int save_len = s->seq.len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
175

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
176
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
177
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
178

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
179
180
181
  	__trace_seq_init(s);
  
  	seq_buf_bprintf(&s->seq, fmt, binary);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
182
183
  
  	/* If we can't write it all, don't bother writing anything */
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
184
185
  	if (unlikely(seq_buf_has_overflowed(&s->seq))) {
  		s->seq.len = save_len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
186
  		s->full = 1;
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
187
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
188
  	}
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
189
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
190
  EXPORT_SYMBOL_GPL(trace_seq_bprintf);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
191
192
193
194
195
196
197
198
199
200
201
  
  /**
   * trace_seq_puts - trace sequence printing of simple string
   * @s: trace sequence descriptor
   * @str: simple string to record
   *
   * The tracer may use either the sequence operations or its own
   * copy to user routines. This function records a simple string
   * into a special buffer (@s) for later retrieval by a sequencer
   * or other mechanism.
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
202
  void trace_seq_puts(struct trace_seq *s, const char *str)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
203
  {
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
204
  	unsigned int len = strlen(str);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
205
206
  
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
207
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
208

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
209
  	__trace_seq_init(s);
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
210
  	if (len > TRACE_SEQ_BUF_LEFT(s)) {
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
211
  		s->full = 1;
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
212
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
213
  	}
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
214
  	seq_buf_putmem(&s->seq, str, len);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
215
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
216
  EXPORT_SYMBOL_GPL(trace_seq_puts);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
217

36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
218
219
220
221
222
223
224
225
226
  /**
   * trace_seq_putc - trace sequence printing of simple character
   * @s: trace sequence descriptor
   * @c: simple character to record
   *
   * The tracer may use either the sequence operations or its own
   * copy to user routines. This function records a simple charater
   * into a special buffer (@s) for later retrieval by a sequencer
   * or other mechanism.
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
227
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
228
  void trace_seq_putc(struct trace_seq *s, unsigned char c)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
229
230
  {
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
231
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
232

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
233
  	__trace_seq_init(s);
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
234
  	if (TRACE_SEQ_BUF_LEFT(s) < 1) {
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
235
  		s->full = 1;
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
236
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
237
  	}
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
238
  	seq_buf_putc(&s->seq, c);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
239
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
240
  EXPORT_SYMBOL_GPL(trace_seq_putc);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
241

36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
242
243
244
245
246
247
248
249
250
  /**
   * trace_seq_putmem - write raw data into the trace_seq buffer
   * @s: trace sequence descriptor
   * @mem: The raw memory to copy into the buffer
   * @len: The length of the raw memory to copy (in bytes)
   *
   * There may be cases where raw memory needs to be written into the
   * buffer and a strcpy() would not work. Using this function allows
   * for such cases.
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
251
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
252
  void trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
253
254
  {
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
255
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
256

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
257
  	__trace_seq_init(s);
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
258
  	if (len > TRACE_SEQ_BUF_LEFT(s)) {
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
259
  		s->full = 1;
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
260
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
261
  	}
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
262
  	seq_buf_putmem(&s->seq, mem, len);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
263
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
264
  EXPORT_SYMBOL_GPL(trace_seq_putmem);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
265

36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
266
267
268
269
270
271
272
273
274
  /**
   * trace_seq_putmem_hex - write raw memory into the buffer in ASCII hex
   * @s: trace sequence descriptor
   * @mem: The raw memory to write its hex ASCII representation of
   * @len: The length of the raw memory to copy (in bytes)
   *
   * This is similar to trace_seq_putmem() except instead of just copying the
   * raw memory into the buffer it writes its ASCII representation of it
   * in hex characters.
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
275
   */
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
276
  void trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
277
  			 unsigned int len)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
278
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
279
  	unsigned int save_len = s->seq.len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
280
281
  
  	if (s->full)
dba39448a   Steven Rostedt (Red Hat)   tracing: Remove r...
282
  		return;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
283

3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
  	__trace_seq_init(s);
  
  	/* Each byte is represented by two chars */
  	if (len * 2 > TRACE_SEQ_BUF_LEFT(s)) {
  		s->full = 1;
  		return;
  	}
  
  	/* The added spaces can still cause an overflow */
  	seq_buf_putmem_hex(&s->seq, mem, len);
  
  	if (unlikely(seq_buf_has_overflowed(&s->seq))) {
  		s->seq.len = save_len;
  		s->full = 1;
  		return;
6d2289f3f   Steven Rostedt (Red Hat)   tracing: Make tra...
299
  	}
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
300
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
301
  EXPORT_SYMBOL_GPL(trace_seq_putmem_hex);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
302

36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
303
  /**
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
304
305
306
307
308
309
310
311
312
313
314
   * trace_seq_path - copy a path into the sequence buffer
   * @s: trace sequence descriptor
   * @path: path to write into the sequence buffer.
   *
   * Write a path name into the sequence buffer.
   *
   * Returns 1 if we successfully written all the contents to
   *   the buffer.
   * Returns 0 if we the length to write is bigger than the
   *   reserved buffer space. In this case, nothing gets written.
   */
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
315
316
  int trace_seq_path(struct trace_seq *s, const struct path *path)
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
317
  	unsigned int save_len = s->seq.len;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
318
319
320
  
  	if (s->full)
  		return 0;
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
321
  	__trace_seq_init(s);
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
322
  	if (TRACE_SEQ_BUF_LEFT(s) < 1) {
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
323
324
325
  		s->full = 1;
  		return 0;
  	}
dd23180aa   Steven Rostedt (Red Hat)   tracing: Convert ...
326
327
  	seq_buf_path(&s->seq, path, "
  ");
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
328
329
330
331
332
  
  	if (unlikely(seq_buf_has_overflowed(&s->seq))) {
  		s->seq.len = save_len;
  		s->full = 1;
  		return 0;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
333
  	}
dd23180aa   Steven Rostedt (Red Hat)   tracing: Convert ...
334
  	return 1;
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
335
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
336
  EXPORT_SYMBOL_GPL(trace_seq_path);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
337

36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
  /**
   * trace_seq_to_user - copy the squence buffer to user space
   * @s: trace sequence descriptor
   * @ubuf: The userspace memory location to copy to
   * @cnt: The amount to copy
   *
   * Copies the sequence buffer into the userspace memory pointed to
   * by @ubuf. It starts from the last read position (@s->readpos)
   * and writes up to @cnt characters or till it reaches the end of
   * the content in the buffer (@s->len), which ever comes first.
   *
   * On success, it returns a positive number of the number of bytes
   * it copied.
   *
   * On failure it returns -EBUSY if all of the content in the
   * sequence has been already read, which includes nothing in the
   * sequenc (@s->len == @s->readpos).
   *
   * Returns -EFAULT if the copy to userspace fails.
   */
  int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, int cnt)
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
359
  {
3a161d99c   Steven Rostedt (Red Hat)   tracing: Create s...
360
361
  	__trace_seq_init(s);
  	return seq_buf_to_user(&s->seq, ubuf, cnt);
12306276f   Steven Rostedt (Red Hat)   tracing: Move the...
362
  }
36aabfff5   Steven Rostedt (Red Hat)   tracing: Clean up...
363
  EXPORT_SYMBOL_GPL(trace_seq_to_user);