Skip to content

Commit

Permalink
tools lib traceevent: Print event name when show warning if possible
Browse files Browse the repository at this point in the history
It's sometimes useful to know where the parse failure was occurred.  Add
do_warning_event() macro to see the failing event.

It now shows the messages like below:

  $ perf test 5
   5: parse events tests                                     :  Warning: [kvmmmu:kvm_mmu_get_page] bad op token {
    Warning: [kvmmmu:kvm_mmu_sync_page] bad op token {
    Warning: [kvmmmu:kvm_mmu_unsync_page] bad op token {
    Warning: [kvmmmu:kvm_mmu_prepare_zap_page] bad op token {
    Warning: [kvmmmu:fast_page_fault] function is_writable_pte not defined
    Warning: [xen:xen_mmu_ptep_modify_prot_commit] function sizeof not defined
    Warning: [xen:xen_mmu_ptep_modify_prot_start] function sizeof not defined
    Warning: [xen:xen_mmu_set_pgd] function sizeof not defined
    Warning: [xen:xen_mmu_set_pud] function sizeof not defined
    Warning: [xen:xen_mmu_set_pmd] function sizeof not defined
    ...

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Acked-by: Steven Rostedt <rostedt@goodmis.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Ramkumar Ramachandra <artagnon@gmail.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1395192174-26273-1-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Jiri Olsa <jolsa@redhat.com>
  • Loading branch information
Namhyung Kim authored and Jiri Olsa committed Apr 14, 2014
1 parent 5e09714 commit 3388cc3
Showing 1 changed file with 62 additions and 41 deletions.
103 changes: 62 additions & 41 deletions tools/lib/traceevent/event-parse.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,18 @@ static int show_warning = 1;
warning(fmt, ##__VA_ARGS__); \
} while (0)

#define do_warning_event(event, fmt, ...) \
do { \
if (!show_warning) \
continue; \
\
if (event) \
warning("[%s:%s] " fmt, event->system, \
event->name, ##__VA_ARGS__); \
else \
warning(fmt, ##__VA_ARGS__); \
} while (0)

static void init_input_buf(const char *buf, unsigned long long size)
{
input_buf = buf;
Expand Down Expand Up @@ -1355,7 +1367,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f
}

if (!field->type) {
do_warning("%s: no type found", __func__);
do_warning_event(event, "%s: no type found", __func__);
goto fail;
}
field->name = last_token;
Expand Down Expand Up @@ -1402,7 +1414,7 @@ static int event_read_fields(struct event_format *event, struct format_field **f
free_token(token);
type = read_token(&token);
if (type == EVENT_NONE) {
do_warning("failed to find token");
do_warning_event(event, "failed to find token");
goto fail;
}
}
Expand Down Expand Up @@ -1636,7 +1648,7 @@ process_cond(struct event_format *event, struct print_arg *top, char **tok)
right = alloc_arg();

if (!arg || !left || !right) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
/* arg will be freed at out_free */
free_arg(left);
free_arg(right);
Expand Down Expand Up @@ -1686,7 +1698,7 @@ process_array(struct event_format *event, struct print_arg *top, char **tok)

arg = alloc_arg();
if (!arg) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
/* '*tok' is set to top->op.op. No need to free. */
*tok = NULL;
return EVENT_ERROR;
Expand Down Expand Up @@ -1792,7 +1804,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
if (arg->type == PRINT_OP && !arg->op.left) {
/* handle single op */
if (token[1]) {
do_warning("bad op token %s", token);
do_warning_event(event, "bad op token %s", token);
goto out_free;
}
switch (token[0]) {
Expand All @@ -1802,7 +1814,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
case '-':
break;
default:
do_warning("bad op token %s", token);
do_warning_event(event, "bad op token %s", token);
goto out_free;

}
Expand Down Expand Up @@ -1888,7 +1900,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
char *new_atom;

if (left->type != PRINT_ATOM) {
do_warning("bad pointer type");
do_warning_event(event, "bad pointer type");
goto out_free;
}
new_atom = realloc(left->atom.atom,
Expand Down Expand Up @@ -1930,7 +1942,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
type = process_array(event, arg, tok);

} else {
do_warning("unknown op '%s'", token);
do_warning_event(event, "unknown op '%s'", token);
event->flags |= EVENT_FL_FAILED;
/* the arg is now the left side */
goto out_free;
Expand All @@ -1951,7 +1963,7 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
return type;

out_warn_free:
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
out_free:
free_token(token);
*tok = NULL;
Expand Down Expand Up @@ -2385,7 +2397,7 @@ process_flags(struct event_format *event, struct print_arg *arg, char **tok)

field = alloc_arg();
if (!field) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
goto out_free;
}

Expand Down Expand Up @@ -2438,7 +2450,7 @@ process_symbols(struct event_format *event, struct print_arg *arg, char **tok)

field = alloc_arg();
if (!field) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
goto out_free;
}

Expand Down Expand Up @@ -2477,7 +2489,7 @@ process_hex(struct event_format *event, struct print_arg *arg, char **tok)

field = alloc_arg();
if (!field) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
goto out_free;
}

Expand All @@ -2492,7 +2504,7 @@ process_hex(struct event_format *event, struct print_arg *arg, char **tok)

field = alloc_arg();
if (!field) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
*tok = NULL;
return EVENT_ERROR;
}
Expand Down Expand Up @@ -2555,7 +2567,7 @@ process_dynamic_array(struct event_format *event, struct print_arg *arg, char **
free_token(token);
arg = alloc_arg();
if (!arg) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!", __func__);
*tok = NULL;
return EVENT_ERROR;
}
Expand Down Expand Up @@ -2614,13 +2626,14 @@ process_paren(struct event_format *event, struct print_arg *arg, char **tok)

/* prevous must be an atom */
if (arg->type != PRINT_ATOM) {
do_warning("previous needed to be PRINT_ATOM");
do_warning_event(event, "previous needed to be PRINT_ATOM");
goto out_free;
}

item_arg = alloc_arg();
if (!item_arg) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!",
__func__);
goto out_free;
}

Expand Down Expand Up @@ -2721,7 +2734,8 @@ process_func_handler(struct event_format *event, struct pevent_function_handler
for (i = 0; i < func->nr_args; i++) {
farg = alloc_arg();
if (!farg) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!",
__func__);
return EVENT_ERROR;
}

Expand Down Expand Up @@ -2792,7 +2806,7 @@ process_function(struct event_format *event, struct print_arg *arg,
return process_func_handler(event, func, arg, tok);
}

do_warning("function %s not defined", token);
do_warning_event(event, "function %s not defined", token);
free_token(token);
return EVENT_ERROR;
}
Expand Down Expand Up @@ -2878,7 +2892,7 @@ process_arg_token(struct event_format *event, struct print_arg *arg,

case EVENT_ERROR ... EVENT_NEWLINE:
default:
do_warning("unexpected type %d", type);
do_warning_event(event, "unexpected type %d", type);
return EVENT_ERROR;
}
*tok = token;
Expand All @@ -2901,7 +2915,8 @@ static int event_read_print_args(struct event_format *event, struct print_arg **

arg = alloc_arg();
if (!arg) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!",
__func__);
return -1;
}

Expand Down Expand Up @@ -3481,11 +3496,12 @@ eval_num_arg(void *data, int size, struct event_format *event, struct print_arg
return val;

out_warning_op:
do_warning("%s: unknown op '%s'", __func__, arg->op.op);
do_warning_event(event, "%s: unknown op '%s'", __func__, arg->op.op);
return 0;

out_warning_field:
do_warning("%s: field %s not found", __func__, arg->field.name);
do_warning_event(event, "%s: field %s not found",
__func__, arg->field.name);
return 0;
}

Expand Down Expand Up @@ -3591,7 +3607,8 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
}
str = malloc(len + 1);
if (!str) {
do_warning("%s: not enough memory!", __func__);
do_warning_event(event, "%s: not enough memory!",
__func__);
return;
}
memcpy(str, data + field->offset, len);
Expand Down Expand Up @@ -3697,7 +3714,8 @@ static void print_str_arg(struct trace_seq *s, void *data, int size,
return;

out_warning_field:
do_warning("%s: field %s not found", __func__, arg->field.name);
do_warning_event(event, "%s: field %s not found",
__func__, arg->field.name);
}

static unsigned long long
Expand Down Expand Up @@ -3742,14 +3760,16 @@ process_defined_func(struct trace_seq *s, void *data, int size,
trace_seq_terminate(&str);
string = malloc(sizeof(*string));
if (!string) {
do_warning("%s(%d): malloc str", __func__, __LINE__);
do_warning_event(event, "%s(%d): malloc str",
__func__, __LINE__);
goto out_free;
}
string->next = strings;
string->str = strdup(str.buffer);
if (!string->str) {
free(string);
do_warning("%s(%d): malloc str", __func__, __LINE__);
do_warning_event(event, "%s(%d): malloc str",
__func__, __LINE__);
goto out_free;
}
args[i] = (uintptr_t)string->str;
Expand All @@ -3761,7 +3781,7 @@ process_defined_func(struct trace_seq *s, void *data, int size,
* Something went totally wrong, this is not
* an input error, something in this code broke.
*/
do_warning("Unexpected end of arguments\n");
do_warning_event(event, "Unexpected end of arguments\n");
goto out_free;
}
farg = farg->next;
Expand Down Expand Up @@ -3811,12 +3831,12 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
if (!field) {
field = pevent_find_field(event, "buf");
if (!field) {
do_warning("can't find buffer field for binary printk");
do_warning_event(event, "can't find buffer field for binary printk");
return NULL;
}
ip_field = pevent_find_field(event, "ip");
if (!ip_field) {
do_warning("can't find ip field for binary printk");
do_warning_event(event, "can't find ip field for binary printk");
return NULL;
}
pevent->bprint_buf_field = field;
Expand All @@ -3830,7 +3850,8 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
*/
args = alloc_arg();
if (!args) {
do_warning("%s(%d): not enough memory!", __func__, __LINE__);
do_warning_event(event, "%s(%d): not enough memory!",
__func__, __LINE__);
return NULL;
}
arg = args;
Expand Down Expand Up @@ -3896,7 +3917,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
bptr += vsize;
arg = alloc_arg();
if (!arg) {
do_warning("%s(%d): not enough memory!",
do_warning_event(event, "%s(%d): not enough memory!",
__func__, __LINE__);
goto out_free;
}
Expand All @@ -3919,7 +3940,7 @@ static struct print_arg *make_bprint_args(char *fmt, void *data, int size, struc
case 's':
arg = alloc_arg();
if (!arg) {
do_warning("%s(%d): not enough memory!",
do_warning_event(event, "%s(%d): not enough memory!",
__func__, __LINE__);
goto out_free;
}
Expand Down Expand Up @@ -3959,7 +3980,7 @@ get_bprint_format(void *data, int size __maybe_unused,
if (!field) {
field = pevent_find_field(event, "fmt");
if (!field) {
do_warning("can't find format field for binary printk");
do_warning_event(event, "can't find format field for binary printk");
return NULL;
}
pevent->bprint_fmt_field = field;
Expand Down Expand Up @@ -4003,8 +4024,8 @@ static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
arg->field.field =
pevent_find_any_field(event, arg->field.name);
if (!arg->field.field) {
do_warning("%s: field %s not found",
__func__, arg->field.name);
do_warning_event(event, "%s: field %s not found",
__func__, arg->field.name);
return;
}
}
Expand Down Expand Up @@ -4176,7 +4197,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
case '*':
/* The argument is the length. */
if (!arg) {
do_warning("no argument match");
do_warning_event(event, "no argument match");
event->flags |= EVENT_FL_FAILED;
goto out_failed;
}
Expand Down Expand Up @@ -4213,7 +4234,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
case 'X':
case 'u':
if (!arg) {
do_warning("no argument match");
do_warning_event(event, "no argument match");
event->flags |= EVENT_FL_FAILED;
goto out_failed;
}
Expand All @@ -4223,7 +4244,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event

/* should never happen */
if (len > 31) {
do_warning("bad format!");
do_warning_event(event, "bad format!");
event->flags |= EVENT_FL_FAILED;
len = 31;
}
Expand Down Expand Up @@ -4290,13 +4311,13 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
trace_seq_printf(s, format, (long long)val);
break;
default:
do_warning("bad count (%d)", ls);
do_warning_event(event, "bad count (%d)", ls);
event->flags |= EVENT_FL_FAILED;
}
break;
case 's':
if (!arg) {
do_warning("no matching argument");
do_warning_event(event, "no matching argument");
event->flags |= EVENT_FL_FAILED;
goto out_failed;
}
Expand All @@ -4306,7 +4327,7 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event

/* should never happen */
if (len > 31) {
do_warning("bad format!");
do_warning_event(event, "bad format!");
event->flags |= EVENT_FL_FAILED;
len = 31;
}
Expand Down

0 comments on commit 3388cc3

Please sign in to comment.