Skip to content

Commit 7b1803c

Browse files
committed
libbpf-tools: Make tools independent of vmlinux.h
Kernel structs vary in different versions. Let's define all relying structs in core_fixes.bpf.h so that we can update vmlinux.h independently. This is a preparaton for the RISC-V support. Signed-off-by: Hengqi Chen <[email protected]>
1 parent b5c78af commit 7b1803c

File tree

6 files changed

+54
-54
lines changed

6 files changed

+54
-54
lines changed

libbpf-tools/biolatency.bpf.c

Lines changed: 3 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <bpf/bpf_tracing.h>
77
#include "biolatency.h"
88
#include "bits.bpf.h"
9+
#include "core_fixes.bpf.h"
910

1011
#define MAX_ENTRIES 10240
1112

@@ -19,10 +20,6 @@ const volatile bool targ_ms = false;
1920
const volatile bool filter_dev = false;
2021
const volatile __u32 targ_dev = 0;
2122

22-
struct request_queue___x {
23-
struct gendisk *disk;
24-
} __attribute__((preserve_access_index));
25-
2623
struct {
2724
__uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
2825
__type(key, u32);
@@ -55,15 +52,9 @@ int trace_rq_start(struct request *rq, int issue)
5552
u64 ts = bpf_ktime_get_ns();
5653

5754
if (filter_dev) {
58-
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
59-
struct gendisk *disk;
55+
struct gendisk *disk = get_disk(rq);
6056
u32 dev;
6157

62-
if (bpf_core_field_exists(q->disk))
63-
disk = BPF_CORE_READ(q, disk);
64-
else
65-
disk = BPF_CORE_READ(rq, rq_disk);
66-
6758
dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
6859
BPF_CORE_READ(disk, first_minor)) : 0;
6960
if (targ_dev != dev)
@@ -127,13 +118,7 @@ int BPF_PROG(block_rq_complete, struct request *rq, int error,
127118
goto cleanup;
128119

129120
if (targ_per_disk) {
130-
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
131-
struct gendisk *disk;
132-
133-
if (bpf_core_field_exists(q->disk))
134-
disk = BPF_CORE_READ(q, disk);
135-
else
136-
disk = BPF_CORE_READ(rq, rq_disk);
121+
struct gendisk *disk = get_disk(rq);
137122

138123
hkey.dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
139124
BPF_CORE_READ(disk, first_minor)) : 0;

libbpf-tools/biopattern.bpf.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ int handle__block_rq_complete(void *args)
3131
nr_sector = BPF_CORE_READ(ctx, nr_sector);
3232
dev = BPF_CORE_READ(ctx, dev);
3333
} else {
34-
struct trace_event_raw_block_rq_complete *ctx = args;
34+
struct trace_event_raw_block_rq_complete___x *ctx = args;
3535
sector = BPF_CORE_READ(ctx, sector);
3636
nr_sector = BPF_CORE_READ(ctx, nr_sector);
3737
dev = BPF_CORE_READ(ctx, dev);

libbpf-tools/biosnoop.bpf.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include <bpf/bpf_core_read.h>
66
#include <bpf/bpf_tracing.h>
77
#include "biosnoop.h"
8+
#include "core_fixes.bpf.h"
89

910
#define MAX_ENTRIES 10240
1011

@@ -15,10 +16,6 @@ const volatile __u32 targ_dev = 0;
1516

1617
extern __u32 LINUX_KERNEL_VERSION __kconfig;
1718

18-
struct request_queue___x {
19-
struct gendisk *disk;
20-
} __attribute__((preserve_access_index));
21-
2219
struct {
2320
__uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
2421
__type(key, u32);
@@ -95,13 +92,7 @@ int trace_rq_start(struct request *rq, bool insert)
9592

9693
stagep = bpf_map_lookup_elem(&start, &rq);
9794
if (!stagep) {
98-
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
99-
struct gendisk *disk;
100-
101-
if (bpf_core_field_exists(q->disk))
102-
disk = BPF_CORE_READ(q, disk);
103-
else
104-
disk = BPF_CORE_READ(rq, rq_disk);
95+
struct gendisk *disk = get_disk(rq);
10596

10697
stage.dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
10798
BPF_CORE_READ(disk, first_minor)) : 0;

libbpf-tools/biostacks.bpf.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@
77
#include "biostacks.h"
88
#include "bits.bpf.h"
99
#include "maps.bpf.h"
10+
#include "core_fixes.bpf.h"
1011

1112
#define MAX_ENTRIES 10240
1213

1314
const volatile bool targ_ms = false;
1415
const volatile bool filter_dev = false;
1516
const volatile __u32 targ_dev = -1;
1617

17-
struct request_queue___x {
18-
struct gendisk *disk;
19-
} __attribute__((preserve_access_index));
20-
2118
struct internal_rqinfo {
2219
u64 start_ts;
2320
struct rqinfo rqinfo;
@@ -43,15 +40,9 @@ static __always_inline
4340
int trace_start(void *ctx, struct request *rq, bool merge_bio)
4441
{
4542
struct internal_rqinfo *i_rqinfop = NULL, i_rqinfo = {};
46-
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
47-
struct gendisk *disk;
43+
struct gendisk *disk = get_disk(rq);
4844
u32 dev;
4945

50-
if (bpf_core_field_exists(q->disk))
51-
disk = BPF_CORE_READ(q, disk);
52-
else
53-
disk = BPF_CORE_READ(rq, rq_disk);
54-
5546
dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
5647
BPF_CORE_READ(disk, first_minor)) : 0;
5748
if (filter_dev && targ_dev != dev)

libbpf-tools/bitesize.bpf.c

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,14 @@
66
#include <bpf/bpf_core_read.h>
77
#include "bitesize.h"
88
#include "bits.bpf.h"
9+
#include "core_fixes.bpf.h"
910

1011
const volatile char targ_comm[TASK_COMM_LEN] = {};
1112
const volatile bool filter_dev = false;
1213
const volatile __u32 targ_dev = 0;
1314

1415
extern __u32 LINUX_KERNEL_VERSION __kconfig;
1516

16-
struct request_queue___x {
17-
struct gendisk *disk;
18-
} __attribute__((preserve_access_index));
19-
2017
struct {
2118
__uint(type, BPF_MAP_TYPE_HASH);
2219
__uint(max_entries, 10240);
@@ -44,15 +41,9 @@ static int trace_rq_issue(struct request *rq)
4441
u64 slot;
4542

4643
if (filter_dev) {
47-
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
48-
struct gendisk *disk;
44+
struct gendisk *disk = get_disk(rq);
4945
u32 dev;
5046

51-
if (bpf_core_field_exists(q->disk))
52-
disk = BPF_CORE_READ(q, disk);
53-
else
54-
disk = BPF_CORE_READ(rq, rq_disk);
55-
5647
dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
5748
BPF_CORE_READ(disk, first_minor)) : 0;
5849
if (targ_dev != dev)

libbpf-tools/core_fixes.bpf.h

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@
1313
* see:
1414
* https://github.com/torvalds/linux/commit/2f064a59a1
1515
*/
16+
struct task_struct___o {
17+
volatile long int state;
18+
} __attribute__((preserve_access_index));
19+
1620
struct task_struct___x {
1721
unsigned int __state;
1822
} __attribute__((preserve_access_index));
@@ -23,7 +27,7 @@ static __always_inline __s64 get_task_state(void *task)
2327

2428
if (bpf_core_field_exists(t->__state))
2529
return BPF_CORE_READ(t, __state);
26-
return BPF_CORE_READ((struct task_struct *)task, state);
30+
return BPF_CORE_READ((struct task_struct___o *)task, state);
2731
}
2832

2933
/**
@@ -32,6 +36,10 @@ static __always_inline __s64 get_task_state(void *task)
3236
* see:
3337
* https://github.com/torvalds/linux/commit/309dca309fc3
3438
*/
39+
struct bio___o {
40+
struct gendisk *bi_disk;
41+
} __attribute__((preserve_access_index));
42+
3543
struct bio___x {
3644
struct block_device *bi_bdev;
3745
} __attribute__((preserve_access_index));
@@ -42,7 +50,7 @@ static __always_inline struct gendisk *get_gendisk(void *bio)
4250

4351
if (bpf_core_field_exists(b->bi_bdev))
4452
return BPF_CORE_READ(b, bi_bdev, bd_disk);
45-
return BPF_CORE_READ((struct bio *)bio, bi_disk);
53+
return BPF_CORE_READ((struct bio___o *)bio, bi_disk);
4654
}
4755

4856
/**
@@ -54,6 +62,12 @@ static __always_inline struct gendisk *get_gendisk(void *bio)
5462
* see:
5563
* https://github.com/torvalds/linux/commit/d5869fdc189f
5664
*/
65+
struct trace_event_raw_block_rq_complete___x {
66+
dev_t dev;
67+
sector_t sector;
68+
unsigned int nr_sector;
69+
} __attribute__((preserve_access_index));
70+
5771
struct trace_event_raw_block_rq_completion___x {
5872
dev_t dev;
5973
sector_t sector;
@@ -67,4 +81,32 @@ static __always_inline bool has_block_rq_completion()
6781
return false;
6882
}
6983

84+
/**
85+
* commit d152c682f03c ("block: add an explicit ->disk backpointer to the
86+
* request_queue") and commit f3fa33acca9f ("block: remove the ->rq_disk
87+
* field in struct request") make some changes to `struct request` and
88+
* `struct request_queue`. Now, to get the `struct gendisk *` field in a CO-RE
89+
* way, we need both `struct request` and `struct request_queue`.
90+
* see:
91+
* https://github.com/torvalds/linux/commit/d152c682f03c
92+
* https://github.com/torvalds/linux/commit/f3fa33acca9f
93+
*/
94+
struct request_queue___x {
95+
struct gendisk *disk;
96+
} __attribute__((preserve_access_index));
97+
98+
struct request___x {
99+
struct request_queue___x *q;
100+
struct gendisk *rq_disk;
101+
} __attribute__((preserve_access_index));
102+
103+
static __always_inline struct gendisk *get_disk(void *request)
104+
{
105+
struct request___x *r = request;
106+
107+
if (bpf_core_field_exists(r->rq_disk))
108+
return BPF_CORE_READ(r, rq_disk);
109+
return BPF_CORE_READ(r, q, disk);
110+
}
111+
70112
#endif /* __CORE_FIXES_BPF_H */

0 commit comments

Comments
 (0)