diff options
Diffstat (limited to 'tools/bpf/bpftool/cgroup.c')
| -rw-r--r-- | tools/bpf/bpftool/cgroup.c | 56 | 
1 files changed, 39 insertions, 17 deletions
| diff --git a/tools/bpf/bpftool/cgroup.c b/tools/bpf/bpftool/cgroup.c index 1ef45e55039e..2f017caa678d 100644 --- a/tools/bpf/bpftool/cgroup.c +++ b/tools/bpf/bpftool/cgroup.c @@ -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;  	} | 
