Skip to content

Commit

Permalink
tracing: Clean up seqfile code for format file
Browse files Browse the repository at this point in the history
Remove the nasty hack that marks a pointer's LSB to distinguish common
fields from event fields. Replace it with a more sane approach.

Signed-off-by: Li Zefan <lizf@cn.fujitsu.com>
LKML-Reference: <4C6A23C2.9020606@cn.fujitsu.com>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
  • Loading branch information
Li Zefan authored and Steven Rostedt committed Aug 18, 2010
1 parent 351af07 commit 86397dc
Showing 1 changed file with 18 additions and 37 deletions.
55 changes: 18 additions & 37 deletions kernel/trace/trace_events.c
Original file line number Diff line number Diff line change
Expand Up @@ -600,21 +600,29 @@ system_enable_write(struct file *filp, const char __user *ubuf, size_t cnt,

enum {
FORMAT_HEADER = 1,
FORMAT_PRINTFMT = 2,
FORMAT_FIELD_SEPERATOR = 2,
FORMAT_PRINTFMT = 3,
};

static void *f_next(struct seq_file *m, void *v, loff_t *pos)
{
struct ftrace_event_call *call = m->private;
struct ftrace_event_field *field;
struct list_head *head;
struct list_head *common_head = &ftrace_common_fields;
struct list_head *head = trace_get_fields(call);

(*pos)++;

switch ((unsigned long)v) {
case FORMAT_HEADER:
head = &ftrace_common_fields;
if (unlikely(list_empty(common_head)))
return NULL;

field = list_entry(common_head->prev,
struct ftrace_event_field, link);
return field;

case FORMAT_FIELD_SEPERATOR:
if (unlikely(list_empty(head)))
return NULL;

Expand All @@ -626,31 +634,10 @@ static void *f_next(struct seq_file *m, void *v, loff_t *pos)
return NULL;
}

head = trace_get_fields(call);

/*
* To separate common fields from event fields, the
* LSB is set on the first event field. Clear it in case.
*/
v = (void *)((unsigned long)v & ~1L);

field = v;
/*
* If this is a common field, and at the end of the list, then
* continue with main list.
*/
if (field->link.prev == &ftrace_common_fields) {
if (unlikely(list_empty(head)))
return NULL;
field = list_entry(head->prev, struct ftrace_event_field, link);
/* Set the LSB to notify f_show to print an extra newline */
field = (struct ftrace_event_field *)
((unsigned long)field | 1);
return field;
}

/* If we are done tell f_show to print the format */
if (field->link.prev == head)
if (field->link.prev == common_head)
return (void *)FORMAT_FIELD_SEPERATOR;
else if (field->link.prev == head)
return (void *)FORMAT_PRINTFMT;

field = list_entry(field->link.prev, struct ftrace_event_field, link);
Expand Down Expand Up @@ -688,22 +675,16 @@ static int f_show(struct seq_file *m, void *v)
seq_printf(m, "format:\n");
return 0;

case FORMAT_FIELD_SEPERATOR:
seq_putc(m, '\n');
return 0;

case FORMAT_PRINTFMT:
seq_printf(m, "\nprint fmt: %s\n",
call->print_fmt);
return 0;
}

/*
* To separate common fields from event fields, the
* LSB is set on the first event field. Clear it and
* print a newline if it is set.
*/
if ((unsigned long)v & 1) {
seq_putc(m, '\n');
v = (void *)((unsigned long)v & ~1L);
}

field = v;

/*
Expand Down

0 comments on commit 86397dc

Please sign in to comment.