[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <8536CB49-0091-4019-839A-B460847995C2@fb.com>
Date: Fri, 28 Mar 2025 17:56:45 +0000
From: Song Liu <songliubraving@...a.com>
To: Andrii Nakryiko <andrii.nakryiko@...il.com>
CC: Song Liu <song@...nel.org>, "bpf@...r.kernel.org" <bpf@...r.kernel.org>,
"netdev@...r.kernel.org" <netdev@...r.kernel.org>,
"ast@...nel.org"
<ast@...nel.org>,
"daniel@...earbox.net" <daniel@...earbox.net>,
"andrii@...nel.org" <andrii@...nel.org>,
Kernel Team <kernel-team@...a.com>,
"kuba@...nel.org" <kuba@...nel.org>
Subject: Re: [PATCH bpf-next] selftests/bpf: Fix tests after change in struct
file
> On Mar 28, 2025, at 10:30 AM, Andrii Nakryiko <andrii.nakryiko@...il.com> wrote:
>
> On Thu, Mar 27, 2025 at 11:55 AM Song Liu <song@...nel.org> wrote:
>>
>> Change in struct file [1] moves f_ref to the 3rd cache line. This makes
>> deferencing file pointer as a 8-byte variable invalid, because
>> btf_struct_walk() will walk into f_lock, which is 4-byte long.
>>
>> Fix the selftests to deference the file pointer as a 4-byte variable.
>>
>> [1] commit e249056c91a2 ("fs: place f_ref to 3rd cache line in struct
>> file to resolve false sharing")
>> Reported-by: Jakub Kicinski <kuba@...nel.org>
>> Signed-off-by: Song Liu <song@...nel.org>
>> ---
>> tools/testing/selftests/bpf/progs/test_module_attach.c | 2 +-
>> tools/testing/selftests/bpf/progs/test_subprogs_extable.c | 6 +++---
>> 2 files changed, 4 insertions(+), 4 deletions(-)
>>
>> diff --git a/tools/testing/selftests/bpf/progs/test_module_attach.c b/tools/testing/selftests/bpf/progs/test_module_attach.c
>> index fb07f5773888..7f3c233943b3 100644
>> --- a/tools/testing/selftests/bpf/progs/test_module_attach.c
>> +++ b/tools/testing/selftests/bpf/progs/test_module_attach.c
>> @@ -117,7 +117,7 @@ int BPF_PROG(handle_fexit_ret, int arg, struct file *ret)
>>
>> bpf_probe_read_kernel(&buf, 8, ret);
>> bpf_probe_read_kernel(&buf, 8, (char *)ret + 256);
>> - *(volatile long long *)ret;
>> + *(volatile int *)ret;
>
> we already have `*(volatile int *)&ret->f_mode;` below, do we really
> need this int casting case?.. Maybe instead of guessing the size of
> file's first field, let's just remove `*(volatile long long *)ret;`
> altogether?
I was assuming the original test covers two cases:
1) deref ret itself;
2) deref a member of ret (ret->f_mode);
Therefore, instead of doing something like
*(volatile long long *)&ret->f_ref; /* first member of file */
I got current version.
If we don't need the first case, we sure can remove it.
Thanks,
Song
>
>> *(volatile int *)&ret->f_mode;
>> return 0;
Powered by blists - more mailing lists