aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/trace/trace_stack.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/trace/trace_stack.c')
-rw-r--r--kernel/trace/trace_stack.c24
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 = {
180static void * 180static void *
181t_next(struct seq_file *m, void *v, loff_t *pos) 181t_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
198static void *t_start(struct seq_file *m, loff_t *pos) 203static 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
232static int t_show(struct seq_file *m, void *v) 240static 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}