bpf: Print error message for bpftool cgroup show
Currently, when bpftool cgroup show <path> has an error, no error message is printed. This is confusing because the user may think the result is empty. Before the change: $ bpftool cgroup show /sys/fs/cgroup ID AttachType AttachFlags Name $ echo $? 255 After the change: $ ./bpftool cgroup show /sys/fs/cgroup Error: can't query bpf programs attached to /sys/fs/cgroup: Operation not permitted v2: Rename check_query_cgroup_progs to cgroup_has_attached_progs Signed-off-by: Hechao Li <hechaol@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net> Link: https://lore.kernel.org/bpf/20191224011742.3714301-1-hechaol@fb.com
This commit is contained in:
Родитель
8ab9da573d
Коммит
1162f84403
|
@ -117,6 +117,25 @@ static int count_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type)
|
|||
return prog_cnt;
|
||||
}
|
||||
|
||||
static int cgroup_has_attached_progs(int cgroup_fd)
|
||||
{
|
||||
enum bpf_attach_type type;
|
||||
bool no_prog = true;
|
||||
|
||||
for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) {
|
||||
int count = count_attached_bpf_progs(cgroup_fd, type);
|
||||
|
||||
if (count < 0 && errno != EINVAL)
|
||||
return -1;
|
||||
|
||||
if (count > 0) {
|
||||
no_prog = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return no_prog ? 0 : 1;
|
||||
}
|
||||
static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type,
|
||||
int level)
|
||||
{
|
||||
|
@ -161,6 +180,7 @@ static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type,
|
|||
static int do_show(int argc, char **argv)
|
||||
{
|
||||
enum bpf_attach_type type;
|
||||
int has_attached_progs;
|
||||
const char *path;
|
||||
int cgroup_fd;
|
||||
int ret = -1;
|
||||
|
@ -192,6 +212,16 @@ static int do_show(int argc, char **argv)
|
|||
goto exit;
|
||||
}
|
||||
|
||||
has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
|
||||
if (has_attached_progs < 0) {
|
||||
p_err("can't query bpf programs attached to %s: %s",
|
||||
path, strerror(errno));
|
||||
goto exit_cgroup;
|
||||
} else if (!has_attached_progs) {
|
||||
ret = 0;
|
||||
goto exit_cgroup;
|
||||
}
|
||||
|
||||
if (json_output)
|
||||
jsonw_start_array(json_wtr);
|
||||
else
|
||||
|
@ -212,6 +242,7 @@ static int do_show(int argc, char **argv)
|
|||
if (json_output)
|
||||
jsonw_end_array(json_wtr);
|
||||
|
||||
exit_cgroup:
|
||||
close(cgroup_fd);
|
||||
exit:
|
||||
return ret;
|
||||
|
@ -228,7 +259,7 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb,
|
|||
int typeflag, struct FTW *ftw)
|
||||
{
|
||||
enum bpf_attach_type type;
|
||||
bool skip = true;
|
||||
int has_attached_progs;
|
||||
int cgroup_fd;
|
||||
|
||||
if (typeflag != FTW_D)
|
||||
|
@ -240,22 +271,13 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb,
|
|||
return SHOW_TREE_FN_ERR;
|
||||
}
|
||||
|
||||
for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) {
|
||||
int count = count_attached_bpf_progs(cgroup_fd, type);
|
||||
|
||||
if (count < 0 && errno != EINVAL) {
|
||||
p_err("can't query bpf programs attached to %s: %s",
|
||||
fpath, strerror(errno));
|
||||
close(cgroup_fd);
|
||||
return SHOW_TREE_FN_ERR;
|
||||
}
|
||||
if (count > 0) {
|
||||
skip = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (skip) {
|
||||
has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
|
||||
if (has_attached_progs < 0) {
|
||||
p_err("can't query bpf programs attached to %s: %s",
|
||||
fpath, strerror(errno));
|
||||
close(cgroup_fd);
|
||||
return SHOW_TREE_FN_ERR;
|
||||
} else if (!has_attached_progs) {
|
||||
close(cgroup_fd);
|
||||
return 0;
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче