From: Martin KaFai Lau <martin.lau@linux.dev>
To: Kui-Feng Lee <sinquersw@gmail.com>, Kui-Feng Lee <kuifeng@meta.com>
Cc: bpf@vger.kernel.org, ast@kernel.org, song@kernel.org,
kernel-team@meta.com, andrii@kernel.org,
Stanislav Fomichev <sdf@google.com>
Subject: Re: [PATCH bpf-next 1/7] bpf: Create links for BPF struct_ops maps.
Date: Wed, 15 Feb 2023 13:28:31 -0800 [thread overview]
Message-ID: <31ab903b-6ba3-8ee8-f7a6-ab2e09b75f7a@linux.dev> (raw)
In-Reply-To: <78cf4151-8544-bc63-eff7-ff763639c118@gmail.com>
On 2/15/23 12:24 PM, Kui-Feng Lee wrote:
>
> On 2/15/23 10:44, Stanislav Fomichev wrote:
>> On 02/15, Kui-Feng Lee wrote:
>>> Thank you for the feedback.
>>
>>
>>> On 2/14/23 18:39, Stanislav Fomichev wrote:
>>> > On 02/14, Kui-Feng Lee wrote:
> [..]
>>> >
>>> > > +��� if (map->map_type != BPF_MAP_TYPE_STRUCT_OPS)
>>> > > +������� return -EINVAL;
>>> > > +
>>> > > +��� link = kzalloc(sizeof(*link), GFP_USER);
>>> > > +��� if (!link) {
>>> > > +������� err = -ENOMEM;
>>> > > +������� goto err_out;
>>> > > +��� }
>>> > > +��� bpf_link_init(link, BPF_LINK_TYPE_STRUCT_OPS,
>>> > > &bpf_struct_ops_map_lops, NULL);
>>> > > +��� link->map = map;
>>> > > +
>>> > > +��� err = bpf_link_prime(link, &link_primer);
>>> > > +��� if (err)
>>> > > +������� goto err_out;
>>> > > +
>>> > > +��� return bpf_link_settle(&link_primer);
>>> > > +
>>> > > +err_out:
>>> > > +��� bpf_map_put(map);
>>> > > +��� kfree(link);
>>> > > +��� return err;
>>> > > +}
>>> > > +
>>> > > diff --git a/kernel/bpf/syscall.c b/kernel/bpf/syscall.c
>>> > > index cda8d00f3762..54e172d8f5d1 100644
>>> > > --- a/kernel/bpf/syscall.c
>>> > > +++ b/kernel/bpf/syscall.c
>>> > > @@ -2738,7 +2738,9 @@ static void bpf_link_free(struct bpf_link *link)
>>> > > ����� if (link->prog) {
>>> > > ��������� /* detach BPF program, clean up used resources */
>>> > > ��������� link->ops->release(link);
>>> > > -������� bpf_prog_put(link->prog);
>>> > > +������� if (link->type != BPF_LINK_TYPE_STRUCT_OPS)
>>> > > +����������� bpf_prog_put(link->prog);
>>> > > +������� /* The struct_ops links clean up map by them-selves. */
>>> >
>>> > Why not more generic:
>>> >
>>> > if (link->prog)
>>> > ����bpf_prog_put(link->prog);
>>> >
>>> > ?
>>> The `prog` and `map` functions are now occupying the same space. I'm afraid
>>> this check won't work.
>>
>> Hmm, good point. In this case: why not have separate prog/map pointers
>> instead of a union? Are we 100% sure struct_ops is unique enough
>> and there won't ever be another map-based links?
>>
> Good question!
>
> bpf_link is used to attach a single BPF program with a hook now. This patch
> takes things one step further, allowing the attachment of struct_ops. We can
> think of it as attaching a set of BPF programs to a pre-existing set of hooks. I
> would say that bpf_link now represents the attachments of a set of BPF programs
> to a pre-defined set of hooks. The size of a set is one for the case of
> attaching single BPF program.
>
> Is creating a new map-based link indicative of introducing an entirely distinct
> type of map that reflects a set of BPF programs? If so, why doesn't struct_ops
> work? If it happens, we may need to create a function to validate the
> attach_type associated with any given map type.
>
I also prefer separating 'prog' and 'map' in the link. It may be only struct_ops
link that has no prog now but the future link type may not have prog also, so
testing link->prog is less tie-up to a specific link type. Once separated, it
makes sense to push the link's specific field to a new struct, so the following
(from Stan) makes more sense:
struct bpt_struct_ops_link {
struct bpf_link link;
struct bpf_map *map;
};
In bpf_link_free(), there is no need to do an extra check for 'link->type !=
BPF_LINK_TYPE_STRUCT_OPS'. bpf_struct_ops_map_link_release() can be done
together in bpf_struct_ops_map_link_dealloc().
next prev parent reply other threads:[~2023-02-15 21:28 UTC|newest]
Thread overview: 43+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-14 22:17 [PATCH bpf-next 0/7] Transit between BPF TCP congestion controls Kui-Feng Lee
2023-02-14 22:17 ` [PATCH bpf-next 1/7] bpf: Create links for BPF struct_ops maps Kui-Feng Lee
2023-02-15 0:26 ` kernel test robot
2023-02-15 2:39 ` Stanislav Fomichev
2023-02-15 18:04 ` Kui-Feng Lee
2023-02-15 18:44 ` Stanislav Fomichev
2023-02-15 20:24 ` Kui-Feng Lee
2023-02-15 21:28 ` Martin KaFai Lau [this message]
2023-02-15 20:30 ` Martin KaFai Lau
2023-02-15 20:55 ` Kui-Feng Lee
2023-02-15 22:58 ` Martin KaFai Lau
2023-02-16 17:59 ` Kui-Feng Lee
2023-02-14 22:17 ` [PATCH bpf-next 2/7] net: Update an existing TCP congestion control algorithm Kui-Feng Lee
2023-02-15 2:43 ` Stanislav Fomichev
2023-02-15 18:15 ` Kui-Feng Lee
2023-02-14 22:17 ` [PATCH bpf-next 3/7] bpf: Register and unregister a struct_ops by their bpf_links Kui-Feng Lee
2023-02-15 2:53 ` Stanislav Fomichev
2023-02-15 18:29 ` Kui-Feng Lee
2023-02-16 0:37 ` Martin KaFai Lau
2023-02-16 16:42 ` Kui-Feng Lee
2023-02-16 22:38 ` Martin KaFai Lau
2023-02-17 22:17 ` Kui-Feng Lee
2023-02-14 22:17 ` [PATCH bpf-next 4/7] libbpf: Create a bpf_link in bpf_map__attach_struct_ops() Kui-Feng Lee
2023-02-15 2:58 ` Stanislav Fomichev
2023-02-15 18:44 ` Kui-Feng Lee
2023-02-15 18:48 ` Stanislav Fomichev
2023-02-15 22:20 ` Kui-Feng Lee
2023-02-16 22:40 ` Andrii Nakryiko
2023-02-16 22:59 ` Martin KaFai Lau
2023-02-18 0:05 ` Kui-Feng Lee
2023-02-18 1:08 ` Andrii Nakryiko
2023-02-14 22:17 ` [PATCH bpf-next 5/7] bpf: Update the struct_ops of a bpf_link Kui-Feng Lee
2023-02-16 1:02 ` Martin KaFai Lau
2023-02-16 19:17 ` Kui-Feng Lee
2023-02-16 19:40 ` Martin KaFai Lau
2023-02-14 22:17 ` [PATCH bpf-next 6/7] libbpf: Update a bpf_link with another struct_ops Kui-Feng Lee
2023-02-16 22:48 ` Andrii Nakryiko
2023-02-18 0:22 ` Kui-Feng Lee
2023-02-18 1:10 ` Andrii Nakryiko
2023-02-21 22:20 ` Kui-Feng Lee
2023-02-14 22:17 ` [PATCH bpf-next 7/7] selftests/bpf: Test switching TCP Congestion Control algorithms Kui-Feng Lee
2023-02-16 22:50 ` Andrii Nakryiko
2023-02-18 0:23 ` Kui-Feng Lee
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=31ab903b-6ba3-8ee8-f7a6-ab2e09b75f7a@linux.dev \
--to=martin.lau@linux.dev \
--cc=andrii@kernel.org \
--cc=ast@kernel.org \
--cc=bpf@vger.kernel.org \
--cc=kernel-team@meta.com \
--cc=kuifeng@meta.com \
--cc=sdf@google.com \
--cc=sinquersw@gmail.com \
--cc=song@kernel.org \
/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