[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAOQ4uxjvMRXWeQx+mAugwGLftCPRQKxUfx8dZj+Jqk-Y_YJDcQ@mail.gmail.com>
Date: Mon, 13 Oct 2025 12:41:37 +0200
From: Amir Goldstein <amir73il@...il.com>
To: Adrian Hunter <adrian.hunter@...el.com>
Cc: Peter Zijlstra <peterz@...radead.org>, Ingo Molnar <mingo@...hat.com>,
Alexander Shishkin <alexander.shishkin@...ux.intel.com>,
Arnaldo Carvalho de Melo <acme@...nel.org>, Jiri Olsa <jolsa@...nel.org>, Namhyung Kim <namhyung@...nel.org>,
Mark Rutland <mark.rutland@....com>, Ian Rogers <irogers@...gle.com>,
Mathieu Poirier <mathieu.poirier@...aro.org>, Miklos Szeredi <miklos@...redi.hu>,
Alexander Viro <viro@...iv.linux.org.uk>, Christian Brauner <brauner@...nel.org>,
Edd Barrett <edd@...unixzoo.co.uk>, Laurence Tratt <laurie@...tt.net>, linux-kernel@...r.kernel.org,
linux-perf-users@...r.kernel.org
Subject: Re: [PATCH RESEND 1/3] perf/core: Fix address filter match with
backing files
On Mon, Oct 13, 2025 at 9:23 AM Adrian Hunter <adrian.hunter@...el.com> wrote:
>
> It was reported that Intel PT address filters do not work in Docker
> containers. That relates to the use of overlayfs.
>
> overlayfs records the backing file in struct vm_area_struct vm_file,
> instead of the user file that the user mmapped. In order for an address
> filter to match, it must compare to the user file inode. There is an
> existing helper file_user_inode() for that situation.
>
> Use file_user_inode() instead of file_inode() to get the inode for address
> filter matching.
>
> Example:
>
> Setup:
>
> # cd /root
> # mkdir test ; cd test ; mkdir lower upper work merged
> # cp `which cat` lower
> # mount -t overlay overlay -olowerdir=lower,upperdir=upper,workdir=work merged
> # perf record --buildid-mmap -e intel_pt//u --filter 'filter * @ /root/test/merged/cat' -- /root/test/merged/cat /proc/self/maps
> ...
> 55d61d246000-55d61d2e1000 r-xp 00018000 00:1a 3418 /root/test/merged/cat
> ...
> [ perf record: Woken up 1 times to write data ]
> [ perf record: Captured and wrote 0.015 MB perf.data ]
> # perf buildid-cache --add /root/test/merged/cat
>
> Before:
>
> Address filter does not match so there are no control flow packets
>
> # perf script --itrace=e
> # perf script --itrace=b | wc -l
> 0
> # perf script -D | grep 'TIP.PGE' | wc -l
> 0
> #
>
> After:
>
> Address filter does match so there are control flow packets
>
> # perf script --itrace=e
> # perf script --itrace=b | wc -l
> 235
> # perf script -D | grep 'TIP.PGE' | wc -l
> 57
> #
>
> With respect to stable kernels, overlayfs mmap function ovl_mmap() was
> added in v4.19 but file_user_inode() was not added until v6.8 and never
> back-ported to stable kernels. FMODE_BACKING that it depends on was added
> in v6.5. This issue has gone largely unnoticed, so back-porting before
> v6.8 is probably not worth it, so put 6.8 as the stable kernel prerequisite
> version, although in practice the next long term kernel is 6.12.
>
> Reported-by: Edd Barrett <edd@...unixzoo.co.uk>
> Closes: https://lore.kernel.org/linux-perf-users/aBCwoq7w8ohBRQCh@fremen.lan
> Cc: stable@...r.kernel.org # 6.8
> Signed-off-by: Adrian Hunter <adrian.hunter@...el.com>
> ---
Reviewed-by: Amir Goldstein <amir73il@...il.com>
> kernel/events/core.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/kernel/events/core.c b/kernel/events/core.c
> index 7541f6f85fcb..cd63ec84e386 100644
> --- a/kernel/events/core.c
> +++ b/kernel/events/core.c
> @@ -9492,7 +9492,7 @@ static bool perf_addr_filter_match(struct perf_addr_filter *filter,
> if (!filter->path.dentry)
> return false;
>
> - if (d_inode(filter->path.dentry) != file_inode(file))
> + if (d_inode(filter->path.dentry) != file_user_inode(file))
> return false;
>
> if (filter->offset > offset + size)
> --
> 2.48.1
>
Powered by blists - more mailing lists