1 /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2 /* Copyright (c) 2021~2022 Hengqi Chen */
3 #include <vmlinux.h>
4 #include <bpf/bpf_tracing.h>
5 #include <bpf/bpf_helpers.h>
6 #include <bpf/bpf_core_read.h>
7 #include "core_fixes.bpf.h"
8 #include "mdflush.h"
9
10 struct {
11 __uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
12 __type(key, __u32);
13 __type(value, __u32);
14 } events SEC(".maps");
15
16 SEC("fentry/md_flush_request")
BPF_PROG(md_flush_request,void * mddev,void * bio)17 int BPF_PROG(md_flush_request, void *mddev, void *bio)
18 {
19 __u64 pid = bpf_get_current_pid_tgid() >> 32;
20 struct event event = {};
21 struct gendisk *gendisk;
22
23 event.pid = pid;
24 gendisk = get_gendisk(bio);
25 BPF_CORE_READ_STR_INTO(event.disk, gendisk, disk_name);
26 bpf_get_current_comm(event.comm, sizeof(event.comm));
27 bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
28 return 0;
29 }
30
31 SEC("kprobe/md_flush_request")
BPF_KPROBE(kprobe_md_flush_request,void * mddev,void * bio)32 int BPF_KPROBE(kprobe_md_flush_request, void *mddev, void *bio)
33 {
34 __u64 pid = bpf_get_current_pid_tgid() >> 32;
35 struct event event = {};
36 struct gendisk *gendisk;
37
38 event.pid = pid;
39 gendisk = get_gendisk(bio);
40 BPF_CORE_READ_STR_INTO(event.disk, gendisk, disk_name);
41 bpf_get_current_comm(event.comm, sizeof(event.comm));
42 bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
43 return 0;
44 }
45
46 char LICENSE[] SEC("license") = "Dual BSD/GPL";
47