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:
parent
8ab9da573d
commit
1162f84403
|
@ -117,6 +117,25 @@ static int count_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type)
|
||||||
return prog_cnt;
|
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,
|
static int show_attached_bpf_progs(int cgroup_fd, enum bpf_attach_type type,
|
||||||
int level)
|
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)
|
static int do_show(int argc, char **argv)
|
||||||
{
|
{
|
||||||
enum bpf_attach_type type;
|
enum bpf_attach_type type;
|
||||||
|
int has_attached_progs;
|
||||||
const char *path;
|
const char *path;
|
||||||
int cgroup_fd;
|
int cgroup_fd;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
@ -192,6 +212,16 @@ static int do_show(int argc, char **argv)
|
||||||
goto exit;
|
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)
|
if (json_output)
|
||||||
jsonw_start_array(json_wtr);
|
jsonw_start_array(json_wtr);
|
||||||
else
|
else
|
||||||
|
@ -212,6 +242,7 @@ static int do_show(int argc, char **argv)
|
||||||
if (json_output)
|
if (json_output)
|
||||||
jsonw_end_array(json_wtr);
|
jsonw_end_array(json_wtr);
|
||||||
|
|
||||||
|
exit_cgroup:
|
||||||
close(cgroup_fd);
|
close(cgroup_fd);
|
||||||
exit:
|
exit:
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -228,7 +259,7 @@ static int do_show_tree_fn(const char *fpath, const struct stat *sb,
|
||||||
int typeflag, struct FTW *ftw)
|
int typeflag, struct FTW *ftw)
|
||||||
{
|
{
|
||||||
enum bpf_attach_type type;
|
enum bpf_attach_type type;
|
||||||
bool skip = true;
|
int has_attached_progs;
|
||||||
int cgroup_fd;
|
int cgroup_fd;
|
||||||
|
|
||||||
if (typeflag != FTW_D)
|
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;
|
return SHOW_TREE_FN_ERR;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (type = 0; type < __MAX_BPF_ATTACH_TYPE; type++) {
|
has_attached_progs = cgroup_has_attached_progs(cgroup_fd);
|
||||||
int count = count_attached_bpf_progs(cgroup_fd, type);
|
if (has_attached_progs < 0) {
|
||||||
|
|
||||||
if (count < 0 && errno != EINVAL) {
|
|
||||||
p_err("can't query bpf programs attached to %s: %s",
|
p_err("can't query bpf programs attached to %s: %s",
|
||||||
fpath, strerror(errno));
|
fpath, strerror(errno));
|
||||||
close(cgroup_fd);
|
close(cgroup_fd);
|
||||||
return SHOW_TREE_FN_ERR;
|
return SHOW_TREE_FN_ERR;
|
||||||
}
|
} else if (!has_attached_progs) {
|
||||||
if (count > 0) {
|
|
||||||
skip = false;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (skip) {
|
|
||||||
close(cgroup_fd);
|
close(cgroup_fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue