diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-12-04 02:52:14 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-12-04 02:52:14 -0500 |
| commit | cb9c34e6d090d376b77becaa5d29a65dec7f4272 (patch) | |
| tree | 3678abce20d6825aebe3fec218057d4131e13fd6 /kernel/trace/trace_stack.c | |
| parent | 470c66239ef0336429b35345f3f615d47341e13b (diff) | |
| parent | 061e41fdb5047b1fb161e89664057835935ca1d2 (diff) | |
Merge commit 'v2.6.28-rc7' into core/locking
Diffstat (limited to 'kernel/trace/trace_stack.c')
| -rw-r--r-- | kernel/trace/trace_stack.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/kernel/trace/trace_stack.c b/kernel/trace/trace_stack.c index be682b62fe58..3bdb44bde4b7 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
| @@ -184,11 +184,16 @@ static struct file_operations stack_max_size_fops = { | |||
| 184 | static void * | 184 | static void * |
| 185 | t_next(struct seq_file *m, void *v, loff_t *pos) | 185 | t_next(struct seq_file *m, void *v, loff_t *pos) |
| 186 | { | 186 | { |
| 187 | long i = (long)m->private; | 187 | long i; |
| 188 | 188 | ||
| 189 | (*pos)++; | 189 | (*pos)++; |
| 190 | 190 | ||
| 191 | i++; | 191 | if (v == SEQ_START_TOKEN) |
| 192 | i = 0; | ||
| 193 | else { | ||
| 194 | i = *(long *)v; | ||
| 195 | i++; | ||
| 196 | } | ||
| 192 | 197 | ||
| 193 | if (i >= max_stack_trace.nr_entries || | 198 | if (i >= max_stack_trace.nr_entries || |
| 194 | stack_dump_trace[i] == ULONG_MAX) | 199 | stack_dump_trace[i] == ULONG_MAX) |
| @@ -201,12 +206,15 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
| 201 | 206 | ||
| 202 | static void *t_start(struct seq_file *m, loff_t *pos) | 207 | static void *t_start(struct seq_file *m, loff_t *pos) |
| 203 | { | 208 | { |
| 204 | void *t = &m->private; | 209 | void *t = SEQ_START_TOKEN; |
| 205 | loff_t l = 0; | 210 | loff_t l = 0; |
| 206 | 211 | ||
| 207 | local_irq_disable(); | 212 | local_irq_disable(); |
| 208 | __raw_spin_lock(&max_stack_lock); | 213 | __raw_spin_lock(&max_stack_lock); |
| 209 | 214 | ||
| 215 | if (*pos == 0) | ||
| 216 | return SEQ_START_TOKEN; | ||
| 217 | |||
| 210 | for (; t && l < *pos; t = t_next(m, t, &l)) | 218 | for (; t && l < *pos; t = t_next(m, t, &l)) |
| 211 | ; | 219 | ; |
| 212 | 220 | ||
| @@ -235,10 +243,10 @@ static int trace_lookup_stack(struct seq_file *m, long i) | |||
| 235 | 243 | ||
| 236 | static int t_show(struct seq_file *m, void *v) | 244 | static int t_show(struct seq_file *m, void *v) |
| 237 | { | 245 | { |
| 238 | long i = *(long *)v; | 246 | long i; |
| 239 | int size; | 247 | int size; |
| 240 | 248 | ||
| 241 | if (i < 0) { | 249 | if (v == SEQ_START_TOKEN) { |
| 242 | seq_printf(m, " Depth Size Location" | 250 | seq_printf(m, " Depth Size Location" |
| 243 | " (%d entries)\n" | 251 | " (%d entries)\n" |
| 244 | " ----- ---- --------\n", | 252 | " ----- ---- --------\n", |
| @@ -246,6 +254,8 @@ static int t_show(struct seq_file *m, void *v) | |||
| 246 | return 0; | 254 | return 0; |
| 247 | } | 255 | } |
| 248 | 256 | ||
| 257 | i = *(long *)v; | ||
| 258 | |||
| 249 | if (i >= max_stack_trace.nr_entries || | 259 | if (i >= max_stack_trace.nr_entries || |
| 250 | stack_dump_trace[i] == ULONG_MAX) | 260 | stack_dump_trace[i] == ULONG_MAX) |
| 251 | return 0; | 261 | return 0; |
| @@ -275,10 +285,6 @@ static int stack_trace_open(struct inode *inode, struct file *file) | |||
| 275 | int ret; | 285 | int ret; |
| 276 | 286 | ||
| 277 | ret = seq_open(file, &stack_trace_seq_ops); | 287 | ret = seq_open(file, &stack_trace_seq_ops); |
| 278 | if (!ret) { | ||
| 279 | struct seq_file *m = file->private_data; | ||
| 280 | m->private = (void *)-1; | ||
| 281 | } | ||
| 282 | 288 | ||
| 283 | return ret; | 289 | return ret; |
| 284 | } | 290 | } |
