On 30/08/2022 00:18, Hao Luo wrote: > Support dumping info of a cgroup_iter link. This includes > showing the cgroup's id and the order for walking the cgroup > hierarchy. Example output is as follows: > >> bpftool link show > 1: iter prog 2 target_name bpf_map > 2: iter prog 3 target_name bpf_prog > 3: iter prog 12 target_name cgroup cgroup_id 72 order self_only > >> bpftool -p link show > [{ > "id": 1, > "type": "iter", > "prog_id": 2, > "target_name": "bpf_map" > },{ > "id": 2, > "type": "iter", > "prog_id": 3, > "target_name": "bpf_prog" > },{ > "id": 3, > "type": "iter", > "prog_id": 12, > "target_name": "cgroup", > "cgroup_id": 72, > "order": "self_only" > } > ] > > Signed-off-by: Hao Luo <haoluo@xxxxxxxxxx> > --- > tools/bpf/bpftool/link.c | 35 +++++++++++++++++++++++++++++++++++ > 1 file changed, 35 insertions(+) > > diff --git a/tools/bpf/bpftool/link.c b/tools/bpf/bpftool/link.c > index 7a20931c3250..9e8d14d0114d 100644 > --- a/tools/bpf/bpftool/link.c > +++ b/tools/bpf/bpftool/link.c > @@ -83,6 +83,29 @@ static bool is_iter_map_target(const char *target_name) > strcmp(target_name, "bpf_sk_storage_map") == 0; > } > > +static bool is_iter_cgroup_target(const char *target_name) > +{ > + return strcmp(target_name, "cgroup") == 0; > +} > + > +static const char *cgroup_order_string(__u32 order) > +{ > + switch (order) { > + case BPF_CGROUP_ITER_ORDER_UNSPEC: > + return "order_unspec"; > + case BPF_CGROUP_ITER_SELF_ONLY: > + return "self_only"; > + case BPF_CGROUP_ITER_DESCENDANTS_PRE: > + return "descendants_pre"; > + case BPF_CGROUP_ITER_DESCENDANTS_POST: > + return "descendants_post"; > + case BPF_CGROUP_ITER_ANCESTORS_UP: > + return "ancestors_up"; > + default: /* won't happen */ > + return ""; I wonder if that one should be "unknown", in case another option is added in the future, so we can spot it and address it? > + } > +} > + > static void show_iter_json(struct bpf_link_info *info, json_writer_t *wtr) > { > const char *target_name = u64_to_ptr(info->iter.target_name); > @@ -91,6 +114,12 @@ static void show_iter_json(struct bpf_link_info *info, json_writer_t *wtr) > > if (is_iter_map_target(target_name)) > jsonw_uint_field(wtr, "map_id", info->iter.map.map_id); > + > + if (is_iter_cgroup_target(target_name)) { > + jsonw_lluint_field(wtr, "cgroup_id", info->iter.cgroup.cgroup_id); > + jsonw_string_field(wtr, "order", > + cgroup_order_string(info->iter.cgroup.order)); > + } > } > > static int get_prog_info(int prog_id, struct bpf_prog_info *info) > @@ -208,6 +237,12 @@ static void show_iter_plain(struct bpf_link_info *info) > > if (is_iter_map_target(target_name)) > printf("map_id %u ", info->iter.map.map_id); > + > + if (is_iter_cgroup_target(target_name)) { > + printf("cgroup_id %llu ", info->iter.cgroup.cgroup_id); > + printf("order %s ", > + cgroup_order_string(info->iter.cgroup.order)); > + } > } > > static int show_link_close_plain(int fd, struct bpf_link_info *info) Looks good to me, thank you! Reviewed-by: Quentin Monnet <quentin@xxxxxxxxxxxxx>