[<prev] [next>] [<thread-prev] [day] [month] [year] [list]
Message-ID: <f5fa9571-0c9a-8466-b43b-59468b5a1a2b@wangsu.com>
Date: Tue, 23 Jul 2024 09:44:07 +0800
From: Lin Feng <linf@...gsu.com>
To: Hou Tao <houtao@...weicloud.com>
Cc: bpf@...r.kernel.org, linux-kernel@...r.kernel.org,
yonghong.song@...ux.dev, Brian Vazquez <brianvv@...gle.com>,
Daniel Borkmann <daniel@...earbox.net>, ast@...nel.org
Subject: Re: [PATCH] bpf: fix excessively checking for elem_flags in batch
update mode
Hi Tao,
See below please,
On 7/23/24 09:21, Hou Tao wrote:
> Hi,
>
> On 7/20/2024 12:22 AM, Daniel Borkmann wrote:
>> On 7/17/24 1:15 PM, Lin Feng wrote:
>>> Currently generic_map_update_batch will reject all valid command
>>> flags for
>>> BPF_MAP_UPDATE_ELEM other than BPF_F_LOCK, which is overkill, map
>>> updating
>>> semantic does allow specify BPF_NOEXIST or BPF_EXIST even for batching
>>> update.
>>>
>>> Signed-off-by: Lin Feng <linf@...gsu.com>
>>
>> [ +Hou/Brian ]
>>
>> Please also add a BPF selftest along with this extension which
>> exercises the
>> batch update and validates the behavior for the various flags which
>> are now enabled.
>
> Agreed. There are already some batched map operation tests in
> tools/testing/selftests/bpf/map_tests/htab_map_batch_ops.c, I think
> extending the test cases in the file will be fine.
>> Also, please discuss the semantics in the commit msg.. errors due to
>> BPF_EXIST and
>> BPF_NOEXIST will cause bpf_map_update_value() to fail and then break
>> the loop. It's
>> probably fine given batch.count (cp) will be propagated back to user
>> space to tell
>> how many elements could actually get updated.
>
> It seems that the initial commit aa2e93b8e58e ("bpf: Add generic support
> for update and delete batch ops") only enabled BPF_F_LOCK for
> BPF_MAP_UPDATE_BATCH, but the document commit 0cb804547927 ("bpf:
> Document BPF_MAP_*_BATCH syscall commands for BPF_MAP_UPDATE_BATCH
> considered both BPF_NOEXIST and BPF_EXIST are valid. The
> bpf_map_update_batch() API in libbpf also considered both BPF_NOEXIST
> and BPF_EXIST are valid, but we just never test it before.
I did notice the conflict between those two commits, besides the already
supported update flags in single-update mode, the latter patch says "both
BPF_NOEXIST and BPF_EXIST are valid", so here came this patch.
And thank you again for your detailed analysis, so I need to extend the
testsuits and confirm this one wouldn't break any exsiting ones, I will
resend them batch in next version.
Have a nice day,
linfeng
>>
>>> ---
>>> kernel/bpf/syscall.c | 2 +-
>>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>>
>>> diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
>>> index 869265852d51..d85361f9a9b8 100644
>>> --- a/kernel/bpf/syscall.c
>>> +++ b/kernel/bpf/syscall.c
>>> @@ -1852,7 +1852,7 @@ int generic_map_update_batch(struct bpf_map
>>> *map, struct file *map_file,
>>> void *key, *value;
>>> int err = 0;
>>> - if (attr->batch.elem_flags & ~BPF_F_LOCK)
>>> + if ((attr->batch.elem_flags & ~BPF_F_LOCK) > BPF_EXIST)
>>> return -EINVAL;
>>> if ((attr->batch.elem_flags & BPF_F_LOCK) &&
>>>
>>
>> .
>
Powered by blists - more mailing lists