Message ID | 20220829231828.1016835-1-haoluo@google.com (mailing list archive) |
---|---|
State | Accepted |
Commit | 6f95de6d713130c953af0a40b13c1da519f91c4e |
Delegated to: | BPF |
Headers | show |
Series | [bpf-next,v1] bpftool: Add support for querying cgroup_iter link | expand |
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@google.com> > --- > 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@isovalent.com>
On 8/29/22 4:18 PM, 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@google.com> Acked-by: Yonghong Song <yhs@fb.com>
On Tue, Aug 30, 2022 at 02:33:47PM +0100, Quentin Monnet wrote: > > +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? I added "unknown" and applied.
Hello: This patch was applied to bpf/bpf-next.git (master) by Martin KaFai Lau <martin.lau@linux.dev>: On Mon, 29 Aug 2022 16:18:28 -0700 you 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 > > [...] Here is the summary with links: - [bpf-next,v1] bpftool: Add support for querying cgroup_iter link https://git.kernel.org/bpf/bpf-next/c/6f95de6d7131 You are awesome, thank you!
On Tue, Aug 30, 2022 at 11:06 AM Martin KaFai Lau <kafai@fb.com> wrote: > > On Tue, Aug 30, 2022 at 02:33:47PM +0100, Quentin Monnet wrote: > > > +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? > I added "unknown" and applied. Thanks Martin and Quentin, "unknown" is better than an empty string.
On Tue, Aug 30, 2022 at 9:41 AM Yonghong Song <yhs@fb.com> wrote: > > On 8/29/22 4:18 PM, Hao Luo wrote: [...] > > > > Signed-off-by: Hao Luo <haoluo@google.com> > > Acked-by: Yonghong Song <yhs@fb.com> Thanks Yonghong.
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 ""; + } +} + 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)