Messages in this thread Patch in this message | | | Date | Tue, 18 Aug 2009 21:01:08 -0400 (EDT) | From | Steven Rostedt <> | Subject | Re: [PATCH] tracing: FTRACE_ITER_CONT handling fix |
| |
On Tue, 11 Aug 2009, Jiri Olsa wrote:
> Hi, > > if one filter item (for set_ftrace_filter and set_ftrace_notrace) is being > setup by more than 1 consecutive writes (FTRACE_ITER_CONT flag), it won't > be handled corretly. > > I used following program to test/verify: > > [snip] > #include <stdio.h> > #include <sys/types.h> > #include <sys/stat.h> > #include <fcntl.h> > #include <string.h> > > int main(int argc, char **argv) > { > int fd, i; > char *file = argv[1]; > > if (-1 == (fd = open(file, O_WRONLY))) { > perror("open failed"); > return -1; > } > > for(i = 0; i < (argc - 2); i++) { > int len = strlen(argv[2+i]); > int cnt, off = 0; > > while(len) { > cnt = write(fd, argv[2+i] + off, len); > len -= cnt; > off += cnt; > } > } > > close(fd); > return 0; > } > [snip]
BTW, you did not need to make such a test, just doing:
# echo sys_open | dd of=set_ftrace_filter bs=2
works as well.
> > before change: > sh-4.0# echo > ./set_ftrace_filter > sh-4.0# /test ./set_ftrace_filter "sys" "_open " > sh-4.0# cat ./set_ftrace_filter > #### all functions enabled #### > sh-4.0# > > after change: > sh-4.0# echo > ./set_ftrace_notrace > sh-4.0# test ./set_ftrace_notrace "sys" "_open " > sh-4.0# cat ./set_ftrace_notrace > sys_open > sh-4.0# > > wbr, > jirka > > > Signed-off-by: Jiri Olsa <jolsa@redhat.com>
Thanks, applied!
-- Steve
> > --- > diff --git a/kernel/trace/ftrace.c b/kernel/trace/ftrace.c > index 0948634..da0757a 100644 > --- a/kernel/trace/ftrace.c > +++ b/kernel/trace/ftrace.c > @@ -2233,7 +2233,11 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, > read++; > cnt--; > > - if (!(iter->flags & ~FTRACE_ITER_CONT)) { > + /* > + * If the parser haven't finished with the last write, > + * continue reading the user input without skipping spaces. > + */ > + if (!(iter->flags & FTRACE_ITER_CONT)) { > /* skip white space */ > while (cnt && isspace(ch)) { > ret = get_user(ch, ubuf++); > @@ -2243,8 +2247,9 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, > cnt--; > } > > + /* only spaces were written */ > if (isspace(ch)) { > - file->f_pos += read; > + *ppos += read; > ret = read; > goto out; > } > @@ -2273,12 +2278,12 @@ ftrace_regex_write(struct file *file, const char __user *ubuf, > if (ret) > goto out; > iter->buffer_idx = 0; > - } else > + } else { > iter->flags |= FTRACE_ITER_CONT; > + iter->buffer[iter->buffer_idx++] = ch; > + } > > - > - file->f_pos += read; > - > + *ppos += read; > ret = read; > out: > mutex_unlock(&ftrace_regex_lock); >
| |