|
@@ -0,0 +1,57 @@
|
|
|
|
+/*
|
|
|
|
+ * bpf-loader.c
|
|
|
|
+ *
|
|
|
|
+ * Copyright (C) 2015 Wang Nan <wangnan0@huawei.com>
|
|
|
|
+ * Copyright (C) 2015 Huawei Inc.
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+#include <bpf/libbpf.h>
|
|
|
|
+#include <linux/err.h>
|
|
|
|
+#include "perf.h"
|
|
|
|
+#include "debug.h"
|
|
|
|
+#include "bpf-loader.h"
|
|
|
|
+
|
|
|
|
+#define DEFINE_PRINT_FN(name, level) \
|
|
|
|
+static int libbpf_##name(const char *fmt, ...) \
|
|
|
|
+{ \
|
|
|
|
+ va_list args; \
|
|
|
|
+ int ret; \
|
|
|
|
+ \
|
|
|
|
+ va_start(args, fmt); \
|
|
|
|
+ ret = veprintf(level, verbose, pr_fmt(fmt), args);\
|
|
|
|
+ va_end(args); \
|
|
|
|
+ return ret; \
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+DEFINE_PRINT_FN(warning, 0)
|
|
|
|
+DEFINE_PRINT_FN(info, 0)
|
|
|
|
+DEFINE_PRINT_FN(debug, 1)
|
|
|
|
+
|
|
|
|
+struct bpf_object *bpf__prepare_load(const char *filename)
|
|
|
|
+{
|
|
|
|
+ struct bpf_object *obj;
|
|
|
|
+ static bool libbpf_initialized;
|
|
|
|
+
|
|
|
|
+ if (!libbpf_initialized) {
|
|
|
|
+ libbpf_set_print(libbpf_warning,
|
|
|
|
+ libbpf_info,
|
|
|
|
+ libbpf_debug);
|
|
|
|
+ libbpf_initialized = true;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ obj = bpf_object__open(filename);
|
|
|
|
+ if (!obj) {
|
|
|
|
+ pr_debug("bpf: failed to load %s\n", filename);
|
|
|
|
+ return ERR_PTR(-EINVAL);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ return obj;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void bpf__clear(void)
|
|
|
|
+{
|
|
|
|
+ struct bpf_object *obj, *tmp;
|
|
|
|
+
|
|
|
|
+ bpf_object__for_each_safe(obj, tmp)
|
|
|
|
+ bpf_object__close(obj);
|
|
|
|
+}
|