summaryrefslogtreecommitdiffstats
path: root/libnetdata/ebpf
diff options
context:
space:
mode:
authorthiagoftsm <thiagoftsm@gmail.com>2022-03-29 18:21:42 +0000
committerGitHub <noreply@github.com>2022-03-29 18:21:42 +0000
commit68684b59f704cdd1b4190f4be8b3bce95d60da75 (patch)
tree6c9cc03a116eac1ccd388136300c4a5b5f7ee4cf /libnetdata/ebpf
parent0746b58e7abe6a63c8c07c626eef3cb8c0217a43 (diff)
Socket connections (eBPF) and bug fix (#12532)
Diffstat (limited to 'libnetdata/ebpf')
-rw-r--r--libnetdata/ebpf/ebpf.c90
-rw-r--r--libnetdata/ebpf/ebpf.h4
2 files changed, 75 insertions, 19 deletions
diff --git a/libnetdata/ebpf/ebpf.c b/libnetdata/ebpf/ebpf.c
index e425827ccb..dde6d57fce 100644
--- a/libnetdata/ebpf/ebpf.c
+++ b/libnetdata/ebpf/ebpf.c
@@ -453,14 +453,53 @@ void ebpf_update_pid_table(ebpf_local_maps_t *pid, ebpf_module_t *em)
pid->user_input = em->pid_map_size;
}
-void ebpf_update_map_sizes(struct bpf_object *program, ebpf_module_t *em)
+/**
+ * Update map size
+ *
+ * Update map size with information read from configuration files.
+ *
+ * @param map the structure with file descriptor to update.
+ * @param lmap the structure with information from configuration files.
+ * @param em the structure with information about how the module/thread is working.
+ * @param map_name the name of the file used to log.
+ */
+void ebpf_update_map_size(struct bpf_map *map, ebpf_local_maps_t *lmap, ebpf_module_t *em, const char *map_name)
+{
+ uint32_t apps_type = NETDATA_EBPF_MAP_PID | NETDATA_EBPF_MAP_RESIZABLE;
+ if (lmap->user_input && lmap->user_input != lmap->internal_input) {
+#ifdef NETDATA_INTERNAL_CHECKS
+ info("Changing map %s from size %u to %u ", map_name, lmap->internal_input, lmap->user_input);
+#endif
+#ifdef LIBBPF_MAJOR_VERSION
+ bpf_map__set_max_entries(map, lmap->user_input);
+#else
+ bpf_map__resize(map, lmap->user_input);
+#endif
+ } else if (((lmap->type & apps_type) == apps_type) && (!em->apps_charts) && (!em->cgroup_charts)) {
+ lmap->user_input = ND_EBPF_DEFAULT_MIN_PID;
+#ifdef LIBBPF_MAJOR_VERSION
+ bpf_map__set_max_entries(map, lmap->user_input);
+#else
+ bpf_map__resize(map, lmap->user_input);
+#endif
+ }
+}
+
+/**
+ * Update Legacy map sizes
+ *
+ * Update map size for eBPF legacy code.
+ *
+ * @param program the structure with values read from binary.
+ * @param em the structure with information about how the module/thread is working.
+ */
+static void ebpf_update_legacy_map_sizes(struct bpf_object *program, ebpf_module_t *em)
{
struct bpf_map *map;
ebpf_local_maps_t *maps = em->maps;
if (!maps)
return;
- uint32_t apps_type = NETDATA_EBPF_MAP_PID | NETDATA_EBPF_MAP_RESIZABLE;
bpf_map__for_each(map, program)
{
const char *map_name = bpf_map__name(map);
@@ -469,15 +508,7 @@ void ebpf_update_map_sizes(struct bpf_object *program, ebpf_module_t *em)
ebpf_local_maps_t *w = &maps[i];
if (w->type & NETDATA_EBPF_MAP_RESIZABLE) {
if (!strcmp(w->name, map_name)) {
- if (w->user_input && w->user_input != w->internal_input) {
-#ifdef NETDATA_INTERNAL_CHECKS
- info("Changing map %s from size %u to %u ", map_name, w->internal_input, w->user_input);
-#endif
- bpf_map__resize(map, w->user_input);
- } else if (((w->type & apps_type) == apps_type) && (!em->apps_charts) && (!em->cgroup_charts)) {
- w->user_input = ND_EBPF_DEFAULT_MIN_PID;
- bpf_map__resize(map, w->user_input);
- }
+ ebpf_update_map_size(map, w, em, map_name);
}
}
@@ -566,7 +597,32 @@ static void ebpf_update_maps(ebpf_module_t *em, struct bpf_object *obj)
}
}
-static void ebpf_update_controller(ebpf_module_t *em, struct bpf_object *obj)
+/**
+ * Update Controller
+ *
+ * Update controller value with user input.
+ *
+ * @param fd the table file descriptor
+ * @param em structure with information about eBPF program we will load.
+ */
+void ebpf_update_controller(int fd, ebpf_module_t *em)
+{
+ uint32_t key = NETDATA_CONTROLLER_APPS_ENABLED;
+ uint32_t value = em->apps_charts | em->cgroup_charts;
+ int ret = bpf_map_update_elem(fd, &key, &value, 0);
+ if (ret)
+ error("Add key(%u) for controller table failed.", key);
+}
+
+/**
+ * Update Legacy controller
+ *
+ * Update legacy controller table when eBPF program has it.
+ *
+ * @param em structure with information about eBPF program we will load.
+ * @param obj bpf object with tables.
+ */
+static void ebpf_update_legacy_controller(ebpf_module_t *em, struct bpf_object *obj)
{
ebpf_local_maps_t *maps = em->maps;
if (!maps)
@@ -582,11 +638,7 @@ static void ebpf_update_controller(ebpf_module_t *em, struct bpf_object *obj)
w->type &= ~NETDATA_EBPF_MAP_CONTROLLER;
w->type |= NETDATA_EBPF_MAP_CONTROLLER_UPDATED;
- uint32_t key = NETDATA_CONTROLLER_APPS_ENABLED;
- int value = em->apps_charts | em->cgroup_charts;
- int ret = bpf_map_update_elem(w->map_fd, &key, &value, 0);
- if (ret)
- error("Add key(%u) for controller table failed.", key);
+ ebpf_update_controller(w->map_fd, em);
}
i++;
}
@@ -622,7 +674,7 @@ struct bpf_link **ebpf_load_program(char *plugins_dir, ebpf_module_t *em, int kv
return NULL;
}
- ebpf_update_map_sizes(*obj, em);
+ ebpf_update_legacy_map_sizes(*obj, em);
if (bpf_object__load(*obj)) {
error("ERROR: loading BPF object file failed %s\n", lpath);
@@ -631,7 +683,7 @@ struct bpf_link **ebpf_load_program(char *plugins_dir, ebpf_module_t *em, int kv
}
ebpf_update_maps(em, *obj);
- ebpf_update_controller(em, *obj);
+ ebpf_update_legacy_controller(em, *obj);
size_t count_programs = ebpf_count_programs(*obj);
diff --git a/libnetdata/ebpf/ebpf.h b/libnetdata/ebpf/ebpf.h
index fa4892140a..f701e1d4dc 100644
--- a/libnetdata/ebpf/ebpf.h
+++ b/libnetdata/ebpf/ebpf.h
@@ -38,6 +38,8 @@
#define EBPF_CFG_APPLICATION "apps"
#define EBPF_CFG_CGROUP "cgroups"
+#define EBPF_COMMON_FNCT_CLEAN_UP "release_task"
+
/**
* The RedHat magic number was got doing:
*
@@ -249,6 +251,8 @@ extern void ebpf_load_addresses(ebpf_addresses_t *fa, int fd);
extern void ebpf_fill_algorithms(int *algorithms, size_t length, int algorithm);
extern char **ebpf_fill_histogram_dimension(size_t maximum);
extern void ebpf_update_stats(ebpf_plugin_stats_t *report, ebpf_module_t *em);
+extern void ebpf_update_controller(int fd, ebpf_module_t *em);
+extern void ebpf_update_map_size(struct bpf_map *map, ebpf_local_maps_t *lmap, ebpf_module_t *em, const char *map_name);
// Histogram
#define NETDATA_EBPF_HIST_MAX_BINS 24UL