Thread (46 messages) 46 messages, 5 authors, 2022-07-07

Re: [PATCH bpf-next v2 4/8] bpf: Introduce cgroup iter

From: Hao Luo <hidden>
Date: 2022-07-07 23:33:42
Also in: bpf, cgroups, lkml

On Mon, Jun 27, 2022 at 9:09 PM Yonghong Song [off-list ref] wrote:


On 6/10/22 12:44 PM, Yosry Ahmed wrote:
quoted
From: Hao Luo <redacted>

Cgroup_iter is a type of bpf_iter. It walks over cgroups in two modes:

  - walking a cgroup's descendants.
  - walking a cgroup's ancestors.
The implementation has another choice, BPF_ITER_CGROUP_PARENT_UP.
We should add it here as well.
Sorry about the late reply. I meant to write two modes: walking up and
walking down. And two sub-modes when walking down: pre-order and
post-order.

But it seems this is confusing. I'm going to use three modes in the
next version: UP, PRE and POST.

Besides, since this patch modifies the bpf_iter_link_info, and that
breaks the btf_dump selftest, I need to include the fix of the
selftest in this patch.
quoted
When attaching cgroup_iter, one can set a cgroup to the iter_link
created from attaching. This cgroup is passed as a file descriptor and
serves as the starting point of the walk. If no cgroup is specified,
the starting point will be the root cgroup.

For walking descendants, one can specify the order: either pre-order or
post-order. For walking ancestors, the walk starts at the specified
cgroup and ends at the root.

One can also terminate the walk early by returning 1 from the iter
program.

Note that because walking cgroup hierarchy holds cgroup_mutex, the iter
program is called with cgroup_mutex held.
Overall looks good to me with a few nits below.

Acked-by: Yonghong Song <redacted>
quoted
Signed-off-by: Hao Luo <redacted>
Signed-off-by: Yosry Ahmed <redacted>
---
[...]
quoted
+
+/* cgroup_iter provides two modes of traversal to the cgroup hierarchy.
+ *
+ *  1. Walk the descendants of a cgroup.
+ *  2. Walk the ancestors of a cgroup.
three modes here?
Same here. Will use 'three modes' in the next version.
quoted
+ *
[...]
quoted
+
+static int bpf_iter_attach_cgroup(struct bpf_prog *prog,
+                               union bpf_iter_link_info *linfo,
+                               struct bpf_iter_aux_info *aux)
+{
+     int fd = linfo->cgroup.cgroup_fd;
+     struct cgroup *cgrp;
+
+     if (fd)
+             cgrp = cgroup_get_from_fd(fd);
+     else /* walk the entire hierarchy by default. */
+             cgrp = cgroup_get_from_path("/");
+
+     if (IS_ERR(cgrp))
+             return PTR_ERR(cgrp);
+
+     aux->cgroup.start = cgrp;
+     aux->cgroup.order = linfo->cgroup.traversal_order;
The legality of traversal_order should be checked.
Sounds good. Will do.
quoted
+     return 0;
+}
+
[...]
quoted
+static void bpf_iter_cgroup_show_fdinfo(const struct bpf_iter_aux_info *aux,
+                                     struct seq_file *seq)
+{
+     char *buf;
+
+     buf = kzalloc(PATH_MAX, GFP_KERNEL);
+     if (!buf) {
+             seq_puts(seq, "cgroup_path:\n");
This is a really unlikely case. maybe "cgroup_path:<unknown>"?
Sure, no problem. This is a path that is unlikely to hit.
quoted
+             goto show_order;
[...]
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help