perf util: Add evsel__taskstate() to parse the task state info instead
Now that we have the __prinf_flags() parsing routines, we add a new helper evsel__taskstate() to extract the task state info from the recorded data. Signed-off-by: Ze Gao <zegao@tencent.com> Cc: Steven Rostedt <rostedt@goodmis.org> Link: https://lore.kernel.org/r/20240122070859.1394479-5-zegao@tencent.com Signed-off-by: Namhyung Kim <namhyung@kernel.org>
This commit is contained in:
parent
2f29a74f1d
commit
df8bc77e4a
@ -2939,7 +2939,7 @@ search_op(struct tep_format_field *prev_state_field, struct tep_print_arg *arg)
|
||||
return sym;
|
||||
}
|
||||
|
||||
static __maybe_unused const char *get_states(struct tep_format_field *prev_state_field)
|
||||
static const char *get_states(struct tep_format_field *prev_state_field)
|
||||
{
|
||||
struct tep_print_flag_sym *sym;
|
||||
struct tep_print_arg *arg;
|
||||
@ -2963,6 +2963,40 @@ static __maybe_unused const char *get_states(struct tep_format_field *prev_state
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const char *name)
|
||||
{
|
||||
static struct tep_format_field *prev_state_field;
|
||||
static const char *states;
|
||||
struct tep_format_field *field;
|
||||
unsigned long long val;
|
||||
unsigned int bit;
|
||||
char state = '?'; /* '?' denotes unknown task state */
|
||||
|
||||
field = evsel__field(evsel, name);
|
||||
|
||||
if (!field)
|
||||
return state;
|
||||
|
||||
if (!states || field != prev_state_field) {
|
||||
states = get_states(field);
|
||||
if (!states)
|
||||
return state;
|
||||
prev_state_field = field;
|
||||
}
|
||||
|
||||
/*
|
||||
* Note since the kernel exposes TASK_REPORT_MAX to userspace
|
||||
* to denote the 'preempted' state, we might as welll report
|
||||
* 'R' for this case, which make senses to users as well.
|
||||
*
|
||||
* We can change this if we have a good reason in the future.
|
||||
*/
|
||||
val = evsel__intval(evsel, sample, name);
|
||||
bit = val ? ffs(val) : 0;
|
||||
state = (!bit || bit > strlen(states)) ? 'R' : states[bit-1];
|
||||
return state;
|
||||
}
|
||||
#endif
|
||||
|
||||
bool evsel__fallback(struct evsel *evsel, struct target *target, int err,
|
||||
|
@ -339,6 +339,7 @@ struct perf_sample;
|
||||
void *evsel__rawptr(struct evsel *evsel, struct perf_sample *sample, const char *name);
|
||||
u64 evsel__intval(struct evsel *evsel, struct perf_sample *sample, const char *name);
|
||||
u64 evsel__intval_common(struct evsel *evsel, struct perf_sample *sample, const char *name);
|
||||
char evsel__taskstate(struct evsel *evsel, struct perf_sample *sample, const char *name);
|
||||
|
||||
static inline char *evsel__strval(struct evsel *evsel, struct perf_sample *sample, const char *name)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user