Messages in this thread | | | From | Namhyung Kim <> | Date | Wed, 27 Jul 2022 16:33:32 -0700 | Subject | Re: [RFC v3 01/17] perf kwork: New tool |
| |
Hello,
On Fri, Jul 8, 2022 at 6:53 PM Yang Jihong <yangjihong1@huawei.com> wrote: > > The perf-kwork tool is used to trace time properties of kernel work > (such as irq, softirq, and workqueue), including runtime, latency, > and timehist, using the infrastructure in the perf tools to allow > tracing extra targets. > > This is the first commit to reuse perf_record framework code to > implement a simple record function, kwork is not supported currently. > > Test cases: > > # perf > > usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS] > > The most commonly used perf commands are: > <SNIP> > iostat Show I/O performance metrics > kallsyms Searches running kernel for symbols > kmem Tool to trace/measure kernel memory properties > kvm Tool to trace/measure kvm guest os > kwork Tool to trace/measure kernel work properties (latencies) > list List all symbolic event types > lock Analyze lock events > mem Profile memory accesses > record Run a command and record its profile into perf.data > <SNIP> > See 'perf help COMMAND' for more information on a specific command. > > # perf kwork > > Usage: perf kwork [<options>] {record} > > -D, --dump-raw-trace dump raw trace in ASCII > -f, --force don't complain, do it > -k, --kwork <kwork> list of kwork to profile > -v, --verbose be more verbose (show symbol address, etc) > > # perf kwork record -- sleep 1 > [ perf record: Woken up 0 times to write data ] > [ perf record: Captured and wrote 1.787 MB perf.data ] > > Signed-off-by: Yang Jihong <yangjihong1@huawei.com> > --- [SNIP] > + > +static int perf_kwork__record(struct perf_kwork *kwork, > + int argc, const char **argv) > +{ > + const char **rec_argv; > + unsigned int rec_argc, i, j; > + struct kwork_class *class; > + > + const char *const record_args[] = { > + "record", > + "-a", > + "-R", > + "-m", "1024", > + "-c", "1",
Please consider adding '--synth task' to skip costly synthesis if you don't need user space symbols.
> + }; > + > + rec_argc = ARRAY_SIZE(record_args) + argc - 1; > + > + list_for_each_entry(class, &kwork->class_list, list) > + rec_argc += 2 * class->nr_tracepoints; > + > + rec_argv = calloc(rec_argc + 1, sizeof(char *)); > + if (rec_argv == NULL) > + return -ENOMEM; > + > + for (i = 0; i < ARRAY_SIZE(record_args); i++) > + rec_argv[i] = strdup(record_args[i]); > + > + list_for_each_entry(class, &kwork->class_list, list) { > + for (j = 0; j < class->nr_tracepoints; j++) { > + rec_argv[i++] = strdup("-e"); > + rec_argv[i++] = strdup(class->tp_handlers[j].name); > + } > + } > + > + for (j = 1; j < (unsigned int)argc; j++, i++) > + rec_argv[i] = argv[j]; > + > + BUG_ON(i != rec_argc); > + > + pr_debug("record comm: "); > + for (j = 0; j < rec_argc; j++) > + pr_debug("%s ", rec_argv[j]); > + pr_debug("\n"); > + > + return cmd_record(i, rec_argv); > +}
| |