libbpf-tools: fix dev_t type issue
authorWei Fu <fuweid89@gmail.com>
Tue, 28 Dec 2021 15:21:20 +0000 (23:21 +0800)
committeryonghong-song <ys114321@gmail.com>
Wed, 5 Jan 2022 20:32:07 +0000 (12:32 -0800)
The vmlinux.h uses u32 to define dev_t. But the user-space process uses
<sys/types.h> which uses 8 bytes for dev_t. When the libbpf uses mapped
memory to update .rodata, it might override other variable's value. We
should use u32 to fix it.

And also fix `biosnoop -d $dev-name` issue.

Signed-off-by: Wei Fu <fuweid89@gmail.com>
libbpf-tools/biolatency.bpf.c
libbpf-tools/biolatency.c
libbpf-tools/biopattern.bpf.c
libbpf-tools/biopattern.c
libbpf-tools/biosnoop.bpf.c
libbpf-tools/biosnoop.c
libbpf-tools/biostacks.bpf.c
libbpf-tools/biostacks.c
libbpf-tools/bitesize.bpf.c
libbpf-tools/bitesize.c

index 91e21c3ebaa3ea1e4080cf2ed790e0c30faeb70e..648dda78cf995dbaf602c6236110b4ada66f5e59 100644 (file)
@@ -16,7 +16,8 @@ const volatile bool targ_per_disk = false;
 const volatile bool targ_per_flag = false;
 const volatile bool targ_queued = false;
 const volatile bool targ_ms = false;
-const volatile dev_t targ_dev = -1;
+const volatile bool filter_dev = false;
+const volatile __u32 targ_dev = 0;
 
 struct {
        __uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
@@ -51,9 +52,9 @@ int trace_rq_start(struct request *rq, int issue)
 
        u64 ts = bpf_ktime_get_ns();
 
-       if (targ_dev != -1) {
+       if (filter_dev) {
                struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
-               dev_t dev;
+               u32 dev;
 
                dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
                                BPF_CORE_READ(disk, first_minor)) : 0;
index bc0b0f75129b491f313d223e69f0ba2e1e2f44f2..51afa50910569b6ef1796904fb60fdf1eca7c36d 100644 (file)
@@ -277,6 +277,7 @@ int main(int argc, char **argv)
                        fprintf(stderr, "invaild partition name: not exist\n");
                        goto cleanup;
                }
+               obj->rodata->filter_dev = true;
                obj->rodata->targ_dev = partition->dev;
        }
        obj->rodata->targ_per_disk = env.per_disk;
index 775455bd08f088677e264a844c632a5a83e06e3b..bf051bc320a80bc5f2cce3e308ec841182f9b049 100644 (file)
@@ -6,12 +6,13 @@
 #include "biopattern.h"
 #include "maps.bpf.h"
 
-const volatile dev_t targ_dev = -1;
+const volatile bool filter_dev = false;
+const volatile __u32 targ_dev = 0;
 
 struct {
        __uint(type, BPF_MAP_TYPE_HASH);
        __uint(max_entries, 64);
-       __type(key, dev_t);
+       __type(key, u32);
        __type(value, struct counter);
        __uint(map_flags, BPF_F_NO_PREALLOC);
 } counters SEC(".maps");
@@ -22,9 +23,9 @@ int handle__block_rq_complete(struct trace_event_raw_block_rq_complete *ctx)
        sector_t sector = ctx->sector;
        struct counter *counterp, zero = {};
        u32 nr_sector = ctx->nr_sector;
-       dev_t dev = ctx->dev;
+       u32 dev = ctx->dev;
 
-       if (targ_dev != -1 && targ_dev != dev)
+       if (filter_dev && targ_dev != dev)
                return 0;
 
        counterp = bpf_map_lookup_or_try_init(&counters, &dev, &zero);
index e983ce1382bbcfd0c1475c9048d76da573b20dc4..92324702611ab5b758d8527d5eaa00d531844e8b 100644 (file)
@@ -194,6 +194,7 @@ int main(int argc, char **argv)
                        fprintf(stderr, "invaild partition name: not exist\n");
                        goto cleanup;
                }
+               obj->rodata->filter_dev = true;
                obj->rodata->targ_dev = partition->dev;
        }
 
index 3fb7403f9d727d9d88aea0a6f70b66e052d62287..54226e43b99dfe908cf0e24d42a769171a73c58f 100644 (file)
@@ -10,7 +10,8 @@
 
 const volatile bool filter_cg = false;
 const volatile bool targ_queued = false;
-const volatile dev_t targ_dev = -1;
+const volatile bool filter_dev = false;
+const volatile __u32 targ_dev = 0;
 
 extern __u32 LINUX_KERNEL_VERSION __kconfig;
 
@@ -37,7 +38,7 @@ struct {
 struct stage {
        u64 insert;
        u64 issue;
-       dev_t dev;
+       __u32 dev;
 };
 
 struct {
@@ -95,7 +96,7 @@ int trace_rq_start(struct request *rq, bool insert)
 
                stage.dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
                                BPF_CORE_READ(disk, first_minor)) : 0;
-               if (targ_dev != -1 && targ_dev != stage.dev)
+               if (filter_dev && targ_dev != stage.dev)
                        return 0;
                stagep = &stage;
        }
index c76a2eb9808bf9e18335e4a1caed17d80ba5b65b..f0f665a6db53cfb3dbe413a35227983fc1fdfefb 100644 (file)
@@ -224,6 +224,8 @@ int main(int argc, char **argv)
                        fprintf(stderr, "invaild partition name: not exist\n");
                        goto cleanup;
                }
+               obj->rodata->filter_dev = true;
+               obj->rodata->targ_dev = partition->dev;
        }
        obj->rodata->targ_queued = env.queued;
        obj->rodata->filter_cg = env.cg;
index 69353bc4d45d2bab8e9369f5e7b21b9df78e2711..01993737cb363becebf04015f40a651ff178bbcf 100644 (file)
@@ -11,7 +11,8 @@
 #define MAX_ENTRIES    10240
 
 const volatile bool targ_ms = false;
-const volatile dev_t targ_dev = -1;
+const volatile bool filter_dev = false;
+const volatile __u32 targ_dev = -1;
 
 struct internal_rqinfo {
        u64 start_ts;
@@ -41,11 +42,11 @@ int trace_start(void *ctx, struct request *rq, bool merge_bio)
 {
        struct internal_rqinfo *i_rqinfop = NULL, i_rqinfo = {};
        struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
-       dev_t dev;
+       u32 dev;
 
        dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
                        BPF_CORE_READ(disk, first_minor)) : 0;
-       if (targ_dev != -1 && targ_dev != dev)
+       if (filter_dev && targ_dev != dev)
                return 0;
 
        if (merge_bio)
index f99dc56d8b17a0cd1279e3ac3f6afbc2466f0aaf..260bc235eed6071749720e41d298dceaa55e1386 100644 (file)
@@ -167,6 +167,7 @@ int main(int argc, char **argv)
                        fprintf(stderr, "invaild partition name: not exist\n");
                        goto cleanup;
                }
+               obj->rodata->filter_dev = true;
                obj->rodata->targ_dev = partition->dev;
        }
 
index 7b4d3f9d74c9d10de65aa1a6e260566927c03d85..80672c9be8f11bedc8a8235c721016d1fd0a6ca2 100644 (file)
@@ -8,7 +8,8 @@
 #include "bits.bpf.h"
 
 const volatile char targ_comm[TASK_COMM_LEN] = {};
-const volatile dev_t targ_dev = -1;
+const volatile bool filter_dev = false;
+const volatile __u32 targ_dev = 0;
 
 extern __u32 LINUX_KERNEL_VERSION __kconfig;
 
@@ -39,9 +40,9 @@ static int trace_rq_issue(struct request *rq)
        struct hist *histp;
        u64 slot;
 
-       if (targ_dev != -1) {
+       if (filter_dev) {
                struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
-               dev_t dev;
+               u32 dev;
 
                dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
                                BPF_CORE_READ(disk, first_minor)) : 0;
index c39541b38eace028f87e4cc9c9f4ea91a5c41a32..4c3715081e39de18d5c616347c6c6ea58d0841d6 100644 (file)
@@ -191,6 +191,7 @@ int main(int argc, char **argv)
                        fprintf(stderr, "invaild partition name: not exist\n");
                        goto cleanup;
                }
+               obj->rodata->filter_dev = true;
                obj->rodata->targ_dev = partition->dev;
        }