From 20018398fca87c914654252f7647a224e6b030ee Mon Sep 17 00:00:00 2001 From: Ze Gao Date: Tue, 23 Jan 2024 02:02:11 -0500 Subject: perf evsel: Rename get_states() to parse_task_states() and make it public Since get_states() assumes the existence of libtraceevent, so move to where it should belong, i.e, util/trace-event-parse.c, and also rename it to parse_task_states(). Leave evsel_getstate() untouched as it fits well in the evsel category. Also make some necessary tweaks for python support, and get it verified with: perf test python. Signed-off-by: Ze Gao Cc: Steven Rostedt Signed-off-by: Namhyung Kim Link: https://lore.kernel.org/r/20240123070210.1669843-2-zegao@tencent.com --- tools/perf/util/evsel.c | 115 +----------------------------------------------- 1 file changed, 1 insertion(+), 114 deletions(-) (limited to 'tools/perf/util/evsel.c') diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 4d14f14f2506..9e67324b1608 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2851,119 +2851,6 @@ u64 evsel__intval_common(struct evsel *evsel, struct perf_sample *sample, const return field ? format_field__intval(field, sample, evsel->needs_swap) : 0; } -/* - * prev_state is of size long, which is 32 bits on 32 bit architectures. - * As it needs to have the same bits for both 32 bit and 64 bit architectures - * we can just assume that the flags we care about will all be within - * the 32 bits. - */ -#define MAX_STATE_BITS 32 - -static const char *convert_sym(struct tep_print_flag_sym *sym) -{ - static char save_states[MAX_STATE_BITS + 1]; - - memset(save_states, 0, sizeof(save_states)); - - /* This is the flags for the prev_state_field, now make them into a string */ - for (; sym; sym = sym->next) { - long bitmask = strtoul(sym->value, NULL, 0); - int i; - - for (i = 0; !(bitmask & 1); i++) - bitmask >>= 1; - - if (i >= MAX_STATE_BITS) - continue; - - save_states[i] = sym->str[0]; - } - - return save_states; -} - -static struct tep_print_arg_field * -find_arg_field(struct tep_format_field *prev_state_field, struct tep_print_arg *arg) -{ - struct tep_print_arg_field *field; - - if (!arg) - return NULL; - - if (arg->type == TEP_PRINT_FIELD) - return &arg->field; - - if (arg->type == TEP_PRINT_OP) { - field = find_arg_field(prev_state_field, arg->op.left); - if (field && field->field == prev_state_field) - return field; - field = find_arg_field(prev_state_field, arg->op.right); - if (field && field->field == prev_state_field) - return field; - } - return NULL; -} - -static struct tep_print_flag_sym * -test_flags(struct tep_format_field *prev_state_field, struct tep_print_arg *arg) -{ - struct tep_print_arg_field *field; - - field = find_arg_field(prev_state_field, arg->flags.field); - if (!field) - return NULL; - - return arg->flags.flags; -} - -static struct tep_print_flag_sym * -search_op(struct tep_format_field *prev_state_field, struct tep_print_arg *arg) -{ - struct tep_print_flag_sym *sym = NULL; - - if (!arg) - return NULL; - - if (arg->type == TEP_PRINT_OP) { - sym = search_op(prev_state_field, arg->op.left); - if (sym) - return sym; - - sym = search_op(prev_state_field, arg->op.right); - if (sym) - return sym; - } else if (arg->type == TEP_PRINT_FLAGS) { - sym = test_flags(prev_state_field, arg); - } - - return sym; -} - -static const char *get_states(struct tep_format_field *prev_state_field) -{ - struct tep_print_flag_sym *sym; - struct tep_print_arg *arg; - struct tep_event *event; - - event = prev_state_field->event; - - /* - * Look at the event format fields, and search for where - * the prev_state is parsed via the format flags. - */ - for (arg = event->print_fmt.args; arg; arg = arg->next) { - /* - * Currently, the __print_flags() for the prev_state - * is embedded in operations, so they too must be - * searched. - */ - sym = search_op(prev_state_field, arg); - if (sym) - return convert_sym(sym); - } - return NULL; -} - char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const char *name) { static struct tep_format_field *prev_state_field; @@ -2979,7 +2866,7 @@ char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const cha return state; if (!states || field != prev_state_field) { - states = get_states(field); + states = parse_task_states(field); if (!states) return state; prev_state_field = field; -- cgit