public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Quentin Monnet <qmo@kernel.org>
To: Alexei Starovoitov <alexei.starovoitov@gmail.com>
Cc: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>,
	bpf <bpf@vger.kernel.org>, Alan Maguire <alan.maguire@oracle.com>,
	Yonghong Song <yonghong.song@linux.dev>,
	Alexei Starovoitov <ast@kernel.org>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Andrii Nakryiko <andrii@kernel.org>,
	Martin KaFai Lau <martin.lau@linux.dev>,
	Eduard Zingerman <eddyz87@gmail.com>, Song Liu <song@kernel.org>,
	John Fastabend <john.fastabend@gmail.com>,
	KP Singh <kpsingh@kernel.org>,
	Stanislav Fomichev <sdf@fomichev.me>, Hao Luo <haoluo@google.com>,
	Jiri Olsa <jolsa@kernel.org>, Shuah Khan <shuah@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>,
	"open list:KERNEL SELFTEST FRAMEWORK"
	<linux-kselftest@vger.kernel.org>
Subject: Re: [PATCH v3 1/2] bpftool: Print map ID upon creation and support JSON output
Date: Thu, 6 Nov 2025 02:25:51 +0000	[thread overview]
Message-ID: <667fb65c-d8d3-4af9-8efe-196e6d1befcc@kernel.org> (raw)
In-Reply-To: <CAADnVQL7cLYPKEQOLWi1DjTZjhE_Fy4zWLrWG+=NSeN821SyMw@mail.gmail.com>

2025-11-05 18:14 UTC-0800 ~ Alexei Starovoitov
<alexei.starovoitov@gmail.com>
> On Wed, Nov 5, 2025 at 6:05 PM Quentin Monnet <qmo@kernel.org> wrote:
>>
>> 2025-11-05 17:29 UTC-0800 ~ Alexei Starovoitov
>> <alexei.starovoitov@gmail.com>
>>> On Wed, Nov 5, 2025 at 1:38 AM Quentin Monnet <qmo@kernel.org> wrote:
>>>>
>>>> 2025-11-04 09:54 UTC-0800 ~ Alexei Starovoitov
>>>> <alexei.starovoitov@gmail.com>
>>>>> On Sat, Nov 1, 2025 at 12:34 PM Harshit Mogalapalli
>>>>> <harshit.m.mogalapalli@oracle.com> wrote:
>>>>>>
>>>>>> It is useful to print map ID on successful creation.
>>>>>>
>>>>>> JSON case:
>>>>>> $ ./bpftool -j map create /sys/fs/bpf/test_map4 type hash key 4 value 8 entries 128 name map4
>>>>>> {"id":12}
>>>>>>
>>>>>> Generic case:
>>>>>> $ ./bpftool  map create /sys/fs/bpf/test_map5 type hash key 4 value 8 entries 128 name map5
>>>>>> Map successfully created with ID: 15
>>>>>>
>>>>>> Bpftool Issue: https://github.com/libbpf/bpftool/issues/121
>>>>>> Acked-by: Yonghong Song <yonghong.song@linux.dev>
>>>>>> Reviewed-by: Quentin Monnet <qmo@kernel.org>
>>>>>> Signed-off-by: Harshit Mogalapalli <harshit.m.mogalapalli@oracle.com>
>>>>>> ---
>>>>>> v2->v3: remove a line break("\n" ) in p_err statement. [Thanks Quentin]
>>>>>> ---
>>>>>>  tools/bpf/bpftool/map.c | 21 +++++++++++++++++----
>>>>>>  1 file changed, 17 insertions(+), 4 deletions(-)
>>>>>>
>>>>>> diff --git a/tools/bpf/bpftool/map.c b/tools/bpf/bpftool/map.c
>>>>>> index c9de44a45778..f32ae5476d76 100644
>>>>>> --- a/tools/bpf/bpftool/map.c
>>>>>> +++ b/tools/bpf/bpftool/map.c
>>>>>> @@ -1251,6 +1251,8 @@ static int do_create(int argc, char **argv)
>>>>>>         LIBBPF_OPTS(bpf_map_create_opts, attr);
>>>>>>         enum bpf_map_type map_type = BPF_MAP_TYPE_UNSPEC;
>>>>>>         __u32 key_size = 0, value_size = 0, max_entries = 0;
>>>>>> +       struct bpf_map_info map_info = {};
>>>>>> +       __u32 map_info_len = sizeof(map_info);
>>>>>>         const char *map_name = NULL;
>>>>>>         const char *pinfile;
>>>>>>         int err = -1, fd;
>>>>>> @@ -1353,13 +1355,24 @@ static int do_create(int argc, char **argv)
>>>>>>         }
>>>>>>
>>>>>>         err = do_pin_fd(fd, pinfile);
>>>>>> -       close(fd);
>>>>>>         if (err)
>>>>>> -               goto exit;
>>>>>> +               goto close_fd;
>>>>>>
>>>>>> -       if (json_output)
>>>>>> -               jsonw_null(json_wtr);
>>>>>> +       err = bpf_obj_get_info_by_fd(fd, &map_info, &map_info_len);
>>>>>> +       if (err) {
>>>>>> +               p_err("Failed to fetch map info: %s", strerror(errno));
>>>>>> +               goto close_fd;
>>>>>> +       }
>>>>>>
>>>>>> +       if (json_output) {
>>>>>> +               jsonw_start_object(json_wtr);
>>>>>> +               jsonw_int_field(json_wtr, "id", map_info.id);
>>>>>> +               jsonw_end_object(json_wtr);
>>>>>> +       } else {
>>>>>> +               printf("Map successfully created with ID: %u\n", map_info.id);
>>>>>> +       }
>>>>>
>>>>> bpftool doesn't print it today and some scripts may depend on that.
>>>>
>>>>
>>>> Hi Alexei, are you sure we can't add any input at all? I'm concerned
>>>> that users won't ever find the IDs for created maps they might want to
>>>> use, if they never see it in the plain output.
>>>>
>>>>
>>>>> Let's drop this 'printf'. Json can do it unconditionally, since
>>>>> json parsing scripts should filter things they care about.
>>>>
>>>> I'd say the risk is the same. Scripts should filter things, but in
>>>> practise they might just as well be comparing to "null" today, given
>>>> that we didn't have any other output for the command so far. Conversely,
>>>> what scripts should not do is rely on plain output, we've always
>>>> recommended using bpftool's JSON for automation (or the exit code, in
>>>> the case of map creation). So I'm not convinced it's justified to
>>>> introduce a difference between plain and JSON in the current case.
>>>
>>> tbh the "map create" feature suppose to create and pin and if both
>>> are successful then the map will be there and bpftool will
>>> exit with success.
>>> Now you're arguing that there could be a race with another
>>> bpftool/something that pins a different map in the same location
>>> and success of bpftool doesn't mean that exact that map is there.
>>> Other tool could have unpinned/deleted map, pinned another one, etc.
>>> Sure, such races are possible, but returning map id still
>>> looks pointless. It doesn't solve any race.
>>> So the whole 'lets print id' doesn't quite make sense to me.
>>
>> OK "solving races" is not accurate, but returning the ID gives a unique
>> handle to work with the map, if a user runs a follow-up invocation to
>> update entries using the ID they can be sure they're working with the
>> same map - whatever happened with the bpffs. Or they can have the update
>> fail if you really want that particular map but, for example, it's been
>> recreated in the meantime. At the moment there's no way to uniquely
>> identify the map we've created with bpftool, and that seems weird to me.
> 
> ID is not unique. If somebody rm -rf bpffs. That ID will not point anywhere.
> Also it's 31-bit space and folks in the past demonstrated an attack
> to recycle the same ID.
> So the users cannot be sure what ID is this.
> 

Ah. I did assume it was unique :/. My bad, then in that case it doesn't
make too much sense, indeed.

  reply	other threads:[~2025-11-06  2:25 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-11-01 19:33 [PATCH v3 0/2] Print map ID on successful creation Harshit Mogalapalli
2025-11-01 19:33 ` [PATCH v3 1/2] bpftool: Print map ID upon creation and support JSON output Harshit Mogalapalli
2025-11-04 17:54   ` Alexei Starovoitov
2025-11-05  9:37     ` Quentin Monnet
2025-11-06  1:29       ` Alexei Starovoitov
2025-11-06  2:05         ` Quentin Monnet
2025-11-06  2:14           ` Alexei Starovoitov
2025-11-06  2:25             ` Quentin Monnet [this message]
2025-11-06 13:12               ` Harshit Mogalapalli
2025-11-01 19:33 ` [PATCH v3 2/2] selftests/bpf: Add test for bpftool map ID printing Harshit Mogalapalli
2025-11-03 14:31   ` Quentin Monnet

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=667fb65c-d8d3-4af9-8efe-196e6d1befcc@kernel.org \
    --to=qmo@kernel.org \
    --cc=alan.maguire@oracle.com \
    --cc=alexei.starovoitov@gmail.com \
    --cc=andrii@kernel.org \
    --cc=ast@kernel.org \
    --cc=bpf@vger.kernel.org \
    --cc=daniel@iogearbox.net \
    --cc=eddyz87@gmail.com \
    --cc=haoluo@google.com \
    --cc=harshit.m.mogalapalli@oracle.com \
    --cc=john.fastabend@gmail.com \
    --cc=jolsa@kernel.org \
    --cc=kpsingh@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=martin.lau@linux.dev \
    --cc=sdf@fomichev.me \
    --cc=shuah@kernel.org \
    --cc=song@kernel.org \
    --cc=yonghong.song@linux.dev \
    /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