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