Skip to content

Commit

Permalink
libbpf-tools: Fix dropped request->rq_disk for kernel 5.17+
Browse files Browse the repository at this point in the history
  • Loading branch information
xingfeng2510 authored and yonghong-song committed Apr 27, 2022
1 parent 28f2af9 commit 7231ddb
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 5 deletions.
20 changes: 18 additions & 2 deletions libbpf-tools/biolatency.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ const volatile bool targ_ms = false;
const volatile bool filter_dev = false;
const volatile __u32 targ_dev = 0;

struct request_queue___x {
struct gendisk *disk;
} __attribute__((preserve_access_index));

struct {
__uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
__type(key, u32);
Expand Down Expand Up @@ -53,9 +57,15 @@ int trace_rq_start(struct request *rq, int issue)
u64 ts = bpf_ktime_get_ns();

if (filter_dev) {
struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
struct gendisk *disk;
u32 dev;

if (bpf_core_field_exists(q->disk))
disk = BPF_CORE_READ(q, disk);
else
disk = BPF_CORE_READ(rq, rq_disk);

dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
BPF_CORE_READ(disk, first_minor)) : 0;
if (targ_dev != dev)
Expand Down Expand Up @@ -119,7 +129,13 @@ int BPF_PROG(block_rq_complete, struct request *rq, int error,
goto cleanup;

if (targ_per_disk) {
struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
struct gendisk *disk;

if (bpf_core_field_exists(q->disk))
disk = BPF_CORE_READ(q, disk);
else
disk = BPF_CORE_READ(rq, rq_disk);

hkey.dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
BPF_CORE_READ(disk, first_minor)) : 0;
Expand Down
12 changes: 11 additions & 1 deletion libbpf-tools/biosnoop.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ const volatile __u32 targ_dev = 0;

extern __u32 LINUX_KERNEL_VERSION __kconfig;

struct request_queue___x {
struct gendisk *disk;
} __attribute__((preserve_access_index));

struct {
__uint(type, BPF_MAP_TYPE_CGROUP_ARRAY);
__type(key, u32);
Expand Down Expand Up @@ -92,7 +96,13 @@ int trace_rq_start(struct request *rq, bool insert)

stagep = bpf_map_lookup_elem(&start, &rq);
if (!stagep) {
struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
struct gendisk *disk;

if (bpf_core_field_exists(q->disk))
disk = BPF_CORE_READ(q, disk);
else
disk = BPF_CORE_READ(rq, rq_disk);

stage.dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
BPF_CORE_READ(disk, first_minor)) : 0;
Expand Down
12 changes: 11 additions & 1 deletion libbpf-tools/biostacks.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ const volatile bool targ_ms = false;
const volatile bool filter_dev = false;
const volatile __u32 targ_dev = -1;

struct request_queue___x {
struct gendisk *disk;
} __attribute__((preserve_access_index));

struct internal_rqinfo {
u64 start_ts;
struct rqinfo rqinfo;
Expand Down Expand Up @@ -41,9 +45,15 @@ static __always_inline
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);
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
struct gendisk *disk;
u32 dev;

if (bpf_core_field_exists(q->disk))
disk = BPF_CORE_READ(q, disk);
else
disk = BPF_CORE_READ(rq, rq_disk);

dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
BPF_CORE_READ(disk, first_minor)) : 0;
if (filter_dev && targ_dev != dev)
Expand Down
12 changes: 11 additions & 1 deletion libbpf-tools/bitesize.bpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@ const volatile __u32 targ_dev = 0;

extern __u32 LINUX_KERNEL_VERSION __kconfig;

struct request_queue___x {
struct gendisk *disk;
} __attribute__((preserve_access_index));

struct {
__uint(type, BPF_MAP_TYPE_HASH);
__uint(max_entries, 10240);
Expand Down Expand Up @@ -41,9 +45,15 @@ static int trace_rq_issue(struct request *rq)
u64 slot;

if (filter_dev) {
struct gendisk *disk = BPF_CORE_READ(rq, rq_disk);
struct request_queue___x *q = (void *)BPF_CORE_READ(rq, q);
struct gendisk *disk;
u32 dev;

if (bpf_core_field_exists(q->disk))
disk = BPF_CORE_READ(q, disk);
else
disk = BPF_CORE_READ(rq, rq_disk);

dev = disk ? MKDEV(BPF_CORE_READ(disk, major),
BPF_CORE_READ(disk, first_minor)) : 0;
if (targ_dev != dev)
Expand Down

0 comments on commit 7231ddb

Please sign in to comment.