Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

bpftool: Query only cgroup-related attach types

When CONFIG_NETKIT=y,
bpftool-cgroup shows error even if the cgroup's path is correct:

$ bpftool cgroup tree /sys/fs/cgroup
CgroupPath
ID AttachType AttachFlags Name
Error: can't query bpf programs attached to /sys/fs/cgroup: No such device or address

>From strace and kernel tracing, I found netkit returned ENXIO and this command failed.
I think this AttachType(BPF_NETKIT_PRIMARY) is not relevant to cgroup.

bpftool-cgroup should query just only cgroup-related attach types.

v2->v3:
- removed an unnecessary check

v1->v2:
- used an array of cgroup attach types

Signed-off-by: Kenta Tada <tadakentaso@gmail.com>
Reviewed-by: Quentin Monnet <qmo@kernel.org>
Link: https://lore.kernel.org/r/20240607111704.6716-1-tadakentaso@gmail.com
Signed-off-by: Alexei Starovoitov <ast@kernel.org>

authored by

Kenta Tada and committed by
Alexei Starovoitov
98b303c9 bb678f01

+36 -4
+36 -4
tools/bpf/bpftool/cgroup.c
··· 19 19 20 20 #include "main.h" 21 21 22 + static const int cgroup_attach_types[] = { 23 + BPF_CGROUP_INET_INGRESS, 24 + BPF_CGROUP_INET_EGRESS, 25 + BPF_CGROUP_INET_SOCK_CREATE, 26 + BPF_CGROUP_INET_SOCK_RELEASE, 27 + BPF_CGROUP_INET4_BIND, 28 + BPF_CGROUP_INET6_BIND, 29 + BPF_CGROUP_INET4_POST_BIND, 30 + BPF_CGROUP_INET6_POST_BIND, 31 + BPF_CGROUP_INET4_CONNECT, 32 + BPF_CGROUP_INET6_CONNECT, 33 + BPF_CGROUP_UNIX_CONNECT, 34 + BPF_CGROUP_INET4_GETPEERNAME, 35 + BPF_CGROUP_INET6_GETPEERNAME, 36 + BPF_CGROUP_UNIX_GETPEERNAME, 37 + BPF_CGROUP_INET4_GETSOCKNAME, 38 + BPF_CGROUP_INET6_GETSOCKNAME, 39 + BPF_CGROUP_UNIX_GETSOCKNAME, 40 + BPF_CGROUP_UDP4_SENDMSG, 41 + BPF_CGROUP_UDP6_SENDMSG, 42 + BPF_CGROUP_UNIX_SENDMSG, 43 + BPF_CGROUP_UDP4_RECVMSG, 44 + BPF_CGROUP_UDP6_RECVMSG, 45 + BPF_CGROUP_UNIX_RECVMSG, 46 + BPF_CGROUP_SOCK_OPS, 47 + BPF_CGROUP_DEVICE, 48 + BPF_CGROUP_SYSCTL, 49 + BPF_CGROUP_GETSOCKOPT, 50 + BPF_CGROUP_SETSOCKOPT, 51 + BPF_LSM_CGROUP 52 + }; 53 + 22 54 #define HELP_SPEC_ATTACH_FLAGS \ 23 55 "ATTACH_FLAGS := { multi | override }" 24 56 ··· 215 183 216 184 static int cgroup_has_attached_progs(int cgroup_fd) 217 185 { 218 - enum bpf_attach_type type; 186 + unsigned int i = 0; 219 187 bool no_prog = true; 220 188 221 - for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) { 222 - int count = count_attached_bpf_progs(cgroup_fd, type); 189 + for (i = 0; i < ARRAY_SIZE(cgroup_attach_types); i++) { 190 + int count = count_attached_bpf_progs(cgroup_fd, cgroup_attach_types[i]); 223 191 224 - if (count < 0 && errno != EINVAL) 192 + if (count < 0) 225 193 return -1; 226 194 227 195 if (count > 0) {