From 7ec1e7f6647b36a2658b13379b39d1aa29b847c9 Mon Sep 17 00:00:00 2001 From: thiagoftsm Date: Tue, 9 Mar 2021 10:51:26 +0000 Subject: [PATCH] Common library (#204) Move common code to header creating a standard library. --- Makefile | 9 +- {kernel => includes}/netdata_asm_goto.h | 0 includes/netdata_cache.h | 1 + includes/netdata_ebpf.h | 31 +++++ includes/netdata_network.h | 1 + includes/netdata_process.h | 1 + includes/netdata_sync.h | 1 - kernel/Makefile | 6 +- kernel/cachestat_kern.c | 40 ++----- kernel/network_viewer_kern.c | 15 +++ kernel/process_kern.c | 149 ++++++++---------------- kernel/sync_kern.c | 39 +------ rename_binaries.sh | 20 ++++ 13 files changed, 132 insertions(+), 181 deletions(-) rename {kernel => includes}/netdata_asm_goto.h (100%) create mode 100644 rename_binaries.sh diff --git a/Makefile b/Makefile index eeec6604..e66595d1 100644 --- a/Makefile +++ b/Makefile @@ -17,14 +17,7 @@ _LIBC ?= glibc EXTRA_CFLAGS += -fno-stack-protector all: $(KERNEL_PROGRAM) - cp $(KERNEL_DIR)rprocess_kern.o rnetdata_ebpf_process.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)pprocess_kern.o pnetdata_ebpf_process.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)rnetwork_viewer_kern.o rnetdata_ebpf_socket.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)pnetwork_viewer_kern.o pnetdata_ebpf_socket.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)rcachestat_kern.o rnetdata_ebpf_cachestat.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)pcachestat_kern.o pnetdata_ebpf_cachestat.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)rsync_kern.o rnetdata_ebpf_sync.$(VER_MAJOR).$(VER_MINOR).o - cp $(KERNEL_DIR)psync_kern.o pnetdata_ebpf_sync.$(VER_MAJOR).$(VER_MINOR).o + sh rename_binaries.sh "$(VER_MAJOR)" "$(VER_MINOR)" if [ -f pnetdata_ebpf_process.$(VER_MAJOR).$(VER_MINOR).o ]; then tar -cf artifacts/netdata_ebpf-$(FIRST_KERNEL_VERSION)_$(VER_MAJOR).$(VER_MINOR)-$(_LIBC).tar [pr]netdata_ebpf_*.$(VER_MAJOR).$(VER_MINOR).o; else echo "ERROR: Cannot find BPF programs"; exit 1; fi if [ "$${DEBUG:-0}" -eq 1 ]; then tar -uvf artifacts/netdata_ebpf-$(FIRST_KERNEL_VERSION)_$(VER_MAJOR).$(VER_MINOR)-$(_LIBC).tar tools/check-kernel-config.sh; fi xz artifacts/netdata_ebpf-$(FIRST_KERNEL_VERSION)_$(VER_MAJOR).$(VER_MINOR)-$(_LIBC).tar diff --git a/kernel/netdata_asm_goto.h b/includes/netdata_asm_goto.h similarity index 100% rename from kernel/netdata_asm_goto.h rename to includes/netdata_asm_goto.h diff --git a/includes/netdata_cache.h b/includes/netdata_cache.h index df7fbcce..491e76db 100644 --- a/includes/netdata_cache.h +++ b/includes/netdata_cache.h @@ -18,6 +18,7 @@ enum cachestat_counters { NETDATA_KEY_CALLS_ACCOUNT_PAGE_DIRTIED, NETDATA_KEY_CALLS_MARK_BUFFER_DIRTY, + // Keep this as last and don't skip numbers as it is used as element counter NETDATA_CACHESTAT_END }; diff --git a/includes/netdata_ebpf.h b/includes/netdata_ebpf.h index 224828a2..88e452a1 100644 --- a/includes/netdata_ebpf.h +++ b/includes/netdata_ebpf.h @@ -18,6 +18,37 @@ struct netdata_error_report_t { int err; }; +// Use __always_inline instead inline to keep compatiblity with old kernels +// https://docs.cilium.io/en/v1.8/bpf/ +// The condition to test kernel was added, because __always_inline broke the epbf.plugin +// on CentOS 7 and Ubuntu 18.04 (kernel 4.18) +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4,19,0)) +static __always_inline void libnetdata_update_u64(__u64 *res, __u64 value) +#else +static inline void libnetdata_update_u64(__u64 *res, __u64 value) +#endif +{ + __sync_fetch_and_add(res, value); + if ( (0xFFFFFFFFFFFFFFFF - *res) <= value) { + *res = value; + } +} + +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4,19,0)) +static __always_inline void libnetdata_update_global(struct bpf_map_def *tbl,__u32 key, __u64 value) +#else +static inline void libnetdata_update_global(struct bpf_map_def *tbl,__u32 key, __u64 value) +#endif +{ + __u64 *res; + res = bpf_map_lookup_elem(tbl, &key); + if (res) + libnetdata_update_u64(res, value) ; + else + bpf_map_update_elem(tbl, &key, &value, BPF_NOEXIST); +} + + // Copied from linux/samples/bpf/tracex1_kern.c #define _(P) \ ({ \ diff --git a/includes/netdata_network.h b/includes/netdata_network.h index 8c9f81dc..279c2ce9 100644 --- a/includes/netdata_network.h +++ b/includes/netdata_network.h @@ -26,6 +26,7 @@ enum socket_counters { NETDATA_KEY_TCP_RETRANSMIT, + // Keep this as last and don't skip numbers as it is used as element counter NETDATA_SOCKET_COUNTER }; diff --git a/includes/netdata_process.h b/includes/netdata_process.h index 1fc11d31..79177691 100644 --- a/includes/netdata_process.h +++ b/includes/netdata_process.h @@ -78,6 +78,7 @@ enum process_counters { NETDATA_KEY_ERROR_VFS_READV, NETDATA_KEY_BYTES_VFS_READV, + // Keep this as last and don't skip numbers as it is used as element counter NETDATA_GLOBAL_COUNTER }; diff --git a/includes/netdata_sync.h b/includes/netdata_sync.h index 333a2202..69944a42 100644 --- a/includes/netdata_sync.h +++ b/includes/netdata_sync.h @@ -5,7 +5,6 @@ enum sync_counters { NETDATA_KEY_SYNC_CALL, - NETDATA_KEY_SYNC_ERROR, // Keep this as last and don't skip numbers as it is used as element counter NETDATA_SYNC_END diff --git a/kernel/Makefile b/kernel/Makefile index d319aa73..d5c5f545 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -48,7 +48,7 @@ all: process_kern.o network_viewer_kern.o cachestat_kern.o sync_kern.o -Wno-tautological-compare \ -DNETDATASEL=0 \ -D__BPF_TRACING__ \ - -include netdata_asm_goto.h \ + -include ../includes/netdata_asm_goto.h \ -O2 -emit-llvm -c $< $(LLC) -march=bpf -filetype=obj -o r$@ $(<:.c=.ll) $(CLANG) $(EXTRA_CFLAGS) -S -nostdinc $(LINUXINCLUDE) $(LLVM_INCLUDES) \ @@ -58,7 +58,7 @@ all: process_kern.o network_viewer_kern.o cachestat_kern.o sync_kern.o -Wno-tautological-compare \ -DNETDATASEL=1 \ -D__BPF_TRACING__ \ - -include netdata_asm_goto.h \ + -include ../includes/netdata_asm_goto.h \ -O2 -emit-llvm -c $< $(LLC) -march=bpf -filetype=obj -o d$@ $(<:.c=.ll) $(CLANG) $(EXTRA_CFLAGS) -S -nostdinc $(LINUXINCLUDE) $(LLVM_INCLUDES) \ @@ -68,7 +68,7 @@ all: process_kern.o network_viewer_kern.o cachestat_kern.o sync_kern.o -Wno-tautological-compare \ -DNETDATASEL=2 \ -D__BPF_TRACING__ \ - -include netdata_asm_goto.h \ + -include ../includes/netdata_asm_goto.h \ -O2 -emit-llvm -c $< $(LLC) -march=bpf -filetype=obj -o p$@ $(<:.c=.ll) diff --git a/kernel/cachestat_kern.c b/kernel/cachestat_kern.c index 40decaf0..d7093c7b 100644 --- a/kernel/cachestat_kern.c +++ b/kernel/cachestat_kern.c @@ -27,30 +27,6 @@ struct bpf_map_def SEC("maps") cstat_pid = { .max_entries = 100000 }; -/************************************************************************************ - * - * COMMON Section - * - ***********************************************************************************/ - -static inline void netdata_update_u64(__u64 *res, __u64 value) -{ - __sync_fetch_and_add(res, value); - if ( (0xFFFFFFFFFFFFFFFF - *res) <= value) { - *res = value; - } -} - -static inline void netdata_update_global(__u32 key, __u64 value) -{ - __u64 *res; - res = bpf_map_lookup_elem(&cstat_global, &key); - if (res) - netdata_update_u64(res, value) ; - else - bpf_map_update_elem(&cstat_global, &key, &value, BPF_NOEXIST); -} - /************************************************************************************ * * Probe Section @@ -61,13 +37,13 @@ SEC("kprobe/add_to_page_cache_lru") int netdata_add_to_page_cache_lru(struct pt_regs* ctx) { netdata_cachestat_t *fill, data = {}; - netdata_update_global(NETDATA_KEY_CALLS_ADD_TO_PAGE_CACHE_LRU, 1); + libnetdata_update_global(&cstat_global, NETDATA_KEY_CALLS_ADD_TO_PAGE_CACHE_LRU, 1); __u64 pid_tgid = bpf_get_current_pid_tgid(); __u32 pid = (__u32)(pid_tgid >> 32); fill = bpf_map_lookup_elem(&cstat_pid ,&pid); if (fill) { - netdata_update_u64(&fill->add_to_page_cache_lru, 1); + libnetdata_update_u64(&fill->add_to_page_cache_lru, 1); } else { data.add_to_page_cache_lru = 1; bpf_map_update_elem(&cstat_pid, &pid, &data, BPF_ANY); @@ -80,13 +56,13 @@ SEC("kprobe/mark_page_accessed") int netdata_mark_page_accessed(struct pt_regs* ctx) { netdata_cachestat_t *fill, data = {}; - netdata_update_global(NETDATA_KEY_CALLS_MARK_PAGE_ACCESSED, 1); + libnetdata_update_global(&cstat_global, NETDATA_KEY_CALLS_MARK_PAGE_ACCESSED, 1); __u64 pid_tgid = bpf_get_current_pid_tgid(); __u32 pid = (__u32)(pid_tgid >> 32); fill = bpf_map_lookup_elem(&cstat_pid ,&pid); if (fill) { - netdata_update_u64(&fill->mark_page_accessed, 1); + libnetdata_update_u64(&fill->mark_page_accessed, 1); } else { data.mark_page_accessed = 1; bpf_map_update_elem(&cstat_pid, &pid, &data, BPF_ANY); @@ -99,13 +75,13 @@ SEC("kprobe/account_page_dirtied") int netdata_account_page_dirtied(struct pt_regs* ctx) { netdata_cachestat_t *fill, data = {}; - netdata_update_global(NETDATA_KEY_CALLS_ACCOUNT_PAGE_DIRTIED, 1); + libnetdata_update_global(&cstat_global, NETDATA_KEY_CALLS_ACCOUNT_PAGE_DIRTIED, 1); __u64 pid_tgid = bpf_get_current_pid_tgid(); __u32 pid = (__u32)(pid_tgid >> 32); fill = bpf_map_lookup_elem(&cstat_pid ,&pid); if (fill) { - netdata_update_u64(&fill->account_page_dirtied, 1); + libnetdata_update_u64(&fill->account_page_dirtied, 1); } else { data.account_page_dirtied = 1; bpf_map_update_elem(&cstat_pid, &pid, &data, BPF_ANY); @@ -118,13 +94,13 @@ SEC("kprobe/mark_buffer_dirty") int netdata_mark_buffer_dirty(struct pt_regs* ctx) { netdata_cachestat_t *fill, data = {}; - netdata_update_global(NETDATA_KEY_CALLS_MARK_BUFFER_DIRTY, 1); + libnetdata_update_global(&cstat_global, NETDATA_KEY_CALLS_MARK_BUFFER_DIRTY, 1); __u64 pid_tgid = bpf_get_current_pid_tgid(); __u32 pid = (__u32)(pid_tgid >> 32); fill = bpf_map_lookup_elem(&cstat_pid ,&pid); if (fill) { - netdata_update_u64(&fill->mark_buffer_dirty, 1); + libnetdata_update_u64(&fill->mark_buffer_dirty, 1); } else { data.mark_buffer_dirty = 1; bpf_map_update_elem(&cstat_pid, &pid, &data, BPF_ANY); diff --git a/kernel/network_viewer_kern.c b/kernel/network_viewer_kern.c index fa2b16e2..5c481be6 100644 --- a/kernel/network_viewer_kern.c +++ b/kernel/network_viewer_kern.c @@ -165,12 +165,19 @@ struct bpf_map_def SEC("maps") tbl_used_ports = { /** * Function used to update 64 bit values and avoid overflow */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4,19,0)) +static __always_inline void netdata_update_u64(__u64 *res, __u64 value) +#else static inline void netdata_update_u64(__u64 *res, __u64 value) +#endif { if (!value) return; __sync_fetch_and_add(res, value); + if ( (0xFFFFFFFFFFFFFFFF - *res) <= value) { + *res = value; + } } /* @@ -191,7 +198,11 @@ static void netdata_update_global(__u32 key, __u64 value) * * Read information from socket to update the index. */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4,19,0)) +static __always_inline __u16 set_idx_value(netdata_socket_idx_t *nsi, struct inet_sock *is) +#else static inline __u16 set_idx_value(netdata_socket_idx_t *nsi, struct inet_sock *is) +#endif { __u16 family; @@ -233,7 +244,11 @@ static inline __u16 set_idx_value(netdata_socket_idx_t *nsi, struct inet_sock *i /** * Update time and bytes sent and received */ +#if (LINUX_VERSION_CODE > KERNEL_VERSION(4,19,0)) +static __always_inline void update_socket_stats(netdata_socket_t *ptr, __u64 sent, __u64 received, __u16 retransmitted) +#else static inline void update_socket_stats(netdata_socket_t *ptr, __u64 sent, __u64 received, __u16 retransmitted) +#endif { ptr->ct = bpf_ktime_get_ns(); diff --git a/kernel/process_kern.c b/kernel/process_kern.c index af153f29..f00d9dd5 100644 --- a/kernel/process_kern.c +++ b/kernel/process_kern.c @@ -87,55 +87,6 @@ static void netdata_update_u32(u32 *res, u32 value) } } -static void netdata_update_u64(__u64 *res, __u64 value) -{ - if (!value) - return; - - __sync_fetch_and_add(res, value); - if ( (0xFFFFFFFFFFFFFFFF - *res) <= value) { - *res = value; - } -} - -static void netdata_update_global(__u32 key, __u64 value) -{ - __u64 *res; - res = bpf_map_lookup_elem(&tbl_total_stats, &key); - if (res) { - netdata_update_u64(res, value) ; - } else - bpf_map_update_elem(&tbl_total_stats, &key, &value, BPF_NOEXIST); -} - -/* -static void netdata_reset_stat(struct netdata_pid_stat_t *ptr) -{ - ptr->open_call = 0; - ptr->write_call = 0; - ptr->writev_call = 0; - ptr->read_call = 0; - ptr->readv_call = 0; - ptr->unlink_call = 0; - ptr->exit_call = 0; - ptr->fork_call = 0; - ptr->close_call = 0; - - ptr->write_bytes = 0; - ptr->writev_bytes = 0; - ptr->read_bytes = 0; - ptr->readv_bytes = 0; - - ptr->open_err = 0; - ptr->write_err = 0; - ptr->writev_err = 0; - ptr->read_err = 0; - ptr->readv_err = 0; - ptr->unlink_err = 0; - ptr->fork_err = 0; -} -**/ - #if NETDATASEL == 1 && (LINUX_VERSION_CODE >= KERNEL_VERSION(4,6,0)) static inline void send_perf_error(struct pt_regs* ctx, int ret, int type, __u32 pid) { @@ -167,21 +118,21 @@ int netdata_sys_write(struct pt_regs* ctx) __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_VFS_WRITE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_VFS_WRITE, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->write_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_WRITE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_WRITE, 1); netdata_update_u32(&fill->write_err, 1) ; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_WRITE, tot); - netdata_update_u64(&fill->write_bytes, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_WRITE, tot); + libnetdata_update_u64(&fill->write_bytes, tot); #if NETDATASEL < 2 } #endif @@ -191,13 +142,13 @@ int netdata_sys_write(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_WRITE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_WRITE, 1); data.write_err = 1; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_WRITE, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_WRITE, tot); data.write_bytes = tot; #if NETDATASEL < 2 } @@ -234,21 +185,21 @@ int netdata_sys_writev(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_VFS_WRITEV, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_VFS_WRITEV, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->writev_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_WRITEV, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_WRITEV, 1); netdata_update_u32(&fill->writev_err, 1) ; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_WRITEV, tot); - netdata_update_u64(&fill->writev_bytes, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_WRITEV, tot); + libnetdata_update_u64(&fill->writev_bytes, tot); #if NETDATASEL < 2 } #endif @@ -258,13 +209,13 @@ int netdata_sys_writev(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_WRITEV, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_WRITEV, 1); data.writev_err = 1; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_WRITEV, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_WRITEV, tot); data.writev_bytes = (unsigned long)tot; #if NETDATASEL < 2 } @@ -301,21 +252,21 @@ int netdata_sys_read(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_VFS_READ, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_VFS_READ, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->read_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_READ, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_READ, 1); netdata_update_u32(&fill->read_err, 1) ; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_READ, tot); - netdata_update_u64(&fill->read_bytes, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_READ, tot); + libnetdata_update_u64(&fill->read_bytes, tot); #if NETDATASEL < 2 } #endif @@ -325,13 +276,13 @@ int netdata_sys_read(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_READ, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_READ, 1); data.read_err = 1; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_READ, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_READ, tot); data.read_bytes = (unsigned long)tot; #if NETDATASEL < 2 } @@ -368,21 +319,21 @@ int netdata_sys_readv(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_VFS_READV, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_VFS_READV, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->readv_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_READV, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_READV, 1); netdata_update_u32(&fill->readv_err, 1) ; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_READV, tot); - netdata_update_u64(&fill->readv_bytes, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_READV, tot); + libnetdata_update_u64(&fill->readv_bytes, tot); #if NETDATASEL < 2 } #endif @@ -392,13 +343,13 @@ int netdata_sys_readv(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_READV, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_READV, 1); data.readv_err = 1; } else { #endif ret = (ssize_t)PT_REGS_PARM3(ctx); tot = log2l(ret); - netdata_update_global(NETDATA_KEY_BYTES_VFS_READV, tot); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_BYTES_VFS_READV, tot); data.readv_bytes = (unsigned long)tot; #if NETDATASEL < 2 } @@ -441,14 +392,14 @@ int netdata_sys_open(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_DO_SYS_OPEN, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_DO_SYS_OPEN, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->open_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_DO_SYS_OPEN, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_DO_SYS_OPEN, 1); netdata_update_u32(&fill->open_err, 1) ; } #endif @@ -459,7 +410,7 @@ int netdata_sys_open(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { data.open_err = 1; - netdata_update_global(NETDATA_KEY_ERROR_DO_SYS_OPEN, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_DO_SYS_OPEN, 1); } else { #endif data.open_err = 0; @@ -496,14 +447,14 @@ int netdata_sys_unlink(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_VFS_UNLINK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_VFS_UNLINK, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->unlink_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_UNLINK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_UNLINK, 1); netdata_update_u32(&fill->unlink_err, 1) ; } #endif @@ -513,7 +464,7 @@ int netdata_sys_unlink(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_VFS_UNLINK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_VFS_UNLINK, 1); data.unlink_err = 1; } else { #endif @@ -550,7 +501,7 @@ int netdata_sys_exit(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_DO_EXIT, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_DO_EXIT, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->exit_call, 1) ; @@ -567,7 +518,7 @@ int netdata_release_task(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_RELEASE_TASK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_RELEASE_TASK, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->release_call, 1) ; @@ -618,10 +569,10 @@ int netdata_fork(struct pt_regs* ctx) } #endif - netdata_update_global(NETDATA_KEY_CALLS_DO_FORK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_DO_FORK, 1); #if (LINUX_VERSION_CODE < KERNEL_VERSION(5,3,0)) if(threads) { - netdata_update_global(NETDATA_KEY_CALLS_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_SYS_CLONE, 1); } #endif fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); @@ -637,10 +588,10 @@ int netdata_fork(struct pt_regs* ctx) #if NETDATASEL < 2 if (ret < 0) { netdata_update_u32(&fill->fork_err, 1) ; - netdata_update_global(NETDATA_KEY_ERROR_DO_FORK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_DO_FORK, 1); # if (LINUX_VERSION_CODE < KERNEL_VERSION(5,3,0)) if(threads) { - netdata_update_global(NETDATA_KEY_ERROR_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_SYS_CLONE, 1); netdata_update_u32(&fill->clone_err, 1) ; } # endif @@ -657,11 +608,11 @@ int netdata_fork(struct pt_regs* ctx) #endif #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_DO_FORK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_DO_FORK, 1); data.fork_err = 1; # if (LINUX_VERSION_CODE < KERNEL_VERSION(5,3,0)) if (threads) { - netdata_update_global(NETDATA_KEY_ERROR_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_SYS_CLONE, 1); data.clone_err = 1; } # endif @@ -706,14 +657,14 @@ int netdata_clone(struct pt_regs* ctx) if(!arg1) return 0; - netdata_update_global(NETDATA_KEY_CALLS_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_SYS_CLONE, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->clone_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_SYS_CLONE, 1); netdata_update_u32(&fill->clone_err, 1) ; } #endif @@ -723,7 +674,7 @@ int netdata_clone(struct pt_regs* ctx) data.clone_call = 1; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_SYS_CLONE, 1); data.clone_err = 1; } #endif @@ -769,10 +720,10 @@ int netdata_sys_clone(struct pt_regs *ctx) // SIGCHLD is used by vfork/fork if (exit_signal != SIGCHLD) { threads = 1; - netdata_update_global(NETDATA_KEY_CALLS_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_SYS_CLONE, 1); } - netdata_update_global(NETDATA_KEY_CALLS_DO_FORK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_DO_FORK, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { fill->release_call = 0; @@ -785,9 +736,9 @@ int netdata_sys_clone(struct pt_regs *ctx) #if NETDATASEL < 2 if (ret < 0) { netdata_update_u32(&fill->fork_err, 1) ; - netdata_update_global(NETDATA_KEY_ERROR_DO_FORK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_DO_FORK, 1); if(threads) { - netdata_update_global(NETDATA_KEY_ERROR_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_SYS_CLONE, 1); netdata_update_u32(&fill->clone_err, 1) ; } } @@ -801,10 +752,10 @@ int netdata_sys_clone(struct pt_regs *ctx) } #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_DO_FORK, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_DO_FORK, 1); data.fork_err = 1; if (threads) { - netdata_update_global(NETDATA_KEY_ERROR_SYS_CLONE, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_SYS_CLONE, 1); data.clone_err = 1; } } @@ -841,14 +792,14 @@ int netdata_close(struct pt_regs* ctx) __u32 pid = (__u32)(pid_tgid >> 32); __u32 tgid = (__u32)( 0x00000000FFFFFFFF & pid_tgid); - netdata_update_global(NETDATA_KEY_CALLS_CLOSE_FD, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_CALLS_CLOSE_FD, 1); fill = bpf_map_lookup_elem(&tbl_pid_stats ,&pid); if (fill) { netdata_update_u32(&fill->close_call, 1) ; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_CLOSE_FD, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_CLOSE_FD, 1); netdata_update_u32(&fill->close_err, 1) ; } #endif @@ -858,7 +809,7 @@ int netdata_close(struct pt_regs* ctx) data.close_call = 1; #if NETDATASEL < 2 if (ret < 0) { - netdata_update_global(NETDATA_KEY_ERROR_CLOSE_FD, 1); + libnetdata_update_global(&tbl_total_stats, NETDATA_KEY_ERROR_CLOSE_FD, 1); data.close_err = 1; } #endif diff --git a/kernel/sync_kern.c b/kernel/sync_kern.c index 3816ae57..3d1ffd24 100644 --- a/kernel/sync_kern.c +++ b/kernel/sync_kern.c @@ -18,53 +18,16 @@ struct bpf_map_def SEC("maps") tbl_sync = { .max_entries = NETDATA_SYNC_END }; -/************************************************************************************ - * - * GLOBAL - * - ***********************************************************************************/ - -static void netdata_update_u64(__u64 *res, __u64 value) -{ - if (!value) - return; - - __sync_fetch_and_add(res, value); - if ( (0xFFFFFFFFFFFFFFFF - *res) <= value) { - *res = value; - } -} - -static void netdata_update_global(__u32 key, __u64 value) -{ - __u64 *res; - res = bpf_map_lookup_elem(&tbl_sync, &key); - if (res) { - netdata_update_u64(res, value) ; - } else - bpf_map_update_elem(&tbl_sync, &key, &value, BPF_NOEXIST); -} - - /************************************************************************************ * * SYNC SECTION * ***********************************************************************************/ -#if NETDATASEL < 2 -SEC("kretprobe/" NETDATA_SYSCALL(sync)) -#else SEC("kprobe/" NETDATA_SYSCALL(sync)) -#endif int netdata_syscall_sync(struct pt_regs* ctx) { - netdata_update_global(NETDATA_KEY_SYNC_CALL, 1); -#if NETDATASEL < 2 - int ret = (ssize_t)PT_REGS_RC(ctx); - if (ret < 0) - netdata_update_global(NETDATA_KEY_SYNC_ERROR, 1); -#endif + libnetdata_update_global(&tbl_sync, NETDATA_KEY_SYNC_CALL, 1); return 0; } diff --git a/rename_binaries.sh b/rename_binaries.sh new file mode 100644 index 00000000..cbb28547 --- /dev/null +++ b/rename_binaries.sh @@ -0,0 +1,20 @@ +#!/bin/sh + +KERNEL_DIR="kernel/" + +if [ -z "$1" ] || [ -z "$2" ]; then + echo "Give major and minor version" + exit 1 +fi + +VER_MAJOR="$1" +VER_MINOR="$2" + +cp "${KERNEL_DIR}rprocess_kern.o" "rnetdata_ebpf_process.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}pprocess_kern.o" "pnetdata_ebpf_process.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}rnetwork_viewer_kern.o" "rnetdata_ebpf_socket.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}pnetwork_viewer_kern.o" "pnetdata_ebpf_socket.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}rcachestat_kern.o" "rnetdata_ebpf_cachestat.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}pcachestat_kern.o" "pnetdata_ebpf_cachestat.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}rsync_kern.o" "rnetdata_ebpf_sync.${VER_MAJOR}.${VER_MINOR}.o" +cp "${KERNEL_DIR}psync_kern.o" "pnetdata_ebpf_sync.${VER_MAJOR}.${VER_MINOR}.o"