]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
lsfd: add BPF-PROG.TYPE, BPF-PROG.TYPE.RAW, and BPF-PROG.ID columns
authorMasatake YAMATO <yamato@redhat.com>
Tue, 11 Jul 2023 13:12:05 +0000 (22:12 +0900)
committerMasatake YAMATO <yamato@redhat.com>
Wed, 19 Jul 2023 12:19:47 +0000 (21:19 +0900)
Based on these new columsn, the NAME column for "bpf-prog" is
enhanced.

An example output:

  # ./lsfd -p 1 -Q '(TYPE == "bpf-prog")' | head
  COMMAND PID USER ASSOC XMODE     TYPE       SOURCE MNTID INODE NAME
  systemd   1 root    14 rw--- bpf-prog anon_inodefs    15   106 id=1008 type=lsm
  systemd   1 root    26 rw--- bpf-prog anon_inodefs    15   106 id=2073 type=cgroup_device
  systemd   1 root    27 rw--- bpf-prog anon_inodefs    15   106 id=2074 type=cgroup_skb
  systemd   1 root    28 rw--- bpf-prog anon_inodefs    15   106 id=2075 type=cgroup_skb
  systemd   1 root    30 rw--- bpf-prog anon_inodefs    15   106 id=2076 type=cgroup_device
  systemd   1 root    31 rw--- bpf-prog anon_inodefs    15   106 id=2077 type=cgroup_device
  systemd   1 root    32 rw--- bpf-prog anon_inodefs    15   106 id=2078 type=cgroup_device
  systemd   1 root    33 rw--- bpf-prog anon_inodefs    15   106 id=2079 type=cgroup_skb
  systemd   1 root    34 rw--- bpf-prog anon_inodefs    15   106 id=2080 type=cgroup_skb

Signed-off-by: Masatake YAMATO <yamato@redhat.com>
misc-utils/lsfd-unkn.c
misc-utils/lsfd.1.adoc
misc-utils/lsfd.c
misc-utils/lsfd.h

index 462f44e9074d334c0e6a4b170a573c5cc1e468ca..dbf6ef7b849969db854b6b726412705a3b58c129 100644 (file)
@@ -980,6 +980,156 @@ static const struct anon_ops anon_inotify_ops = {
        .handle_fdinfo = anon_inotify_handle_fdinfo,
 };
 
+/*
+ * bpf-prog
+ *
+ * Generally, we use "-" as the word separators in lsfd's output.
+ * However, about bpf*, we use "_" because bpftool uses "_".
+ */
+static const char *bpf_prog_type_table[] = {
+       [0] = "unspec",            /* BPF_PROG_TYPE_UNSPEC*/
+       [1] = "socket_filter",     /* BPF_PROG_TYPE_SOCKET_FILTER*/
+       [2] = "kprobe",            /* BPF_PROG_TYPE_KPROBE*/
+       [3] = "sched_cls",         /* BPF_PROG_TYPE_SCHED_CLS*/
+       [4] = "sched_act",         /* BPF_PROG_TYPE_SCHED_ACT*/
+       [5] = "tracepoint",        /* BPF_PROG_TYPE_TRACEPOINT*/
+       [6] = "xdp",               /* BPF_PROG_TYPE_XDP*/
+       [7] = "perf_event",        /* BPF_PROG_TYPE_PERF_EVENT*/
+       [8] = "cgroup_skb",        /* BPF_PROG_TYPE_CGROUP_SKB*/
+       [9] = "cgroup_sock",       /* BPF_PROG_TYPE_CGROUP_SOCK*/
+       [10] = "lwt_in",           /* BPF_PROG_TYPE_LWT_IN*/
+       [11] = "lwt_out",          /* BPF_PROG_TYPE_LWT_OUT*/
+       [12] = "lwt_xmit",         /* BPF_PROG_TYPE_LWT_XMIT*/
+       [13] = "sock_ops",         /* BPF_PROG_TYPE_SOCK_OPS*/
+       [14] = "sk_skb",           /* BPF_PROG_TYPE_SK_SKB*/
+       [15] = "cgroup_device",    /* BPF_PROG_TYPE_CGROUP_DEVICE*/
+       [16] = "sk_msg",           /* BPF_PROG_TYPE_SK_MSG*/
+       [17] = "raw_tracepoint",   /* BPF_PROG_TYPE_RAW_TRACEPOINT*/
+       [18] = "cgroup_sock_addr", /* BPF_PROG_TYPE_CGROUP_SOCK_ADDR*/
+       [19] = "lwt_seg6local",    /* BPF_PROG_TYPE_LWT_SEG6LOCAL*/
+       [20] = "lirc_mode2",       /* BPF_PROG_TYPE_LIRC_MODE2*/
+       [21] = "sk_reuseport",     /* BPF_PROG_TYPE_SK_REUSEPORT*/
+       [22] = "flow_dissector",   /* BPF_PROG_TYPE_FLOW_DISSECTOR*/
+       [23] = "cgroup_sysctl",    /* BPF_PROG_TYPE_CGROUP_SYSCTL*/
+       [24] = "raw_tracepoint_writable", /* BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE*/
+       [25] = "cgroup_sockopt", /* BPF_PROG_TYPE_CGROUP_SOCKOPT*/
+       [26] = "tracing",        /* BPF_PROG_TYPE_TRACING*/
+       [27] = "struct_ops",     /* BPF_PROG_TYPE_STRUCT_OPS*/
+       [28] = "ext",            /* BPF_PROG_TYPE_EXT*/
+       [29] = "lsm",            /* BPF_PROG_TYPE_LSM*/
+       [30] = "sk_lookup",      /* BPF_PROG_TYPE_SK_LOOKUP*/
+       [31] = "syscall",        /* BPF_PROG_TYPE_SYSCALL*/
+};
+
+struct anon_bpf_prog_data {
+       int type;
+       int id;
+};
+
+static bool anon_bpf_prog_probe(const char *str)
+{
+       return strncmp(str, "bpf-prog", 8) == 0;
+}
+
+static const char *anon_bpf_prog_get_prog_type_name(int type)
+{
+       if (0 <= type && type < (int)ARRAY_SIZE(bpf_prog_type_table))
+               return bpf_prog_type_table[type];
+       return NULL;
+}
+
+static bool anon_bpf_prog_fill_column(struct proc *proc  __attribute__((__unused__)),
+                                     struct unkn *unkn,
+                                     struct libscols_line *ln __attribute__((__unused__)),
+                                     int column_id,
+                                     size_t column_index __attribute__((__unused__)),
+                                    char **str)
+{
+       struct anon_bpf_prog_data *data = (struct anon_bpf_prog_data *)unkn->anon_data;
+       const char *t;
+
+       switch(column_id) {
+       case COL_BPF_PROG_ID:
+               xasprintf(str, "%d", data->id);
+               return true;
+       case COL_BPF_PROG_TYPE_RAW:
+               xasprintf(str, "%d", data->type);
+               return true;
+       case COL_BPF_PROG_TYPE:
+               t = anon_bpf_prog_get_prog_type_name(data->type);
+               if (t)
+                       *str = xstrdup(t);
+               else
+                       xasprintf(str, "UNKNOWN(%d)", data->type);
+               return true;
+       default:
+               return false;
+       }
+}
+
+static char *anon_bpf_prog_get_name(struct unkn *unkn)
+{
+       const char *t;
+       char *str = NULL;
+       struct anon_bpf_prog_data *data = (struct anon_bpf_prog_data *)unkn->anon_data;
+
+       t = anon_bpf_prog_get_prog_type_name(data->type);
+       if (t)
+               xasprintf(&str, "id=%d type=%s", data->id, t);
+       else
+               xasprintf(&str, "id=%d type=UNKNOWN(%d)", data->id, data->type);
+
+       return str;
+}
+
+
+static void anon_bpf_prog_init(struct unkn *unkn)
+{
+       struct anon_bpf_prog_data *data = xmalloc(sizeof(*data));
+       data->type = -1;
+       data->id = -1;
+       unkn->anon_data = data;
+}
+
+static void anon_bpf_prog_free(struct unkn *unkn)
+{
+       struct anon_bpf_prog_data *data = (struct anon_bpf_prog_data *)unkn->anon_data;
+       free(data);
+}
+
+static int anon_bpf_prog_handle_fdinfo(struct unkn *unkn, const char *key, const char *value)
+{
+       if (strcmp(key, "prog_id") == 0) {
+               int32_t t = -1;
+               int rc = ul_strtos32(value, &t, 10);
+               if (rc < 0)
+                       return 0; /* ignore -- parse failed */
+               ((struct anon_bpf_prog_data *)unkn->anon_data)->id = (int)t;
+               return 1;
+       }
+
+       if (strcmp(key, "prog_type") == 0) {
+               int32_t t = -1;
+               int rc = ul_strtos32(value, &t, 10);
+               if (rc < 0)
+                       return 0; /* ignore -- parse failed */
+               ((struct anon_bpf_prog_data *)unkn->anon_data)->type = (int)t;
+               return 1;
+       }
+
+       return 0;
+}
+
+static const struct anon_ops anon_bpf_prog_ops = {
+       .class = "bpf-prog",
+       .probe = anon_bpf_prog_probe,
+       .get_name = anon_bpf_prog_get_name,
+       .fill_column = anon_bpf_prog_fill_column,
+       .init = anon_bpf_prog_init,
+       .free = anon_bpf_prog_free,
+       .handle_fdinfo = anon_bpf_prog_handle_fdinfo,
+};
+
 /*
  * generic (fallback implementation)
  */
@@ -999,6 +1149,7 @@ static const struct anon_ops *anon_ops[] = {
        &anon_timerfd_ops,
        &anon_signalfd_ops,
        &anon_inotify_ops,
+       &anon_bpf_prog_ops,
 };
 
 static const struct anon_ops *anon_probe(const char *str)
index b2a6aa5322f732bcffc7d26010e0159fdb07d95d..2801cda108ff05e8165a72155247a543220a56f2 100644 (file)
@@ -132,6 +132,15 @@ Association between file and process.
 BLKDRV <``string``>::
 Block device driver name resolved by `/proc/devices`.
 
+BPF-PROG.ID <``number``>::
+Bpf program ID.
+
+BPF-PROG.TYPE <``string``>::
+Decoded name of bpf program type.
+
+BPF-PROG.TYPE.RAW <``number``>::
+Bpf program type (raw).
+
 CHRDRV <``string``>::
 Character device driver name resolved by `/proc/devices`.
 
@@ -241,6 +250,9 @@ Cooked version of KNAME. It is mostly same as KNAME.
 +
 Some files have special formats and information sources:
 +
+bpf-prog:::
+id=_BPF-PROG.ID_ type=_BPF-PROG.TYPE_
++
 eventpoll:::
 tfds=_EVENTPOLL.TFDS_
 +
@@ -748,7 +760,7 @@ mailto:yamato@redhat.com[Masatake YAMATO],
 mailto:kzak@redhat.com[Karel Zak]
 
 == SEE ALSO
-
+*bpftool*(8)
 *lslocks*(8)
 *lsof*(8)
 *pidof*(1)
index bc7f901d481bda88c8de814c17befcaf32c927dc..95b1b6ae01885fbd54ac4a91fea793e1e00429c8 100644 (file)
@@ -129,6 +129,15 @@ static const struct colinfo infos[] = {
        [COL_BLKDRV]           = { "BLKDRV",
                                   0,   SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
                                   N_("block device driver name resolved by /proc/devices") },
+       [COL_BPF_PROG_ID]      = { "BPF-PROG.ID",
+                                  0,   SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER,
+                                  N_("bpf program id associated with the fd") },
+       [COL_BPF_PROG_TYPE]    = { "BPF-PROG.TYPE",
+                                  0,   SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
+                                  N_("bpf program type (decoded)") },
+       [COL_BPF_PROG_TYPE_RAW]= { "BPF-PROG.TYPE.RAW",
+                                  0,   SCOLS_FL_RIGHT, SCOLS_JSON_NUMBER,
+                                  N_("bpf program type (raw)") },
        [COL_CHRDRV]           = { "CHRDRV",
                                   0,   SCOLS_FL_RIGHT, SCOLS_JSON_STRING,
                                   N_("character device driver name resolved by /proc/devices") },
index be4cc55d80872dd9faf6c6e16d831e92270ec27e..0c1bc5bdc0f10499a1e0b558de70d9251265eb52 100644 (file)
@@ -40,6 +40,9 @@ enum {
        COL_AINODECLASS,
        COL_ASSOC,
        COL_BLKDRV,
+       COL_BPF_PROG_ID,
+       COL_BPF_PROG_TYPE,
+       COL_BPF_PROG_TYPE_RAW,
        COL_CHRDRV,
        COL_COMMAND,
        COL_DELETED,