|
@@ -673,7 +673,7 @@ static int __init ftrace_dyn_table_alloc(unsigned long num_to_init)
|
|
|
|
|
|
cnt = num_to_init / ENTRIES_PER_PAGE;
|
|
|
pr_info("ftrace: allocating %ld entries in %d pages\n",
|
|
|
- num_to_init, cnt);
|
|
|
+ num_to_init, cnt + 1);
|
|
|
|
|
|
for (i = 0; i < cnt; i++) {
|
|
|
pg->next = (void *)get_zeroed_page(GFP_KERNEL);
|
|
@@ -753,13 +753,11 @@ static void *t_start(struct seq_file *m, loff_t *pos)
|
|
|
void *p = NULL;
|
|
|
loff_t l = -1;
|
|
|
|
|
|
- if (*pos != iter->pos) {
|
|
|
- for (p = t_next(m, p, &l); p && l < *pos; p = t_next(m, p, &l))
|
|
|
- ;
|
|
|
- } else {
|
|
|
- l = *pos;
|
|
|
- p = t_next(m, p, &l);
|
|
|
- }
|
|
|
+ if (*pos > iter->pos)
|
|
|
+ *pos = iter->pos;
|
|
|
+
|
|
|
+ l = *pos;
|
|
|
+ p = t_next(m, p, &l);
|
|
|
|
|
|
return p;
|
|
|
}
|
|
@@ -770,15 +768,21 @@ static void t_stop(struct seq_file *m, void *p)
|
|
|
|
|
|
static int t_show(struct seq_file *m, void *v)
|
|
|
{
|
|
|
+ struct ftrace_iterator *iter = m->private;
|
|
|
struct dyn_ftrace *rec = v;
|
|
|
char str[KSYM_SYMBOL_LEN];
|
|
|
+ int ret = 0;
|
|
|
|
|
|
if (!rec)
|
|
|
return 0;
|
|
|
|
|
|
kallsyms_lookup(rec->ip, NULL, NULL, NULL, str);
|
|
|
|
|
|
- seq_printf(m, "%s\n", str);
|
|
|
+ ret = seq_printf(m, "%s\n", str);
|
|
|
+ if (ret < 0) {
|
|
|
+ iter->pos--;
|
|
|
+ iter->idx--;
|
|
|
+ }
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
@@ -804,7 +808,7 @@ ftrace_avail_open(struct inode *inode, struct file *file)
|
|
|
return -ENOMEM;
|
|
|
|
|
|
iter->pg = ftrace_pages_start;
|
|
|
- iter->pos = -1;
|
|
|
+ iter->pos = 0;
|
|
|
|
|
|
ret = seq_open(file, &show_ftrace_seq_ops);
|
|
|
if (!ret) {
|
|
@@ -891,7 +895,7 @@ ftrace_regex_open(struct inode *inode, struct file *file, int enable)
|
|
|
|
|
|
if (file->f_mode & FMODE_READ) {
|
|
|
iter->pg = ftrace_pages_start;
|
|
|
- iter->pos = -1;
|
|
|
+ iter->pos = 0;
|
|
|
iter->flags = enable ? FTRACE_ITER_FILTER :
|
|
|
FTRACE_ITER_NOTRACE;
|
|
|
|