diff options
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 d39e8b7de6a..fde3be15c64 100644 --- a/kernel/trace/trace_stack.c +++ b/kernel/trace/trace_stack.c | |||
@@ -180,11 +180,16 @@ static struct file_operations stack_max_size_fops = { | |||
180 | static void * | 180 | static void * |
181 | t_next(struct seq_file *m, void *v, loff_t *pos) | 181 | t_next(struct seq_file *m, void *v, loff_t *pos) |
182 | { | 182 | { |
183 | long i = (long)m->private; | 183 | long i; |
184 | 184 | ||
185 | (*pos)++; | 185 | (*pos)++; |
186 | 186 | ||
187 | i++; | 187 | if (v == SEQ_START_TOKEN) |
188 | i = 0; | ||
189 | else { | ||
190 | i = *(long *)v; | ||
191 | i++; | ||
192 | } | ||
188 | 193 | ||
189 | if (i >= max_stack_trace.nr_entries || | 194 | if (i >= max_stack_trace.nr_entries || |
190 | stack_dump_trace[i] == ULONG_MAX) | 195 | stack_dump_trace[i] == ULONG_MAX) |
@@ -197,12 +202,15 @@ t_next(struct seq_file *m, void *v, loff_t *pos) | |||
197 | 202 | ||
198 | static void *t_start(struct seq_file *m, loff_t *pos) | 203 | static void *t_start(struct seq_file *m, loff_t *pos) |
199 | { | 204 | { |
200 | void *t = &m->private; | 205 | void *t = SEQ_START_TOKEN; |
201 | loff_t l = 0; | 206 | loff_t l = 0; |
202 | 207 | ||
203 | local_irq_disable(); | 208 | local_irq_disable(); |
204 | __raw_spin_lock(&max_stack_lock); | 209 | __raw_spin_lock(&max_stack_lock); |
205 | 210 | ||
211 | if (*pos == 0) | ||
212 | return SEQ_START_TOKEN; | ||
213 | |||
206 | for (; t && l < *pos; t = t_next(m, t, &l)) | 214 | for (; t && l < *pos; t = t_next(m, t, &l)) |
207 | ; | 215 | ; |
208 | 216 | ||
@@ -231,10 +239,10 @@ static int trace_lookup_stack(struct seq_file *m, long i) | |||
231 | 239 | ||
232 | static int t_show(struct seq_file *m, void *v) | 240 | static int t_show(struct seq_file *m, void *v) |
233 | { | 241 | { |
234 | long i = *(long *)v; | 242 | long i; |
235 | int size; | 243 | int size; |
236 | 244 | ||
237 | if (i < 0) { | 245 | if (v == SEQ_START_TOKEN) { |
238 | seq_printf(m, " Depth Size Location" | 246 | seq_printf(m, " Depth Size Location" |
239 | " (%d entries)\n" | 247 | " (%d entries)\n" |
240 | " ----- ---- --------\n", | 248 | " ----- ---- --------\n", |
@@ -242,6 +250,8 @@ static int t_show(struct seq_file *m, void *v) | |||
242 | return 0; | 250 | return 0; |
243 | } | 251 | } |
244 | 252 | ||
253 | i = *(long *)v; | ||
254 | |||
245 | if (i >= max_stack_trace.nr_entries || | 255 | if (i >= max_stack_trace.nr_entries || |
246 | stack_dump_trace[i] == ULONG_MAX) | 256 | stack_dump_trace[i] == ULONG_MAX) |
247 | return 0; | 257 | return 0; |
@@ -271,10 +281,6 @@ static int stack_trace_open(struct inode *inode, struct file *file) | |||
271 | int ret; | 281 | int ret; |
272 | 282 | ||
273 | ret = seq_open(file, &stack_trace_seq_ops); | 283 | ret = seq_open(file, &stack_trace_seq_ops); |
274 | if (!ret) { | ||
275 | struct seq_file *m = file->private_data; | ||
276 | m->private = (void *)-1; | ||
277 | } | ||
278 | 284 | ||
279 | return ret; | 285 | return ret; |
280 | } | 286 | } |