[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <87zf98xq20.fsf@linux.dev>
Date: Thu, 30 Oct 2025 10:22:31 -0700
From: Roman Gushchin <roman.gushchin@...ux.dev>
To: Song Liu <song@...nel.org>
Cc: Andrew Morton <akpm@...ux-foundation.org>,
linux-kernel@...r.kernel.org, Alexei Starovoitov <ast@...nel.org>,
Suren Baghdasaryan <surenb@...gle.com>, Michal Hocko
<mhocko@...nel.org>, Shakeel Butt <shakeel.butt@...ux.dev>, Johannes
Weiner <hannes@...xchg.org>, Andrii Nakryiko <andrii@...nel.org>, JP
Kobryn <inwardvessel@...il.com>, linux-mm@...ck.org,
cgroups@...r.kernel.org, bpf@...r.kernel.org, Martin KaFai Lau
<martin.lau@...nel.org>, Kumar Kartikeya Dwivedi <memxor@...il.com>,
Tejun Heo <tj@...nel.org>
Subject: Re: [PATCH v2 02/23] bpf: initial support for attaching struct ops
to cgroups
Song Liu <song@...nel.org> writes:
> On Mon, Oct 27, 2025 at 4:17 PM Roman Gushchin <roman.gushchin@...ux.dev> wrote:
> [...]
>> struct bpf_struct_ops_value {
>> struct bpf_struct_ops_common_value common;
>> @@ -1359,6 +1360,18 @@ int bpf_struct_ops_link_create(union bpf_attr *attr)
>> }
>> bpf_link_init(&link->link, BPF_LINK_TYPE_STRUCT_OPS, &bpf_struct_ops_map_lops, NULL,
>> attr->link_create.attach_type);
>> +#ifdef CONFIG_CGROUPS
>> + if (attr->link_create.cgroup.relative_fd) {
>> + struct cgroup *cgrp;
>> +
>> + cgrp = cgroup_get_from_fd(attr->link_create.cgroup.relative_fd);
>
> We should use "target_fd" here, not relative_fd.
>
> Also, 0 is a valid fd, so we cannot use target_fd == 0 to attach to
> global memcg.
Yep, but then we need somehow signal there is a cgroup fd passed,
so that struct ops'es which are not attached to cgroups keep working
as previously. And we can't use link_create.attach_type.
Should I use link_create.flags? E.g. something like add new flag
@@ -1224,6 +1224,7 @@ enum bpf_perf_event_type {
#define BPF_F_AFTER (1U << 4)
#define BPF_F_ID (1U << 5)
#define BPF_F_PREORDER (1U << 6)
+#define BPF_F_CGROUP (1U << 7)
#define BPF_F_LINK BPF_F_LINK /* 1 << 13 */
/* If BPF_F_STRICT_ALIGNMENT is used in BPF_PROG_LOAD command, the
and then do something like this:
int bpf_struct_ops_link_create(union bpf_attr *attr)
{
<...>
if (attr->link_create.flags & BPF_F_CGROUP) {
struct cgroup *cgrp;
cgrp = cgroup_get_from_fd(attr->link_create.target_fd);
if (IS_ERR(cgrp)) {
err = PTR_ERR(cgrp);
goto err_out;
}
link->cgroup_id = cgroup_id(cgrp);
cgroup_put(cgrp);
}
Does it sound right?
Thanks
Powered by blists - more mailing lists