diff options
Diffstat (limited to 'kernel/trace/trace_stack.c')
| -rw-r--r-- | kernel/trace/trace_stack.c | 58 |
1 files changed, 19 insertions, 39 deletions
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index 2d7aebd71db..8504ac71e4e 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
| @@ -186,43 +186,33 @@ static const struct file_operations stack_max_size_fops = { | |||
| 186 | }; | 186 | }; |
| 187 | 187 | ||
| 188 | static void * | 188 | static void * |
| 189 | t_next(struct seq_file *m, void *v, loff_t *pos) | 189 | __next(struct seq_file *m, loff_t *pos) |
| 190 | { | 190 | { |
| 191 | long i; | 191 | long n = *pos - 1; |
| 192 | |||
| 193 | (*pos)++; | ||
| 194 | |||
| 195 | if (v == SEQ_START_TOKEN) | ||
| 196 | i = 0; | ||
| 197 | else { | ||
| 198 | i = *(long *)v; | ||
| 199 | i++; | ||
| 200 | } | ||
| 201 | 192 | ||
| 202 | if (i >= max_stack_trace.nr_entries || | 193 | if (n >= max_stack_trace.nr_entries || stack_dump_trace[n] == ULONG_MAX) |
| 203 | stack_dump_trace[i] == ULONG_MAX) | ||
| 204 | return NULL; | 194 | return NULL; |
| 205 | 195 | ||
| 206 | m->private = (void *)i; | 196 | m->private = (void *)n; |
| 207 | |||
| 208 | return &m->private; | 197 | return &m->private; |
| 209 | } | 198 | } |
| 210 | 199 | ||
| 211 | static void *t_start(struct seq_file *m, loff_t *pos) | 200 | static void * |
| 201 | t_next(struct seq_file *m, void *v, loff_t *pos) | ||
| 212 | { | 202 | { |
| 213 | void *t = SEQ_START_TOKEN; | 203 | (*pos)++; |
| 214 | loff_t l = 0; | 204 | return __next(m, pos); |
| 205 | } | ||
| 215 | 206 | ||
| 207 | static void *t_start(struct seq_file *m, loff_t *pos) | ||
| 208 | { | ||
| 216 | local_irq_disable(); | 209 | local_irq_disable(); |
| 217 | __raw_spin_lock(&max_stack_lock); | 210 | __raw_spin_lock(&max_stack_lock); |
| 218 | 211 | ||
| 219 | if (*pos == 0) | 212 | if (*pos == 0) |
| 220 | return SEQ_START_TOKEN; | 213 | return SEQ_START_TOKEN; |
| 221 | 214 | ||
| 222 | for (; t && l < *pos; t = t_next(m, t, &l)) | 215 | return __next(m, pos); |
| 223 | ; | ||
| 224 | |||
| 225 | return t; | ||
| 226 | } | 216 | } |
| 227 | 217 | ||
| 228 | static void t_stop(struct seq_file *m, void *p) | 218 | static void t_stop(struct seq_file *m, void *p) |
| @@ -234,15 +224,8 @@ static void t_stop(struct seq_file *m, void *p) | |||
| 234 | static int trace_lookup_stack(struct seq_file *m, long i) | 224 | static int trace_lookup_stack(struct seq_file *m, long i) |
| 235 | { | 225 | { |
| 236 | unsigned long addr = stack_dump_trace[i]; | 226 | unsigned long addr = stack_dump_trace[i]; |
| 237 | #ifdef CONFIG_KALLSYMS | ||
| 238 | char str[KSYM_SYMBOL_LEN]; | ||
| 239 | 227 | ||
| 240 | sprint_symbol(str, addr); | 228 | return seq_printf(m, "%pF\n", (void *)addr); |
| 241 | |||
| 242 | return seq_printf(m, "%s\n", str); | ||
| 243 | #else | ||
| 244 | return seq_printf(m, "%p\n", (void*)addr); | ||
| 245 | #endif | ||
| 246 | } | 229 | } |
| 247 | 230 | ||
| 248 | static void print_disabled(struct seq_file *m) | 231 | static void print_disabled(struct seq_file *m) |
| @@ -301,35 +284,32 @@ static const struct seq_operations stack_trace_seq_ops = { | |||
| 301 | 284 | ||
| 302 | static int stack_trace_open(struct inode *inode, struct file *file) | 285 | static int stack_trace_open(struct inode *inode, struct file *file) |
| 303 | { | 286 | { |
| 304 | int ret; | 287 | return seq_open(file, &stack_trace_seq_ops); |
| 305 | |||
| 306 | ret = seq_open(file, &stack_trace_seq_ops); | ||
| 307 | |||
| 308 | return ret; | ||
| 309 | } | 288 | } |
| 310 | 289 | ||
| 311 | static const struct file_operations stack_trace_fops = { | 290 | static const struct file_operations stack_trace_fops = { |
| 312 | .open = stack_trace_open, | 291 | .open = stack_trace_open, |
| 313 | .read = seq_read, | 292 | .read = seq_read, |
| 314 | .llseek = seq_lseek, | 293 | .llseek = seq_lseek, |
| 294 | .release = seq_release, | ||
| 315 | }; | 295 | }; |
| 316 | 296 | ||
| 317 | int | 297 | int |
| 318 | stack_trace_sysctl(struct ctl_table *table, int write, | 298 | stack_trace_sysctl(struct ctl_table *table, int write, |
| 319 | struct file *file, void __user *buffer, size_t *lenp, | 299 | void __user *buffer, size_t *lenp, |
| 320 | loff_t *ppos) | 300 | loff_t *ppos) |
| 321 | { | 301 | { |
| 322 | int ret; | 302 | int ret; |
| 323 | 303 | ||
| 324 | mutex_lock(&stack_sysctl_mutex); | 304 | mutex_lock(&stack_sysctl_mutex); |
| 325 | 305 | ||
| 326 | ret = proc_dointvec(table, write, file, buffer, lenp, ppos); | 306 | ret = proc_dointvec(table, write, buffer, lenp, ppos); |
| 327 | 307 | ||
| 328 | if (ret || !write || | 308 | if (ret || !write || |
| 329 | (last_stack_tracer_enabled == stack_tracer_enabled)) | 309 | (last_stack_tracer_enabled == !!stack_tracer_enabled)) |
| 330 | goto out; | 310 | goto out; |
| 331 | 311 | ||
| 332 | last_stack_tracer_enabled = stack_tracer_enabled; | 312 | last_stack_tracer_enabled = !!stack_tracer_enabled; |
| 333 | 313 | ||
| 334 | if (stack_tracer_enabled) | 314 | if (stack_tracer_enabled) |
| 335 | register_ftrace_function(&trace_ops); | 315 | register_ftrace_function(&trace_ops); |
