Fix SWAP pages (#17295)

This commit is contained in:
thiagoftsm 2024-04-01 21:18:35 +00:00 committed by GitHub
parent b7656b4545
commit 22705e27c5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 105 additions and 17 deletions

View File

@ -1 +1 @@
208e843a1c981071bc84eeb2dba8d64947701e0624abf6669daac3f73feacf40 netdata-ebpf-co-re-glibc-v1.3.1.tar.xz
c794d26a8aa505a95cf32c088deed394e4683ea43a1195fcb27c62f472c8d2fd netdata-ebpf-co-re-glibc-v1.3.4.tar.xz

View File

@ -1 +1 @@
v1.3.1
v1.3.4

View File

@ -1,3 +1,3 @@
3beba8ddcc0394324e1444dc239f87ba82f68f88b4446b37598e75584f0b8e5f ./netdata-kernel-collector-glibc-v1.3.1.tar.xz
945c511ad69eecf58d74b6d35b886cc9867e939bd1eca4e1cbe3f01181a3f036 ./netdata-kernel-collector-musl-v1.3.1.tar.xz
5e0c7a230bcb54cbc51cb86518d2199fa6fb2344a02a88a467387dec537aa45a ./netdata-kernel-collector-static-v1.3.1.tar.xz
7d8e433b0362d0a2f0b94c8a15ca9bd04897c77c4048c8d286d078be051ca300 ./netdata-kernel-collector-glibc-v1.3.4.tar.xz
fcd6949a88a162796e79db3ef9edcabda13e11d1127ca7c70157fe64f2a46d65 ./netdata-kernel-collector-musl-v1.3.4.tar.xz
a35361a8c97cd300ae9cc51a0b1567ab47977dcb4aa5c4f50551eeeb83996f06 ./netdata-kernel-collector-static-v1.3.4.tar.xz

View File

@ -1 +1 @@
v1.3.1
v1.3.4

View File

@ -136,7 +136,7 @@ ebpf_module_t ebpf_modules[] = {
.maps = NULL,
.pid_map_size = ND_EBPF_DEFAULT_PID_SIZE, .names = NULL, .cfg = &swap_config,
.config_file = NETDATA_DIRECTORY_SWAP_CONFIG_FILE,
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_14,
.kernels = NETDATA_V3_10 | NETDATA_V4_14 | NETDATA_V4_16 | NETDATA_V4_18 | NETDATA_V5_4 | NETDATA_V5_14 | NETDATA_V6_8,
.load = EBPF_LOAD_LEGACY, .targets = swap_targets, .probe_links = NULL, .objects = NULL,
.thread = NULL, .maps_per_core = CONFIG_BOOLEAN_YES, .lifetime = EBPF_DEFAULT_LIFETIME, .running_time = 0},
{ .info = {.thread_name = "vfs",

View File

@ -48,10 +48,13 @@ static ebpf_local_maps_t swap_maps[] = {{.name = "tbl_pid_swap", .internal_input
#endif
}};
netdata_ebpf_targets_t swap_targets[] = { {.name = "swap_readpage", .mode = EBPF_LOAD_TRAMPOLINE},
netdata_ebpf_targets_t swap_targets[] = { {.name = NULL, .mode = EBPF_LOAD_TRAMPOLINE},
{.name = "swap_writepage", .mode = EBPF_LOAD_TRAMPOLINE},
{.name = NULL, .mode = EBPF_LOAD_TRAMPOLINE}};
static char *swap_read[] ={ "swap_readpage", "swap_read_folio", NULL };
struct netdata_static_thread ebpf_read_swap = {
.name = "EBPF_READ_SWAP",
.config_section = NULL,
@ -74,9 +77,27 @@ struct netdata_static_thread ebpf_read_swap = {
static void ebpf_swap_disable_probe(struct swap_bpf *obj)
{
bpf_program__set_autoload(obj->progs.netdata_swap_readpage_probe, false);
bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_probe, false);
bpf_program__set_autoload(obj->progs.netdata_swap_writepage_probe, false);
}
/**
* Disable specific probe
*
* Disable specific probes according to available functions
*
* @param obj is the main structure for bpf objects
*/
static inline void ebpf_swap_disable_specific_probe(struct swap_bpf *obj)
{
if (!strcmp(swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name,
swap_read[NETDATA_KEY_SWAP_READPAGE_CALL])) {
bpf_program__set_autoload(obj->progs.netdata_swap_readpage_probe, false);
} else {
bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_probe, false);
}
}
/*
* Disable trampoline
*
@ -87,9 +108,27 @@ static void ebpf_swap_disable_probe(struct swap_bpf *obj)
static void ebpf_swap_disable_trampoline(struct swap_bpf *obj)
{
bpf_program__set_autoload(obj->progs.netdata_swap_readpage_fentry, false);
bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_fentry, false);
bpf_program__set_autoload(obj->progs.netdata_swap_writepage_fentry, false);
}
/**
* Disable specific trampoline
*
* Disable specific trampolines according to available functions
*
* @param obj is the main structure for bpf objects
*/
static inline void ebpf_swap_disable_specific_trampoline(struct swap_bpf *obj)
{
if (!strcmp(swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name,
swap_read[NETDATA_KEY_SWAP_READPAGE_CALL])) {
bpf_program__set_autoload(obj->progs.netdata_swap_readpage_fentry, false);
} else {
bpf_program__set_autoload(obj->progs.netdata_swap_read_folio_fentry, false);
}
}
/**
* Set trampoline target
*
@ -117,10 +156,19 @@ static void ebpf_swap_set_trampoline_target(struct swap_bpf *obj)
*/
static int ebpf_swap_attach_kprobe(struct swap_bpf *obj)
{
obj->links.netdata_swap_readpage_probe = bpf_program__attach_kprobe(obj->progs.netdata_swap_readpage_probe,
false,
swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name);
int ret = libbpf_get_error(obj->links.netdata_swap_readpage_probe);
int ret;
if (!strcmp(swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name,
swap_read[NETDATA_KEY_SWAP_READPAGE_CALL])) {
obj->links.netdata_swap_readpage_probe = bpf_program__attach_kprobe(obj->progs.netdata_swap_readpage_probe,
false,
swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name);
ret = libbpf_get_error(obj->links.netdata_swap_readpage_probe);
} else {
obj->links.netdata_swap_read_folio_probe = bpf_program__attach_kprobe(obj->progs.netdata_swap_read_folio_probe,
false,
swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name);
ret = libbpf_get_error(obj->links.netdata_swap_read_folio_probe);
}
if (ret)
return -1;
@ -183,10 +231,12 @@ static inline int ebpf_swap_load_and_attach(struct swap_bpf *obj, ebpf_module_t
if (test == EBPF_LOAD_TRAMPOLINE) {
ebpf_swap_disable_probe(obj);
ebpf_swap_disable_specific_trampoline(obj);
ebpf_swap_set_trampoline_target(obj);
} else {
ebpf_swap_disable_trampoline(obj);
ebpf_swap_disable_specific_probe(obj);
}
ebpf_swap_adjust_map(obj, em);
@ -1042,6 +1092,34 @@ static int ebpf_swap_load_bpf(ebpf_module_t *em)
return ret;
}
/**
* Update Internal value
*
* Update values used during runtime.
*
* @return It returns 0 when one of the functions is present and -1 otherwise.
*/
static int ebpf_swap_set_internal_value()
{
ebpf_addresses_t address = {.function = NULL, .hash = 0, .addr = 0};
int i;
for (i = 0; swap_read[i] ; i++) {
address.function = swap_read[i];
ebpf_load_addresses(&address, -1);
if (address.addr)
break;
}
if (!address.addr) {
netdata_log_error("%s swap.", NETDATA_EBPF_DEFAULT_FNT_NOT_FOUND);
return -1;
}
swap_targets[NETDATA_KEY_SWAP_READPAGE_CALL].name = address.function;
return 0;
}
/**
* SWAP thread
*
@ -1060,6 +1138,10 @@ void *ebpf_swap_thread(void *ptr)
ebpf_update_pid_table(&swap_maps[NETDATA_PID_SWAP_TABLE], em);
if (ebpf_swap_set_internal_value()) {
goto endswap;
}
#ifdef LIBBPF_MAJOR_VERSION
ebpf_adjust_thread_load(em, default_btf);
#endif

View File

@ -344,7 +344,7 @@ static char *ebpf_select_kernel_name(uint32_t selector)
static char *kernel_names[] = { NETDATA_IDX_STR_V3_10, NETDATA_IDX_STR_V4_14, NETDATA_IDX_STR_V4_16,
NETDATA_IDX_STR_V4_18, NETDATA_IDX_STR_V5_4, NETDATA_IDX_STR_V5_10,
NETDATA_IDX_STR_V5_11, NETDATA_IDX_STR_V5_14, NETDATA_IDX_STR_V5_15,
NETDATA_IDX_STR_V5_16
NETDATA_IDX_STR_V5_16, NETDATA_IDX_STR_V6_8
};
return kernel_names[selector];
@ -370,7 +370,9 @@ static int ebpf_select_max_index(int is_rhf, uint32_t kver)
else if (kver >= NETDATA_EBPF_KERNEL_4_11)
return NETDATA_IDX_V4_18;
} else { // Kernels from kernel.org
if (kver >= NETDATA_EBPF_KERNEL_5_16)
if (kver >= NETDATA_EBPF_KERNEL_6_8)
return NETDATA_IDX_V6_8;
else if (kver >= NETDATA_EBPF_KERNEL_5_16)
return NETDATA_IDX_V5_16;
else if (kver >= NETDATA_EBPF_KERNEL_5_15)
return NETDATA_IDX_V5_15;

View File

@ -94,7 +94,8 @@ enum netdata_ebpf_kernel_versions {
NETDATA_EBPF_KERNEL_5_11 = 330496, // 330240 = 5 * 65536 + 11 * 256
NETDATA_EBPF_KERNEL_5_14 = 331264, // 331264 = 5 * 65536 + 14 * 256
NETDATA_EBPF_KERNEL_5_15 = 331520, // 331520 = 5 * 65536 + 15 * 256
NETDATA_EBPF_KERNEL_5_16 = 331776 // 331776 = 5 * 65536 + 16 * 256
NETDATA_EBPF_KERNEL_5_16 = 331776, // 331776 = 5 * 65536 + 16 * 256
NETDATA_EBPF_KERNEL_6_8 = 395264 // 395264 = 5 * 65536 + 8 * 256
};
enum netdata_kernel_flag {
@ -107,7 +108,8 @@ enum netdata_kernel_flag {
NETDATA_V5_11 = 1 << 6,
NETDATA_V5_14 = 1 << 7,
NETDATA_V5_15 = 1 << 8,
NETDATA_V5_16 = 1 << 9
NETDATA_V5_16 = 1 << 9,
NETDATA_V6_8 = 1 << 10
};
enum netdata_kernel_idx {
@ -120,7 +122,8 @@ enum netdata_kernel_idx {
NETDATA_IDX_V5_11,
NETDATA_IDX_V5_14,
NETDATA_IDX_V5_15,
NETDATA_IDX_V5_16
NETDATA_IDX_V5_16,
NETDATA_IDX_V6_8
};
#define NETDATA_IDX_STR_V3_10 "3.10"
@ -133,6 +136,7 @@ enum netdata_kernel_idx {
#define NETDATA_IDX_STR_V5_14 "5.14"
#define NETDATA_IDX_STR_V5_15 "5.15"
#define NETDATA_IDX_STR_V5_16 "5.16"
#define NETDATA_IDX_STR_V6_8 "6.8"
/**
* Minimum value has relationship with libbpf support.