diff --git a/Makefile b/Makefile index bbfbea341d80bc5caf45f88cede4a717cefe70b1..6c4fa4bd7ead56667c7fb6e6f3daeb0e9666b140 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,8 @@ # SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) OUTPUT := .output CLANG ?= clang -v -BPFTOOL ?= $(abspath tools/bpftool) -PAHOLE ?= $(abspath tools/pahole) +BPFTOOL ?= bpftool +PAHOLE ?= pahole READELF ?= readelf VMLINUX ?= /usr/lib/debug/lib/modules/`uname -r`/vmlinux VMLINUX_HEADER ?= $(OUTPUT)/vmlinux.h @@ -63,28 +63,22 @@ $(OUTPUT)/%.bpf.o: %.bpf.c $(wildcard %.h) | $(OUTPUT) $(VMLINUX_HEADER) $(INCLUDES) $(CLANG_BPF_SYS_INCLUDES) \ -g -O2 -target bpf -c $(filter %.c,$^) -o $@ -# Generate BPF skeletons -$(OUTPUT)/%.skel.h: $(OUTPUT)/%.bpf.o | $(OUTPUT) - $(call msg,GEN-SKEL,$@) - $(Q)$(BPFTOOL) gen skeleton $< > $@ - # Build common-helper code $(OUTPUT)/common_helper.o: common_helper.c | $(OUTPUT) $(call msg,CC,$@) $(Q)$(CC) $(CFLAGS) -c $(filter %.c,$^) -o $@ # Build user-space code -$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.skel.h +$(patsubst %,$(OUTPUT)/%.o,$(APPS)): %.o: %.bpf.o $(OUTPUT)/%.o: %.c $(wildcard %.h) | $(OUTPUT) $(call msg,CC,$@) $(Q)$(CC) $(CFLAGS) $(INCLUDES) -c $(filter %.c,$^) -o $@ # Build application binary -# 动态链接的场景下尝试将-lelf和-lz去掉 $(APPS): %: $(OUTPUT)/%.o $(OUTPUT)/common_helper.o | $(OUTPUT) $(call msg,BINARY,$@) - $(Q)$(CC) $(CFLAGS) $^ -lbpf -lelf -lz -o $@ + $(Q)$(CC) $(CFLAGS) $^ -lbpf -o $@ # delete failed targets .DELETE_ON_ERROR: diff --git a/atune_bpf_collection.spec b/atune_bpf_collection.spec index 2afb972248cf894d8fef1838456e91ad2dad9b97..f1ac740fc12530df33767a6671ce3d609b72c536 100644 --- a/atune_bpf_collection.spec +++ b/atune_bpf_collection.spec @@ -6,7 +6,7 @@ Summary: BPF program collection to adjust fine-grained kernel mode to get bette URL: https://gitee.com/openeuler/A-Tune-BPF-Collection Source0: https://gitee.com/openeuler/A-Tune-BPF-Collection/repository/archive/v%{version}.tar.gz -BuildRequires: clang, llvm, libbpf-devel +BuildRequires: clang, llvm, libbpf-devel, bpftool, dwarves Requires: libbpf Provides: readahead_tune diff --git a/readahead_tune.bpf.c b/readahead_tune.bpf.c index 544814f90388b63012282328b51f1dd5dcfacb01..a0e30dd93737a559fc4e713f713e5da8a29aaed4 100644 --- a/readahead_tune.bpf.c +++ b/readahead_tune.bpf.c @@ -70,7 +70,7 @@ static __always_inline bool is_expected_file(void *name) char prefix[5]; int err = bpf_probe_read_str(&prefix, sizeof(prefix), name); if (err <= 0) { - return false; + return 0; } return !__builtin_memcmp(prefix, PREFIX_PATTERN, sizeof(PREFIX_PATTERN) - 1); } @@ -109,13 +109,13 @@ int fs_file_read(struct fs_file_read_args *args) __u64 now = bpf_ktime_get_ns(); __u64 key = rd_ctx->key; - bool first = false; + bool first = 0; struct file_rd_hnode *hist = bpf_map_lookup_elem(&htab, &key); struct file_rd_hnode new_hist; if (!hist) { __builtin_memset(&new_hist, 0, sizeof(new_hist)); new_hist.last_nsec = now; - first = true; + first = 1; hist = &new_hist; } diff --git a/readahead_tune.c b/readahead_tune.c index 689370cc2741fb2c145aecf2c3314a8d43a868b8..0070e5869220df93106ae2e4352dee2eef2412c8 100644 --- a/readahead_tune.c +++ b/readahead_tune.c @@ -12,9 +12,10 @@ #include #include "readahead_tune.h" #include "common_helper.h" -#include "readahead_tune.skel.h" #define DEFAULT_CONF "/etc/sysconfig/readahead_tune.conf" +#define READ_TP_NAME "fs_file_read" +#define RELEASE_TP_NAME "fs_file_release" struct env_conf { const char *name; @@ -29,7 +30,7 @@ const struct env_conf confs[CONF_NUM] = { {"upper-bound-percentage", DEFAULT_UPPER_BOUND} }; -static int parse_config(unsigned int where, struct readahead_tune_bpf *skel, const char *conf_fn) +static int parse_config(unsigned int where, int conf_fd, const char *conf_fn) { unsigned long long parse_conf[CONF_NUM] = {0}; struct opt **opts = parse_init(SHASH); @@ -89,7 +90,7 @@ use_default: success_parse: parse_fini(opts, SHASH); for (unsigned int i = 0; i < CONF_NUM; i++) { - if (bpf_map_update_elem(bpf_map__fd(skel->maps.arraymap), &i, parse_conf + i, BPF_ANY)) { + if (bpf_map_update_elem(conf_fd, &i, parse_conf + i, BPF_ANY)) { return -1; } } @@ -159,8 +160,10 @@ static void sig_handler(int sig) int main(int argc, char *argv[]) { - struct readahead_tune_bpf *skel; + const char *file = ".output/readahead_tune.bpf.o"; + struct bpf_object *obj = NULL; unsigned int where = TERM; + int prog_fd; int err = argp_parse(&argp, argc, argv, 0, NULL, NULL); if (err) { @@ -168,7 +171,8 @@ int main(int argc, char *argv[]) } if (!foreground) { - err = daemon(0, 0); + /* file is relative path, nochdir can't be zero */ + err = daemon(1, 0); where = SYSLOG; if (err) { perror("Failed to daemon\n"); @@ -183,30 +187,65 @@ int main(int argc, char *argv[]) /* Bump RLIMIT_MEMLOCK to create BPF maps */ bump_memlock_rlimit(where); - - skel = readahead_tune_bpf__open_and_load(); - if (!skel) { - log(where, LOG_ERR, "Failed to open and load BPF skeleton\n"); - return -1; + + err = bpf_prog_load(file, BPF_PROG_TYPE_UNSPEC, &obj, &prog_fd); + if (err) { + log(where, LOG_ERR, "Failed to load BPF program\n"); + return err; + } + + int conf_fd = bpf_object__find_map_fd_by_name(obj, "arraymap"); + if (conf_fd < 0) { + log(where, LOG_ERR, "Failed to get arraymap fd\n"); + err = conf_fd; + goto cleanup; } - err = parse_config(where, skel, config_file); + err = parse_config(where, conf_fd, config_file); if (err) { log(where, LOG_ERR, "Failed to write config value into BPF ARRAY MAP\n"); goto cleanup; } - err = readahead_tune_bpf__attach(skel); - if (err) { - log(where, LOG_ERR, "Failed to attach BPF skeleton\n"); + const char *prog_name = "raw_tracepoint.w/" READ_TP_NAME; + struct bpf_program *prog = bpf_object__find_program_by_title(obj, prog_name); + if (!prog) { + log(where, LOG_ERR, "Failed to find program %s\n", prog_name); + err = -EINVAL; goto cleanup; } + int read_fd = bpf_raw_tracepoint_open(READ_TP_NAME, bpf_program__fd(prog)); + if (read_fd < 0) { + err = -errno; + log(where, LOG_ERR, "Failed to attach raw tracepoint %s\n", READ_TP_NAME); + goto cleanup; + } + + prog_name = "raw_tracepoint/" RELEASE_TP_NAME; + prog = bpf_object__find_program_by_title(obj, prog_name); + if (!prog) { + log(where, LOG_ERR, "Failed to find program %s\n", prog_name); + err = -EINVAL; + goto close_read_fd; + } + + int release_fd = bpf_raw_tracepoint_open(RELEASE_TP_NAME, bpf_program__fd(prog)); + if (release_fd < 0) { + err = -errno; + log(where, LOG_ERR, "Failed to attach raw tracepoint %s\n", RELEASE_TP_NAME); + goto close_read_fd; + } + while (!exiting) { pause(); } + close(release_fd); +close_read_fd: + close(read_fd); + cleanup: - readahead_tune_bpf__destroy(skel); + bpf_object__close(obj); return err; } diff --git a/tools/bpftool b/tools/bpftool deleted file mode 100755 index c5629886d07cde839e88d7fee8f6d4ae839944dd..0000000000000000000000000000000000000000 Binary files a/tools/bpftool and /dev/null differ diff --git a/tools/pahole b/tools/pahole deleted file mode 100755 index de2cf5003afd968838f24953e140b328b8f8c3b1..0000000000000000000000000000000000000000 Binary files a/tools/pahole and /dev/null differ