mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 18:13:41 +02:00
perf machine: Move fprintf to for_each loop and a callback
Avoid exposing the threads data structure by switching to the callback machine__for_each_thread approach. machine__fprintf is only used in tests and verbose >3 output so don't turn to list and sort. Add machine__threads_nr to be refactored later. Note, all existing *_fprintf routines ignore fprintf errors. Signed-off-by: Ian Rogers <irogers@google.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Yang Jihong <yangjihong1@huawei.com> Cc: Oliver Upton <oliver.upton@linux.dev> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240301053646.1449657-4-irogers@google.com
This commit is contained in:
parent
f178ffdf7e
commit
45ac4960d7
|
|
@ -1113,29 +1113,40 @@ size_t machine__fprintf_vmlinux_path(struct machine *machine, FILE *fp)
|
|||
return printed;
|
||||
}
|
||||
|
||||
struct machine_fprintf_cb_args {
|
||||
FILE *fp;
|
||||
size_t printed;
|
||||
};
|
||||
|
||||
static int machine_fprintf_cb(struct thread *thread, void *data)
|
||||
{
|
||||
struct machine_fprintf_cb_args *args = data;
|
||||
|
||||
/* TODO: handle fprintf errors. */
|
||||
args->printed += thread__fprintf(thread, args->fp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t machine__threads_nr(const struct machine *machine)
|
||||
{
|
||||
size_t nr = 0;
|
||||
|
||||
for (int i = 0; i < THREADS__TABLE_SIZE; i++)
|
||||
nr += machine->threads[i].nr;
|
||||
|
||||
return nr;
|
||||
}
|
||||
|
||||
size_t machine__fprintf(struct machine *machine, FILE *fp)
|
||||
{
|
||||
struct rb_node *nd;
|
||||
size_t ret;
|
||||
int i;
|
||||
struct machine_fprintf_cb_args args = {
|
||||
.fp = fp,
|
||||
.printed = 0,
|
||||
};
|
||||
size_t ret = fprintf(fp, "Threads: %zu\n", machine__threads_nr(machine));
|
||||
|
||||
for (i = 0; i < THREADS__TABLE_SIZE; i++) {
|
||||
struct threads *threads = &machine->threads[i];
|
||||
|
||||
down_read(&threads->lock);
|
||||
|
||||
ret = fprintf(fp, "Threads: %u\n", threads->nr);
|
||||
|
||||
for (nd = rb_first_cached(&threads->entries); nd;
|
||||
nd = rb_next(nd)) {
|
||||
struct thread *pos = rb_entry(nd, struct thread_rb_node, rb_node)->thread;
|
||||
|
||||
ret += thread__fprintf(pos, fp);
|
||||
}
|
||||
|
||||
up_read(&threads->lock);
|
||||
}
|
||||
return ret;
|
||||
machine__for_each_thread(machine, machine_fprintf_cb, &args);
|
||||
return ret + args.printed;
|
||||
}
|
||||
|
||||
static struct dso *machine__get_kernel(struct machine *machine)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user