@cryptotaxi247 / netdata-1 / commits / 22705e27c

Fix SWAP pages (#17295)

thiagoftsm committed Apr 1, 2024 at 21:18 UTC 22705e27c5ca6daabd1a3ac31094d9c8d8163e1d
8 files changed +105 -17
packaging/ebpf-co-re.checksums
+1 -1
@@ -1 +1 @@
1 -208e843a1c981071bc84eeb2dba8d64947701e0624abf6669daac3f73feacf40 netdata-ebpf-co-re-glibc-v1.3.1.tar.xz
1 +c794d26a8aa505a95cf32c088deed394e4683ea43a1195fcb27c62f472c8d2fd netdata-ebpf-co-re-glibc-v1.3.4.tar.xz
packaging/ebpf-co-re.version
+1 -1
@@ -1 +1 @@
1 -v1.3.1
1 +v1.3.4
packaging/ebpf.checksums
+3 -3
@@ -1,3 +1,3 @@
1 -3beba8ddcc0394324e1444dc239f87ba82f68f88b4446b37598e75584f0b8e5f ./netdata-kernel-collector-glibc-v1.3.1.tar.xz
2 -945c511ad69eecf58d74b6d35b886cc9867e939bd1eca4e1cbe3f01181a3f036 ./netdata-kernel-collector-musl-v1.3.1.tar.xz
3 -5e0c7a230bcb54cbc51cb86518d2199fa6fb2344a02a88a467387dec537aa45a ./netdata-kernel-collector-static-v1.3.1.tar.xz
1 +7d8e433b0362d0a2f0b94c8a15ca9bd04897c77c4048c8d286d078be051ca300 ./netdata-kernel-collector-glibc-v1.3.4.tar.xz
2 +fcd6949a88a162796e79db3ef9edcabda13e11d1127ca7c70157fe64f2a46d65 ./netdata-kernel-collector-musl-v1.3.4.tar.xz
3 +a35361a8c97cd300ae9cc51a0b1567ab47977dcb4aa5c4f50551eeeb83996f06 ./netdata-kernel-collector-static-v1.3.4.tar.xz
packaging/ebpf.version
+1 -1
@@ -1 +1 @@
1 -v1.3.1
1 +v1.3.4
src/collectors/ebpf.plugin/ebpf.c
+1 -1
@@ -136,7 +136,7 @@ ebpf_module_t ebpf_modules[] = {
136 .maps = NULL,
137 .pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &swap_config,
138 .config_file = NETDATA_DIRECTORY_SWAP_CONFIG_FILE,
139 - .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_14,
139 + .kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_14 | NETDATA_V6_8,
140 .load = EBPF_LOAD_LEGACY, .targets = swap_targets, .probe_links = NULL, .objects = NULL,
141 .thread = NULL, .maps_per_core = CONFIG_BOOLEAN_YES, .lifetime = EBPF_DEFAULT_LIFETIME, .running_time = 0},
142 { .info = {.thread_name = "vfs",
src/collectors/ebpf.plugin/ebpf_swap.c
+87 -5
@@ -48,10 +48,13 @@ static ebpf_local_maps_t swap_maps[] = {{.name = "tbl_pid_swap", .internal_input
48 #endif
49 }};
50
51 -netdata_ebpf_targets_t swap_targets[] = { {.name = "swap_readpage", .mode = EBPF_LOAD_TRAMPOLINE},
51 +netdata_ebpf_targets_t swap_targets[] = { {.name = NULL, .mode = EBPF_LOAD_TRAMPOLINE},
52 {.name = "swap_writepage", .mode = EBPF_LOAD_TRAMPOLINE},
53 {.name = NULL, .mode = EBPF_LOAD_TRAMPOLINE}};
54
55 +static char *swap_read[] ={ "swap_readpage", "swap_read_folio", NULL };
56 +
57 +
58 struct netdata_static_thread ebpf_read_swap = {
59 .name = "EBPF_READ_SWAP",
60 .config_section = NULL,
@@ -74,9 +77,27 @@ struct netdata_static_thread ebpf_read_swap = {
77 static void ebpf_swap_disable_probe(struct swap_bpf *obj)
78 {
79 bpf_program__set_autoload(obj->progs.netdata_swap_readpage_probe, false);
80 + bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_probe, false);
81 bpf_program__set_autoload(obj->progs.netdata_swap_writepage_probe, false);
82 }
83
84 +/**
85 + * Disable specific probe
86 + *
87 + * Disable specific probes according to available functions
88 + *
89 + * @param obj is the main structure for bpf objects
90 + */
91 +static inline void ebpf_swap_disable_specific_probe(struct swap_bpf *obj)
92 +{
93 + if (!strcmp(swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name,
94 + swap_read[NETDATA_KEY_SWAP_READPAGE_CALL])) {
95 + bpf_program__set_autoload(obj->progs.netdata_swap_readpage_probe, false);
96 + } else {
97 + bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_probe, false);
98 + }
99 +}
100 +
101 /*
102 * Disable trampoline
103 *
@@ -87,9 +108,27 @@ static void ebpf_swap_disable_probe(struct swap_bpf *obj)
108 static void ebpf_swap_disable_trampoline(struct swap_bpf *obj)
109 {
110 bpf_program__set_autoload(obj->progs.netdata_swap_readpage_fentry, false);
111 + bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_fentry, false);
112 bpf_program__set_autoload(obj->progs.netdata_swap_writepage_fentry, false);
113 }
114
115 +/**
116 + * Disable specific trampoline
117 + *
118 + * Disable specific trampolines according to available functions
119 + *
120 + * @param obj is the main structure for bpf objects
121 + */
122 +static inline void ebpf_swap_disable_specific_trampoline(struct swap_bpf *obj)
123 +{
124 + if (!strcmp(swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name,
125 + swap_read[NETDATA_KEY_SWAP_READPAGE_CALL])) {
126 + bpf_program__set_autoload(obj->progs.netdata_swap_readpage_fentry, false);
127 + } else {
128 + bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_fentry, false);
129 + }
130 +}
131 +
132 /**
133 * Set trampoline target
134 *
@@ -117,10 +156,19 @@ static void ebpf_swap_set_trampoline_target(struct swap_bpf *obj)
156 */
157 static int ebpf_swap_attach_kprobe(struct swap_bpf *obj)
158 {
120 - obj->links.netdata_swap_readpage_probe = bpf_program__attach_kprobe(obj->progs.netdata_swap_readpage_probe,
121 - false,
122 - swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name);
123 - int ret = libbpf_get_error(obj->links.netdata_swap_readpage_probe);
159 + int ret;
160 + if (!strcmp(swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name,
161 + swap_read[NETDATA_KEY_SWAP_READPAGE_CALL])) {
162 + obj->links.netdata_swap_readpage_probe = bpf_program__attach_kprobe(obj->progs.netdata_swap_readpage_probe,
163 + false,
164 + swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name);
165 + ret = libbpf_get_error(obj->links.netdata_swap_readpage_probe);
166 + } else {
167 + obj->links.netdata_swap_read_folio_probe = bpf_program__attach_kprobe(obj->progs.netdata_swap_read_folio_probe,
168 + false,
169 + swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name);
170 + ret = libbpf_get_error(obj->links.netdata_swap_read_folio_probe);
171 + }
172 if (ret)
173 return -1;
174
@@ -183,10 +231,12 @@ static inline int ebpf_swap_load_and_attach(struct swap_bpf *obj, ebpf_module_t
231
232 if (test == EBPF_LOAD_TRAMPOLINE) {
233 ebpf_swap_disable_probe(obj);
234 + ebpf_swap_disable_specific_trampoline(obj);
235
236 ebpf_swap_set_trampoline_target(obj);
237 } else {
238 ebpf_swap_disable_trampoline(obj);
239 + ebpf_swap_disable_specific_probe(obj);
240 }
241
242 ebpf_swap_adjust_map(obj, em);
@@ -1042,6 +1092,34 @@ static int ebpf_swap_load_bpf(ebpf_module_t *em)
1092 return ret;
1093 }
1094
1095 +/**
1096 + * Update Internal value
1097 + *
1098 + * Update values used during runtime.
1099 + *
1100 + * @return It returns 0 when one of the functions is present and -1 otherwise.
1101 + */
1102 +static int ebpf_swap_set_internal_value()
1103 +{
1104 + ebpf_addresses_t address = {.function = NULL, .hash = 0, .addr = 0};
1105 + int i;
1106 + for (i = 0; swap_read[i] ; i++) {
1107 + address.function = swap_read[i];
1108 + ebpf_load_addresses(&address, -1);
1109 + if (address.addr)
1110 + break;
1111 + }
1112 +
1113 + if (!address.addr) {
1114 + netdata_log_error("%s swap.", NETDATA_EBPF_DEFAULT_FNT_NOT_FOUND);
1115 + return -1;
1116 + }
1117 +
1118 + swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name = address.function;
1119 +
1120 + return 0;
1121 +}
1122 +
1123 /**
1124 * SWAP thread
1125 *
@@ -1060,6 +1138,10 @@ void *ebpf_swap_thread(void *ptr)
1138
1139 ebpf_update_pid_table(&swap_maps[NETDATA_PID_SWAP_TABLE], em);
1140
1141 + if (ebpf_swap_set_internal_value()) {
1142 + goto endswap;
1143 + }
1144 +
1145 #ifdef LIBBPF_MAJOR_VERSION
1146 ebpf_adjust_thread_load(em, default_btf);
1147 #endif
src/libnetdata/ebpf/ebpf.c
+4 -2
@@ -344,7 +344,7 @@ static char *ebpf_select_kernel_name(uint32_t selector)
344 static char *kernel_names[] = { NETDATA_IDX_STR_V3_10, NETDATA_IDX_STR_V4_14, NETDATA_IDX_STR_V4_16,
345 NETDATA_IDX_STR_V4_18, NETDATA_IDX_STR_V5_4, NETDATA_IDX_STR_V5_10,
346 NETDATA_IDX_STR_V5_11, NETDATA_IDX_STR_V5_14, NETDATA_IDX_STR_V5_15,
347 - NETDATA_IDX_STR_V5_16
347 + NETDATA_IDX_STR_V5_16, NETDATA_IDX_STR_V6_8
348 };
349
350 return kernel_names[selector];
@@ -370,7 +370,9 @@ static int ebpf_select_max_index(int is_rhf, uint32_t kver)
370 else if (kver >= NETDATA_EBPF_KERNEL_4_11)
371 return NETDATA_IDX_V4_18;
372 } else { // Kernels from kernel.org
373 - if (kver >= NETDATA_EBPF_KERNEL_5_16)
373 + if (kver >= NETDATA_EBPF_KERNEL_6_8)
374 + return NETDATA_IDX_V6_8;
375 + else if (kver >= NETDATA_EBPF_KERNEL_5_16)
376 return NETDATA_IDX_V5_16;
377 else if (kver >= NETDATA_EBPF_KERNEL_5_15)
378 return NETDATA_IDX_V5_15;
src/libnetdata/ebpf/ebpf.h
+7 -3
@@ -94,7 +94,8 @@ enum netdata_ebpf_kernel_versions {
94 NETDATA_EBPF_KERNEL_5_11 = 330496, // 330240 = 5 * 65536 + 11 * 256
95 NETDATA_EBPF_KERNEL_5_14 = 331264, // 331264 = 5 * 65536 + 14 * 256
96 NETDATA_EBPF_KERNEL_5_15 = 331520, // 331520 = 5 * 65536 + 15 * 256
97 - NETDATA_EBPF_KERNEL_5_16 = 331776 // 331776 = 5 * 65536 + 16 * 256
97 + NETDATA_EBPF_KERNEL_5_16 = 331776, // 331776 = 5 * 65536 + 16 * 256
98 + NETDATA_EBPF_KERNEL_6_8 = 395264 // 395264 = 5 * 65536 + 8 * 256
99 };
100
101 enum netdata_kernel_flag {
@@ -107,7 +108,8 @@ enum netdata_kernel_flag {
108 NETDATA_V5_11 = 1 << 6,
109 NETDATA_V5_14 = 1 << 7,
110 NETDATA_V5_15 = 1 << 8,
110 - NETDATA_V5_16 = 1 << 9
111 + NETDATA_V5_16 = 1 << 9,
112 + NETDATA_V6_8 = 1 << 10
113 };
114
115 enum netdata_kernel_idx {
@@ -120,7 +122,8 @@ enum netdata_kernel_idx {
122 NETDATA_IDX_V5_11,
123 NETDATA_IDX_V5_14,
124 NETDATA_IDX_V5_15,
123 - NETDATA_IDX_V5_16
125 + NETDATA_IDX_V5_16,
126 + NETDATA_IDX_V6_8
127 };
128
129 #define NETDATA_IDX_STR_V3_10 "3.10"
@@ -133,6 +136,7 @@ enum netdata_kernel_idx {
136 #define NETDATA_IDX_STR_V5_14 "5.14"
137 #define NETDATA_IDX_STR_V5_15 "5.15"
138 #define NETDATA_IDX_STR_V5_16 "5.16"
139 +#define NETDATA_IDX_STR_V6_8 "6.8"
140
141 /**
142 * Minimum value has relationship with libbpf support.