From: Mathieu Poirier <mathieu.poirier@linaro.org>
To: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>,
Ingo Molnar <mingo@redhat.com>,
linux-kernel@vger.kernel.org, vince@deater.net,
eranian@google.com, Arnaldo Carvalho de Melo <acme@infradead.org>,
Will Deacon <will.deacon@arm.com>,
Mark Rutland <mark.rutland@arm.com>
Subject: Re: [PATCH 3/3] perf: Allow kernel filters on cpu events
Date: Thu, 26 Jan 2017 14:38:55 -0700 [thread overview]
Message-ID: <20170126213855.GC1991@linaro.org> (raw)
In-Reply-To: <20170126094057.13805-4-alexander.shishkin@linux.intel.com>
On Thu, Jan 26, 2017 at 11:40:57AM +0200, Alexander Shishkin wrote:
> While supporting file-based address filters for cpu events requires some
> extra context switch handling, kernel address filters are easy, since the
> kernel mapping is preserved across address spaces. It is also useful as
> it permits tracing scheduling paths of the kernel.
>
> This patch allows setting up kernel filters for cpu events.
>
> Signed-off-by: Alexander Shishkin <alexander.shishkin@linux.intel.com>
> Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
> ---
> include/linux/perf_event.h | 2 ++
> kernel/events/core.c | 42 ++++++++++++++++++++++++++++--------------
> 2 files changed, 30 insertions(+), 14 deletions(-)
>
> diff --git a/include/linux/perf_event.h b/include/linux/perf_event.h
> index fcb37c81ca..f4ea0600b2 100644
> --- a/include/linux/perf_event.h
> +++ b/include/linux/perf_event.h
> @@ -486,6 +486,7 @@ struct perf_addr_filter {
> * @list: list of filters for this event
> * @lock: spinlock that serializes accesses to the @list and event's
> * (and its children's) filter generations.
> + * @nr_file_filters: number of file-based filters
> *
> * A child event will use parent's @list (and therefore @lock), so they are
> * bundled together; see perf_event_addr_filters().
> @@ -493,6 +494,7 @@ struct perf_addr_filter {
> struct perf_addr_filters_head {
> struct list_head list;
> raw_spinlock_t lock;
> + unsigned int nr_file_filters;
> };
>
> /**
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 36770a13ef..2eeb8fec2f 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -8093,6 +8093,9 @@ static void perf_event_addr_filters_apply(struct perf_event *event)
> if (task == TASK_TOMBSTONE)
> return;
>
> + if (!ifh->nr_file_filters)
> + return;
Is this mandatory or an optimisation to avoid circling through a list of filters
that don't included user space files?
> +
> mm = get_task_mm(event->ctx->task);
> if (!mm)
> goto restart;
> @@ -8269,6 +8272,18 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
> if (!filename)
> goto fail;
>
> + /*
> + * For now, we only support file-based filters
> + * in per-task events; doing so for CPU-wide
> + * events requires additional context switching
> + * trickery, since same object code will be
> + * mapped at different virtual addresses in
> + * different processes.
> + */
> + ret = -EOPNOTSUPP;
> + if (!event->ctx->task)
> + goto fail_free_name;
> +
> /* look up the path and grab its inode */
> ret = kern_path(filename, LOOKUP_FOLLOW, &path);
> if (ret)
> @@ -8284,6 +8299,8 @@ perf_event_parse_addr_filter(struct perf_event *event, char *fstr,
> !S_ISREG(filter->inode->i_mode))
> /* free_filters_list() will iput() */
> goto fail;
> +
> + event->addr_filters.nr_file_filters++;
> }
>
> /* ready to consume more filters */
> @@ -8323,24 +8340,13 @@ perf_event_set_addr_filter(struct perf_event *event, char *filter_str)
> if (WARN_ON_ONCE(event->parent))
> return -EINVAL;
>
> - /*
> - * For now, we only support filtering in per-task events; doing so
> - * for CPU-wide events requires additional context switching trickery,
> - * since same object code will be mapped at different virtual
> - * addresses in different processes.
> - */
> - if (!event->ctx->task)
> - return -EOPNOTSUPP;
> -
> ret = perf_event_parse_addr_filter(event, filter_str, &filters);
> if (ret)
> - return ret;
> + goto fail_clear_files;
>
> ret = event->pmu->addr_filters_validate(&filters);
> - if (ret) {
> - free_filters_list(&filters);
> - return ret;
> - }
> + if (ret)
> + goto fail_free_filters;
>
> /* remove existing filters, if any */
> perf_addr_filters_splice(event, &filters);
> @@ -8349,6 +8355,14 @@ perf_event_set_addr_filter(struct perf_event *event, char *filter_str)
> perf_event_for_each_child(event, perf_event_addr_filters_apply);
>
> return ret;
> +
> +fail_free_filters:
> + free_filters_list(&filters);
> +
> +fail_clear_files:
> + event->addr_filters.nr_file_filters = 0;
> +
> + return ret;
> }
>
> static int perf_event_set_filter(struct perf_event *event, void __user *arg)
> --
> 2.11.0
>
next prev parent reply other threads:[~2017-01-26 21:39 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-26 9:40 [PATCH 0/3] perf: Updates for address filters Alexander Shishkin
2017-01-26 9:40 ` [PATCH 1/3] perf, pt, coresight: Clean up address filter structure Alexander Shishkin
2017-01-26 13:02 ` kbuild test robot
2017-01-26 13:24 ` Alexander Shishkin
2017-01-26 18:26 ` Mathieu Poirier
2017-01-27 12:12 ` Alexander Shishkin
2017-01-27 17:17 ` Mathieu Poirier
2017-02-01 12:46 ` Alexander Shishkin
2017-02-01 21:33 ` Mathieu Poirier
2017-02-01 22:15 ` Mathieu Poirier
2017-02-02 10:42 ` Alexander Shishkin
2017-02-02 17:36 ` Mathieu Poirier
2017-02-02 16:22 ` Alexander Shishkin
2017-02-07 17:50 ` Mathieu Poirier
[not found] ` <20180117123137.3hlmudzu5eogl53n@ukko.fi.intel.com>
2018-01-18 16:59 ` Mathieu Poirier
2018-01-18 17:06 ` Will Deacon
2018-01-18 18:19 ` Mathieu Poirier
2018-01-19 18:50 ` Mathieu Poirier
2017-01-26 9:40 ` [PATCH 2/3] perf: Do error out on a kernel filter on an exclude_filter event Alexander Shishkin
2017-01-26 18:32 ` Mathieu Poirier
2017-02-10 8:33 ` [tip:perf/core] perf/core: " tip-bot for Alexander Shishkin
2017-01-26 9:40 ` [PATCH 3/3] perf: Allow kernel filters on cpu events Alexander Shishkin
2017-01-26 21:38 ` Mathieu Poirier [this message]
2017-01-27 12:31 ` Alexander Shishkin
2017-01-27 17:38 ` Mathieu Poirier
2017-02-10 8:07 ` Ingo Molnar
2017-02-14 12:59 ` Alexander Shishkin
2017-02-10 8:34 ` [tip:perf/core] perf/core: Allow kernel filters on CPU events tip-bot for Alexander Shishkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170126213855.GC1991@linaro.org \
--to=mathieu.poirier@linaro.org \
--cc=a.p.zijlstra@chello.nl \
--cc=acme@infradead.org \
--cc=alexander.shishkin@linux.intel.com \
--cc=eranian@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mark.rutland@arm.com \
--cc=mingo@redhat.com \
--cc=vince@deater.net \
--cc=will.deacon@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).