Received: by 2002:a05:6a10:22f:0:0:0:0 with SMTP id 15csp1542057pxk; Fri, 4 Sep 2020 12:01:08 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzWixpVLnDV7MQ86a3BGMGiOeFB0SCH9AFXaUK9yPdW+rimVXOwIdrcNoxX6pRMOFvYM5Sy X-Received: by 2002:a17:906:3e81:: with SMTP id a1mr8688805ejj.227.1599246067964; Fri, 04 Sep 2020 12:01:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1599246067; cv=none; d=google.com; s=arc-20160816; b=ik74YWeFndbgVgk0J9Pms00k4RPJCjKN1Sj3djVkVZN//RavSAgx3fVC8Y/Gi7qmc+ g2XlBnUMgOYiTsm+dpI0dCcFuQs3b0VKGbMNbYs6Y+RgwTD0UB7/8KATZIJoX/6YDc9U 8pLBxybZ5GkyzG32h11ZLzKjX1sc7Cv4FpDQKkagaiKdWV8m7QO2IIFxbxDQ7eo9cmuY HMVuTvDVm1i/li1Q+z/UiQHM4rxPFsoFUIQFMAClH92yy7M3vO15bAMdVk9KYAaKpQSq B/KcOdRdIDbEJyBFu/9Cu1StJ9h6IZqCck0qMmc/D0iC7eh1OnXyl1ykmal+NHVyA+nO U8Ow== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:in-reply-to:content-disposition :mime-version:references:message-id:subject:cc:to:from:date :dkim-signature; bh=Sajs4EkwJrYSXDfSWEyq1s0aXziO3o9ry2FQB8UwQQo=; b=heewzplzdQxAhLwYNV2Pl8CkRhRgKl7mw08m26vUIv0CFpOU2hFqfZS50BzKSq+D+U 7ULkEKBL3lo6Rgwv8QSs3y/WH8s78uqn0iINbodvbVl48BgNFHHlb+hPNPB+eJl2Pw/Z 2FuRAk7Q8I7rxC6iXMbiJkD5bEzc3RNccJ/e8EySTI3Rrsv2qvNeKMpyj6C8d5+koLyN LWrq6Gsf5pmzLiqiZFLlJaG1KgLog0GvFJXkJpFMI4kE+B52HtAWrdrLLg8fjyXqkuL6 8YoPT0cGvmsCl0qnnz5psJO2CXrskM6oIq5sUku37xp0yCC8S6406pHIp31rAnB2m+Be IHYA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ehoGC2fb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id dm15si4441334edb.236.2020.09.04.12.00.44; Fri, 04 Sep 2020 12:01:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=ehoGC2fb; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726265AbgIDTAE (ORCPT + 99 others); Fri, 4 Sep 2020 15:00:04 -0400 Received: from mail.kernel.org ([198.145.29.99]:58494 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726047AbgIDTAC (ORCPT ); Fri, 4 Sep 2020 15:00:02 -0400 Received: from quaco.ghostprotocols.net (unknown [179.97.37.151]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 68B3020665; Fri, 4 Sep 2020 19:00:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1599246001; bh=cizle+5yPbXTGE2X+e1LEvsyXzxqCWcv0OsGskbYsD0=; h=Date:From:To:Cc:Subject:References:In-Reply-To:From; b=ehoGC2fbL9r5L9A0U0oGbSzpDMlDgPShgZ8zvT44NDZt/0WicImniQ4BunieauS5k PYxQpxEz9olUrra1m3XKDPiUR7JkQEGqD7tj8kDUvpZfRsfcuxjoO5xdullaAc7qUQ h8b7KRhWztfvwQDMCqIpRjcWyKbu3BNhnzOVQ3Qg= Received: by quaco.ghostprotocols.net (Postfix, from userid 1000) id 6FE4540D3D; Fri, 4 Sep 2020 15:59:59 -0300 (-03) Date: Fri, 4 Sep 2020 15:59:59 -0300 From: Arnaldo Carvalho de Melo To: Changbin Du Cc: Peter Zijlstra , Ingo Molnar , Jiri Olsa , Namhyung Kim , linux-kernel@vger.kernel.org, Arnaldo Carvalho de Melo Subject: Re: [RESEND PATCH] perf: ftrace: Add filter support for option -F/--funcs Message-ID: <20200904185959.GA3753976@kernel.org> References: <20200904152357.6053-1-changbin.du@gmail.com> <20200904162716.GT3495158@kernel.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20200904162716.GT3495158@kernel.org> X-Url: http://acmel.wordpress.com Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Em Fri, Sep 04, 2020 at 01:27:16PM -0300, Arnaldo Carvalho de Melo escreveu: > Em Fri, Sep 04, 2020 at 11:23:57PM +0800, Changbin Du escreveu: > > Same as 'perf probe -F', this patch adds filter support for the ftrace > > subcommand option '-F, --funcs <[FILTER]>'. > > > > Here is an example that only lists functions which start with 'vfs_': > > $ sudo perf ftrace -F vfs_* > > vfs_fadvise > > vfs_fallocate > > vfs_truncate > > vfs_open > > vfs_setpos > > vfs_llseek > > vfs_readf > > vfs_writef > > ... > > I'll process these now, the urgent ones were already sent to Linus, so I > will now concentrate on the new stuff for v5.10, > > Thanks for working on this! Thanks, applied, will go to v5.10, i.e. to my perf/core branch as soon as the usual set of tests pass, - Arnaldo > - Arnaldo > > > Suggested-by: Arnaldo Carvalho de Melo > > Signed-off-by: Changbin Du > > --- > > tools/perf/Documentation/perf-ftrace.txt | 3 +- > > tools/perf/builtin-ftrace.c | 84 ++++++++++++++++++++++-- > > 2 files changed, 80 insertions(+), 7 deletions(-) > > > > diff --git a/tools/perf/Documentation/perf-ftrace.txt b/tools/perf/Documentation/perf-ftrace.txt > > index 78358af9a1c4..1e91121bac0f 100644 > > --- a/tools/perf/Documentation/perf-ftrace.txt > > +++ b/tools/perf/Documentation/perf-ftrace.txt > > @@ -33,7 +33,8 @@ OPTIONS > > > > -F:: > > --funcs:: > > - List all available functions to trace. > > + List available functions to trace. It accepts a pattern to > > + only list interested functions. > > > > -p:: > > --pid=:: > > diff --git a/tools/perf/builtin-ftrace.c b/tools/perf/builtin-ftrace.c > > index 1d44bc2f63d8..9366fad591dc 100644 > > --- a/tools/perf/builtin-ftrace.c > > +++ b/tools/perf/builtin-ftrace.c > > @@ -25,6 +25,7 @@ > > #include "target.h" > > #include "cpumap.h" > > #include "thread_map.h" > > +#include "strfilter.h" > > #include "util/cap.h" > > #include "util/config.h" > > #include "util/units.h" > > @@ -36,7 +37,6 @@ struct perf_ftrace { > > struct evlist *evlist; > > struct target target; > > const char *tracer; > > - bool list_avail_functions; > > struct list_head filters; > > struct list_head notrace; > > struct list_head graph_funcs; > > @@ -181,6 +181,40 @@ static int read_tracing_file_to_stdout(const char *name) > > return ret; > > } > > > > +static int read_tracing_file_by_line(const char *name, > > + void (*cb)(char *str, void *arg), > > + void *cb_arg) > > +{ > > + char *line = NULL; > > + size_t len = 0; > > + char *file; > > + FILE *fp; > > + > > + file = get_tracing_file(name); > > + if (!file) { > > + pr_debug("cannot get tracing file: %s\n", name); > > + return -1; > > + } > > + > > + fp = fopen(file, "r"); > > + if (fp == NULL) { > > + pr_debug("cannot open tracing file: %s\n", name); > > + put_tracing_file(file); > > + return -1; > > + } > > + > > + while (getline(&line, &len, fp) != -1) { > > + cb(line, cb_arg); > > + } > > + > > + if (line) > > + free(line); > > + > > + fclose(fp); > > + put_tracing_file(file); > > + return 0; > > +} > > + > > static int write_tracing_file_int(const char *name, int value) > > { > > char buf[16]; > > @@ -557,9 +591,6 @@ static int __cmd_ftrace(struct perf_ftrace *ftrace, int argc, const char **argv) > > signal(SIGCHLD, sig_handler); > > signal(SIGPIPE, sig_handler); > > > > - if (ftrace->list_avail_functions) > > - return read_tracing_file_to_stdout("available_filter_functions"); > > - > > if (reset_tracing_files(ftrace) < 0) { > > pr_err("failed to reset ftrace\n"); > > goto out; > > @@ -683,6 +714,46 @@ static int perf_ftrace_config(const char *var, const char *value, void *cb) > > return -1; > > } > > > > +static void list_function_cb(char *str, void *arg) > > +{ > > + struct strfilter *filter = (struct strfilter *)arg; > > + > > + if (strfilter__compare(filter, str)) > > + printf("%s", str); > > +} > > + > > +static int opt_list_avail_functions(const struct option *opt __maybe_unused, > > + const char *str, int unset) > > +{ > > + struct strfilter *filter; > > + const char *err = NULL; > > + int ret; > > + > > + if (unset || !str) > > + return -1; > > + > > + filter = strfilter__new(str, &err); > > + if (!filter) > > + return err ? -EINVAL : -ENOMEM; > > + > > + ret = strfilter__or(filter, str, &err); > > + if (ret == -EINVAL) { > > + pr_err("Filter parse error at %td.\n", err - str + 1); > > + pr_err("Source: \"%s\"\n", str); > > + pr_err(" %*c\n", (int)(err - str + 1), '^'); > > + strfilter__delete(filter); > > + return ret; > > + } > > + > > + ret = read_tracing_file_by_line("available_filter_functions", > > + list_function_cb, filter); > > + strfilter__delete(filter); > > + if (ret < 0) > > + return ret; > > + > > + exit(0); > > +} > > + > > static int parse_filter_func(const struct option *opt, const char *str, > > int unset __maybe_unused) > > { > > @@ -817,8 +888,9 @@ int cmd_ftrace(int argc, const char **argv) > > const struct option ftrace_options[] = { > > OPT_STRING('t', "tracer", &ftrace.tracer, "tracer", > > "Tracer to use: function_graph(default) or function"), > > - OPT_BOOLEAN('F', "funcs", &ftrace.list_avail_functions, > > - "Show available functions to filter"), > > + OPT_CALLBACK_DEFAULT('F', "funcs", NULL, "[FILTER]", > > + "Show available functions to filter", > > + opt_list_avail_functions, "*"), > > OPT_STRING('p', "pid", &ftrace.target.pid, "pid", > > "Trace on existing process id"), > > /* TODO: Add short option -t after -t/--tracer can be removed. */ > > -- > > 2.25.1 > > > > -- > > - Arnaldo -- - Arnaldo