master
h 91 lines 2.13 KB
Raw
1 // SPDX-License-Identifier: GPL-3.0-or-later
2
3 #ifndef NETDATA_EBPF_DISK_H
4 #define NETDATA_EBPF_DISK_H 1
5
6 // Module name & description
7 #define NETDATA_EBPF_MODULE_NAME_DISK "disk"
8 #define NETDATA_EBPF_DISK_MODULE_DESC "Monitor disk latency independent of filesystem."
9
10 #include "libnetdata/avl/avl.h"
11 #include "libnetdata/libnetdata.h"
12 #include "libbpf_api/ebpf.h"
13
14 #define NETDATA_EBPF_PROC_PARTITIONS "/proc/partitions"
15
16 // Process configuration name
17 #define NETDATA_DISK_CONFIG_FILE "disk.conf"
18
19 // Decode function extracted from: https://elixir.bootlin.com/linux/v5.10.8/source/include/linux/kdev_t.h#L7
20 #define MINORBITS 20
21 #define MKDEV(ma, mi) (((ma) << MINORBITS) | (mi))
22
23 enum netdata_latency_disks_flags {
24 NETDATA_DISK_NONE = 0,
25 NETDATA_DISK_ADDED_TO_PLOT_LIST = 1,
26 NETDATA_DISK_CHART_CREATED = 2,
27 NETDATA_DISK_IS_HERE = 4
28 };
29
30 /*
31 * The definition (DISK_NAME_LEN) has been a stable value since Kernel 3.0,
32 * I decided to bring it as internal definition, to avoid include linux/genhd.h.
33 */
34 #define NETDATA_DISK_NAME_LEN 32
35
36 typedef struct netdata_ebpf_disks {
37 uint64_t start;
38 uint64_t end;
39
40 avl_t avl;
41 uint32_t dev;
42 uint32_t major;
43 uint32_t minor;
44 uint32_t bootsector_key;
45 uint32_t flags;
46
47 time_t last_update;
48
49 char family[NETDATA_DISK_NAME_LEN + 1];
50
51 struct netdata_ebpf_disks *next;
52
53 netdata_ebpf_histogram_t histogram;
54 } netdata_ebpf_disks_t;
55
56 static inline void ebpf_disks_init(netdata_ebpf_disks_t *d)
57 {
58 d->start = 0;
59 d->end = 0;
60 d->dev = 0;
61 d->major = 0;
62 d->minor = 0;
63 d->bootsector_key = 0;
64 d->flags = 0;
65 d->last_update = 0;
66 d->family[0] = '\0';
67 d->next = NULL;
68 memset(&d->histogram, 0, sizeof(d->histogram));
69 }
70
71 static inline void ebpf_disks_cleanup(netdata_ebpf_disks_t *d)
72 {
73 freez(d->histogram.name);
74 freez(d->histogram.title);
75 freez(d->histogram.ctx);
76 }
77
78 enum ebpf_disk_tables { NETDATA_DISK_IO };
79
80 typedef struct block_key {
81 uint32_t bin;
82 uint32_t dev;
83 } block_key_t;
84
85 #define NETDATA_EBPF_DISK_LATENCY_CONTEXT "disk.latency_io"
86
87 extern struct config disk_config;
88
89 void ebpf_disk_thread(void *ptr);
90
91 #endif /* NETDATA_EBPF_DISK_H */