Merge tag 'hwlock-v5.6' of git://git.kernel.org/pub/scm/linux/kernel/git/andersson...
[linux-2.6-microblaze.git] / tools / bpf / bpftool / cgroup.c
index 1ef45e5..62c6a1d 100644 (file)
@@ -14,7 +14,7 @@
 #include <sys/types.h>
 #include <unistd.h>
 
-#include <bpf.h>
+#include <bpf/bpf.h>
 
 #include "main.h"
 
@@ -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;
        }