trace_output.c (f01387d2693813eb5271a3448e6a082322c7d75d) | trace_output.c (12306276fabcb746a14979e96f43a13c724dec49) |
---|---|
1/* 2 * trace_output.c 3 * 4 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 5 * 6 */ 7 8#include <linux/module.h> --- 6 unchanged lines hidden (view full) --- 15#define EVENT_HASHSIZE 128 16 17DECLARE_RWSEM(trace_event_sem); 18 19static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly; 20 21static int next_event_type = __TRACE_LAST_TYPE + 1; 22 | 1/* 2 * trace_output.c 3 * 4 * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <srostedt@redhat.com> 5 * 6 */ 7 8#include <linux/module.h> --- 6 unchanged lines hidden (view full) --- 15#define EVENT_HASHSIZE 128 16 17DECLARE_RWSEM(trace_event_sem); 18 19static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly; 20 21static int next_event_type = __TRACE_LAST_TYPE + 1; 22 |
23int trace_print_seq(struct seq_file *m, struct trace_seq *s) 24{ 25 int len = s->len >= PAGE_SIZE ? PAGE_SIZE - 1 : s->len; 26 int ret; 27 28 ret = seq_write(m, s->buffer, len); 29 30 /* 31 * Only reset this buffer if we successfully wrote to the 32 * seq_file buffer. 33 */ 34 if (!ret) 35 trace_seq_init(s); 36 37 return ret; 38} 39 | |
40enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter) 41{ 42 struct trace_seq *s = &iter->seq; 43 struct trace_entry *entry = iter->ent; 44 struct bputs_entry *field; 45 int ret; 46 47 trace_assign_type(field, entry); --- 32 unchanged lines hidden (view full) --- 80 81 ret = trace_seq_puts(s, field->buf); 82 if (!ret) 83 return TRACE_TYPE_PARTIAL_LINE; 84 85 return TRACE_TYPE_HANDLED; 86} 87 | 23enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter) 24{ 25 struct trace_seq *s = &iter->seq; 26 struct trace_entry *entry = iter->ent; 27 struct bputs_entry *field; 28 int ret; 29 30 trace_assign_type(field, entry); --- 32 unchanged lines hidden (view full) --- 63 64 ret = trace_seq_puts(s, field->buf); 65 if (!ret) 66 return TRACE_TYPE_PARTIAL_LINE; 67 68 return TRACE_TYPE_HANDLED; 69} 70 |
88/** 89 * trace_seq_printf - sequence printing of trace information 90 * @s: trace sequence descriptor 91 * @fmt: printf format string 92 * 93 * It returns 0 if the trace oversizes the buffer's free 94 * space, 1 otherwise. 95 * 96 * The tracer may use either sequence operations or its own 97 * copy to user routines. To simplify formating of a trace 98 * trace_seq_printf is used to store strings into a special 99 * buffer (@s). Then the output may be either used by 100 * the sequencer or pulled into another buffer. 101 */ 102int 103trace_seq_printf(struct trace_seq *s, const char *fmt, ...) 104{ 105 int len = (PAGE_SIZE - 1) - s->len; 106 va_list ap; 107 int ret; 108 109 if (s->full || !len) 110 return 0; 111 112 va_start(ap, fmt); 113 ret = vsnprintf(s->buffer + s->len, len, fmt, ap); 114 va_end(ap); 115 116 /* If we can't write it all, don't bother writing anything */ 117 if (ret >= len) { 118 s->full = 1; 119 return 0; 120 } 121 122 s->len += ret; 123 124 return 1; 125} 126EXPORT_SYMBOL_GPL(trace_seq_printf); 127 128/** 129 * trace_seq_vprintf - sequence printing of trace information 130 * @s: trace sequence descriptor 131 * @fmt: printf format string 132 * 133 * The tracer may use either sequence operations or its own 134 * copy to user routines. To simplify formating of a trace 135 * trace_seq_printf is used to store strings into a special 136 * buffer (@s). Then the output may be either used by 137 * the sequencer or pulled into another buffer. 138 */ 139int 140trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args) 141{ 142 int len = (PAGE_SIZE - 1) - s->len; 143 int ret; 144 145 if (s->full || !len) 146 return 0; 147 148 ret = vsnprintf(s->buffer + s->len, len, fmt, args); 149 150 /* If we can't write it all, don't bother writing anything */ 151 if (ret >= len) { 152 s->full = 1; 153 return 0; 154 } 155 156 s->len += ret; 157 158 return len; 159} 160EXPORT_SYMBOL_GPL(trace_seq_vprintf); 161 162int trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) 163{ 164 int len = (PAGE_SIZE - 1) - s->len; 165 int ret; 166 167 if (s->full || !len) 168 return 0; 169 170 ret = bstr_printf(s->buffer + s->len, len, fmt, binary); 171 172 /* If we can't write it all, don't bother writing anything */ 173 if (ret >= len) { 174 s->full = 1; 175 return 0; 176 } 177 178 s->len += ret; 179 180 return len; 181} 182 183/** 184 * trace_seq_puts - trace sequence printing of simple string 185 * @s: trace sequence descriptor 186 * @str: simple string to record 187 * 188 * The tracer may use either the sequence operations or its own 189 * copy to user routines. This function records a simple string 190 * into a special buffer (@s) for later retrieval by a sequencer 191 * or other mechanism. 192 */ 193int trace_seq_puts(struct trace_seq *s, const char *str) 194{ 195 int len = strlen(str); 196 197 if (s->full) 198 return 0; 199 200 if (len > ((PAGE_SIZE - 1) - s->len)) { 201 s->full = 1; 202 return 0; 203 } 204 205 memcpy(s->buffer + s->len, str, len); 206 s->len += len; 207 208 return len; 209} 210 211int trace_seq_putc(struct trace_seq *s, unsigned char c) 212{ 213 if (s->full) 214 return 0; 215 216 if (s->len >= (PAGE_SIZE - 1)) { 217 s->full = 1; 218 return 0; 219 } 220 221 s->buffer[s->len++] = c; 222 223 return 1; 224} 225EXPORT_SYMBOL(trace_seq_putc); 226 227int trace_seq_putmem(struct trace_seq *s, const void *mem, size_t len) 228{ 229 if (s->full) 230 return 0; 231 232 if (len > ((PAGE_SIZE - 1) - s->len)) { 233 s->full = 1; 234 return 0; 235 } 236 237 memcpy(s->buffer + s->len, mem, len); 238 s->len += len; 239 240 return len; 241} 242 243int trace_seq_putmem_hex(struct trace_seq *s, const void *mem, size_t len) 244{ 245 unsigned char hex[HEX_CHARS]; 246 const unsigned char *data = mem; 247 int i, j; 248 249 if (s->full) 250 return 0; 251 252#ifdef __BIG_ENDIAN 253 for (i = 0, j = 0; i < len; i++) { 254#else 255 for (i = len-1, j = 0; i >= 0; i--) { 256#endif 257 hex[j++] = hex_asc_hi(data[i]); 258 hex[j++] = hex_asc_lo(data[i]); 259 } 260 hex[j++] = ' '; 261 262 return trace_seq_putmem(s, hex, j); 263} 264 265void *trace_seq_reserve(struct trace_seq *s, size_t len) 266{ 267 void *ret; 268 269 if (s->full) 270 return NULL; 271 272 if (len > ((PAGE_SIZE - 1) - s->len)) { 273 s->full = 1; 274 return NULL; 275 } 276 277 ret = s->buffer + s->len; 278 s->len += len; 279 280 return ret; 281} 282 283int trace_seq_path(struct trace_seq *s, const struct path *path) 284{ 285 unsigned char *p; 286 287 if (s->full) 288 return 0; 289 290 if (s->len >= (PAGE_SIZE - 1)) { 291 s->full = 1; 292 return 0; 293 } 294 295 p = d_path(path, s->buffer + s->len, PAGE_SIZE - s->len); 296 if (!IS_ERR(p)) { 297 p = mangle_path(s->buffer + s->len, p, "\n"); 298 if (p) { 299 s->len = p - s->buffer; 300 return 1; 301 } 302 } else { 303 s->buffer[s->len++] = '?'; 304 return 1; 305 } 306 307 s->full = 1; 308 return 0; 309} 310 | |
311const char * 312ftrace_print_flags_seq(struct trace_seq *p, const char *delim, 313 unsigned long flags, 314 const struct trace_print_flags *flag_array) 315{ 316 unsigned long mask; 317 const char *str; 318 const char *ret = p->buffer + p->len; --- 75 unchanged lines hidden (view full) --- 394 trace_seq_putc(p, 0); 395 396 return ret; 397} 398EXPORT_SYMBOL(ftrace_print_symbols_seq_u64); 399#endif 400 401const char * | 71const char * 72ftrace_print_flags_seq(struct trace_seq *p, const char *delim, 73 unsigned long flags, 74 const struct trace_print_flags *flag_array) 75{ 76 unsigned long mask; 77 const char *str; 78 const char *ret = p->buffer + p->len; --- 75 unchanged lines hidden (view full) --- 154 trace_seq_putc(p, 0); 155 156 return ret; 157} 158EXPORT_SYMBOL(ftrace_print_symbols_seq_u64); 159#endif 160 161const char * |
162ftrace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr, 163 unsigned int bitmask_size) 164{ 165 const char *ret = p->buffer + p->len; 166 167 trace_seq_bitmask(p, bitmask_ptr, bitmask_size * 8); 168 trace_seq_putc(p, 0); 169 170 return ret; 171} 172EXPORT_SYMBOL_GPL(ftrace_print_bitmask_seq); 173 174const char * |
|
402ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len) 403{ 404 int i; 405 const char *ret = p->buffer + p->len; 406 407 for (i = 0; i < buf_len; i++) 408 trace_seq_printf(p, "%s%2.2x", i == 0 ? "" : " ", buf[i]); 409 --- 1093 unchanged lines hidden --- | 175ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len) 176{ 177 int i; 178 const char *ret = p->buffer + p->len; 179 180 for (i = 0; i < buf_len; i++) 181 trace_seq_printf(p, "%s%2.2x", i == 0 ? "" : " ", buf[i]); 182 --- 1093 unchanged lines hidden --- |