diff options
Diffstat (limited to 'include/linux/trace_seq.h')
| -rw-r--r-- | include/linux/trace_seq.h | 77 | 
1 files changed, 49 insertions, 28 deletions
diff --git a/include/linux/trace_seq.h b/include/linux/trace_seq.h index ea6c9dea79e3..cfaf5a1d4bad 100644 --- a/include/linux/trace_seq.h +++ b/include/linux/trace_seq.h @@ -1,7 +1,7 @@  #ifndef _LINUX_TRACE_SEQ_H  #define _LINUX_TRACE_SEQ_H -#include <linux/fs.h> +#include <linux/seq_buf.h>  #include <asm/page.h> @@ -12,20 +12,36 @@  struct trace_seq {  	unsigned char		buffer[PAGE_SIZE]; -	unsigned int		len; -	unsigned int		readpos; +	struct seq_buf		seq;  	int			full;  };  static inline void  trace_seq_init(struct trace_seq *s)  { -	s->len = 0; -	s->readpos = 0; +	seq_buf_init(&s->seq, s->buffer, PAGE_SIZE);  	s->full = 0;  }  /** + * trace_seq_used - amount of actual data written to buffer + * @s: trace sequence descriptor + * + * Returns the amount of data written to the buffer. + * + * IMPORTANT! + * + * Use this instead of @s->seq.len if you need to pass the amount + * of data from the buffer to another buffer (userspace, or what not). + * The @s->seq.len on overflow is bigger than the buffer size and + * using it can cause access to undefined memory. + */ +static inline int trace_seq_used(struct trace_seq *s) +{ +	return seq_buf_used(&s->seq); +} + +/**   * trace_seq_buffer_ptr - return pointer to next location in buffer   * @s: trace sequence descriptor   * @@ -37,7 +53,19 @@ trace_seq_init(struct trace_seq *s)  static inline unsigned char *  trace_seq_buffer_ptr(struct trace_seq *s)  { -	return s->buffer + s->len; +	return s->buffer + seq_buf_used(&s->seq); +} + +/** + * trace_seq_has_overflowed - return true if the trace_seq took too much + * @s: trace sequence descriptor + * + * Returns true if too much data was added to the trace_seq and it is + * now full and will not take anymore. + */ +static inline bool trace_seq_has_overflowed(struct trace_seq *s) +{ +	return s->full || seq_buf_has_overflowed(&s->seq);  }  /* @@ -45,40 +73,37 @@ trace_seq_buffer_ptr(struct trace_seq *s)   */  #ifdef CONFIG_TRACING  extern __printf(2, 3) -int trace_seq_printf(struct trace_seq *s, const char *fmt, ...); +void trace_seq_printf(struct trace_seq *s, const char *fmt, ...);  extern __printf(2, 0) -int trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args); -extern int +void trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args); +extern void  trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary);  extern int trace_print_seq(struct seq_file *m, struct trace_seq *s);  extern int trace_seq_to_user(struct trace_seq *s, char __user *ubuf,  			     int cnt); -extern int trace_seq_puts(struct trace_seq *s, const char *str); -extern int trace_seq_putc(struct trace_seq *s, unsigned char c); -extern int trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len); -extern int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, +extern void trace_seq_puts(struct trace_seq *s, const char *str); +extern void trace_seq_putc(struct trace_seq *s, unsigned char c); +extern void trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len); +extern void trace_seq_putmem_hex(struct trace_seq *s, const void *mem,  				unsigned int len);  extern int trace_seq_path(struct trace_seq *s, const struct path *path); -extern int trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp, +extern void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,  			     int nmaskbits);  #else /* CONFIG_TRACING */ -static inline int trace_seq_printf(struct trace_seq *s, const char *fmt, ...) +static inline void trace_seq_printf(struct trace_seq *s, const char *fmt, ...)  { -	return 0;  } -static inline int +static inline void  trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)  { -	return 0;  } -static inline int +static inline void  trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,  		  int nmaskbits)  { -	return 0;  }  static inline int trace_print_seq(struct seq_file *m, struct trace_seq *s) @@ -90,23 +115,19 @@ static inline int trace_seq_to_user(struct trace_seq *s, char __user *ubuf,  {  	return 0;  } -static inline int trace_seq_puts(struct trace_seq *s, const char *str) +static inline void trace_seq_puts(struct trace_seq *s, const char *str)  { -	return 0;  } -static inline int trace_seq_putc(struct trace_seq *s, unsigned char c) +static inline void trace_seq_putc(struct trace_seq *s, unsigned char c)  { -	return 0;  } -static inline int +static inline void  trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len)  { -	return 0;  } -static inline int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, +static inline void trace_seq_putmem_hex(struct trace_seq *s, const void *mem,  				       unsigned int len)  { -	return 0;  }  static inline int trace_seq_path(struct trace_seq *s, const struct path *path)  {  |