tools/bpf: simplify libbpf API function libbpf_set_print()
authorYonghong Song <yhs@fb.com>
Sat, 2 Feb 2019 00:14:17 +0000 (16:14 -0800)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 4 Feb 2019 17:40:59 +0000 (09:40 -0800)
Currently, the libbpf API function libbpf_set_print()
takes three function pointer parameters for warning, info
and debug printout respectively.

This patch changes the API to have just one function pointer
parameter and the function pointer has one additional
parameter "debugging level". So if in the future, if
the debug level is increased, the function signature
won't change.

Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf.h
tools/lib/bpf/test_libbpf.cpp
tools/perf/util/bpf-loader.c
tools/testing/selftests/bpf/test_btf.c
tools/testing/selftests/bpf/test_libbpf_open.c
tools/testing/selftests/bpf/test_progs.c

index 0354af03b0387d1d465f0b375013afbf0f621542..ce209ab9a1a2b1f600af986c29394d305d64befa 100644 (file)
 
 #define __printf(a, b) __attribute__((format(printf, a, b)))
 
-__printf(1, 2)
-static int __base_pr(const char *format, ...)
+__printf(2, 3)
+static int __base_pr(enum libbpf_print_level level, const char *format, ...)
 {
        va_list args;
        int err;
 
+       if (level == LIBBPF_DEBUG)
+               return 0;
+
        va_start(args, format);
        err = vfprintf(stderr, format, args);
        va_end(args);
        return err;
 }
 
-static __printf(1, 2) libbpf_print_fn_t __pr_warning = __base_pr;
-static __printf(1, 2) libbpf_print_fn_t __pr_info = __base_pr;
-static __printf(1, 2) libbpf_print_fn_t __pr_debug;
+static __printf(2, 3) libbpf_print_fn_t __libbpf_pr = __base_pr;
 
-void libbpf_set_print(libbpf_print_fn_t warn,
-                     libbpf_print_fn_t info,
-                     libbpf_print_fn_t debug)
+void libbpf_set_print(libbpf_print_fn_t fn)
 {
-       __pr_warning = warn;
-       __pr_info = info;
-       __pr_debug = debug;
+       __libbpf_pr = fn;
 }
 
 __printf(2, 3)
@@ -84,17 +81,11 @@ void libbpf_print(enum libbpf_print_level level, const char *format, ...)
 {
        va_list args;
 
+       if (!__libbpf_pr)
+               return;
+
        va_start(args, format);
-       if (level == LIBBPF_WARN) {
-               if (__pr_warning)
-                       __pr_warning(format, args);
-       } else if (level == LIBBPF_INFO) {
-               if (__pr_info)
-                       __pr_info(format, args);
-       } else {
-               if (__pr_debug)
-                       __pr_debug(format, args);
-       }
+       __libbpf_pr(level, format, args);
        va_end(args);
 }
 
index 0fb32cc046338a7d1aa636e920a4b4cd55143ed6..19dbc1bed96077ddd7e618486b606a5d009ce868 100644 (file)
@@ -53,17 +53,11 @@ enum libbpf_print_level {
         LIBBPF_DEBUG,
 };
 
-/*
- * __printf is defined in include/linux/compiler-gcc.h. However,
- * it would be better if libbpf.h didn't depend on Linux header files.
- * So instead of __printf, here we use gcc attribute directly.
- */
-typedef int (*libbpf_print_fn_t)(const char *, ...)
-       __attribute__((format(printf, 1, 2)));
+typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level,
+                                const char *, ...)
+       __attribute__((format(printf, 2, 3)));
 
-LIBBPF_API void libbpf_set_print(libbpf_print_fn_t warn,
-                                libbpf_print_fn_t info,
-                                libbpf_print_fn_t debug);
+LIBBPF_API void libbpf_set_print(libbpf_print_fn_t fn);
 
 /* Hide internal to user */
 struct bpf_object;
index be67f5ea2c19b852c702a5ff3ef9e59d8eb7af60..fc134873bb6d7ad586a14922593b6e35f34251b8 100644 (file)
@@ -8,7 +8,7 @@
 int main(int argc, char *argv[])
 {
     /* libbpf.h */
-    libbpf_set_print(NULL, NULL, NULL);
+    libbpf_set_print(NULL);
 
     /* bpf.h */
     bpf_prog_get_fd_by_id(0);
index 2f3eb6d293eeb66f9b5aeb8ef5cd3fa1efed7062..38afdbe6a9e0361f079c55257c847031569725cb 100644 (file)
 #include "llvm-utils.h"
 #include "c++/clang-c.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;                             \
-}
+static int libbpf_perf_print(enum libbpf_print_level level __attribute__((unused)),
+                             const char *fmt, ...)
+{
+       va_list args;
+       int ret;
 
-DEFINE_PRINT_FN(warning, 1)
-DEFINE_PRINT_FN(info, 1)
-DEFINE_PRINT_FN(debug, 1)
+       va_start(args, fmt);
+       ret = veprintf(1, verbose, pr_fmt(fmt), args);
+       va_end(args);
+       return ret;
+}
 
 struct bpf_prog_priv {
        bool is_tp;
@@ -59,9 +55,7 @@ bpf__prepare_load_buffer(void *obj_buf, size_t obj_buf_sz, const char *name)
        struct bpf_object *obj;
 
        if (!libbpf_initialized) {
-               libbpf_set_print(libbpf_warning,
-                                libbpf_info,
-                                libbpf_debug);
+               libbpf_set_print(libbpf_perf_print);
                libbpf_initialized = true;
        }
 
@@ -79,9 +73,7 @@ struct bpf_object *bpf__prepare_load(const char *filename, bool source)
        struct bpf_object *obj;
 
        if (!libbpf_initialized) {
-               libbpf_set_print(libbpf_warning,
-                                libbpf_info,
-                                libbpf_debug);
+               libbpf_set_print(libbpf_perf_print);
                libbpf_initialized = true;
        }
 
index 179f1d8ec5bfef6e2334669438a4b1193772d187..aebaeff5a5a0209eb8db2a724ef061c420c9b015 100644 (file)
@@ -54,8 +54,9 @@ static int count_result(int err)
 
 #define __printf(a, b) __attribute__((format(printf, a, b)))
 
-__printf(1, 2)
-static int __base_pr(const char *format, ...)
+__printf(2, 3)
+static int __base_pr(enum libbpf_print_level level __attribute__((unused)),
+                    const char *format, ...)
 {
        va_list args;
        int err;
@@ -5650,7 +5651,7 @@ int main(int argc, char **argv)
                return err;
 
        if (args.always_log)
-               libbpf_set_print(__base_pr, __base_pr, __base_pr);
+               libbpf_set_print(__base_pr);
 
        if (args.raw_test)
                err |= test_raw();
index 8fcd1c076add0baf5f15a617a192afe269aa97c8..b9ff3bf76544b03b278de37bd0c6f2d07a408ee9 100644 (file)
@@ -34,23 +34,22 @@ static void usage(char *argv[])
        printf("\n");
 }
 
-#define DEFINE_PRINT_FN(name, enabled) \
-static int libbpf_##name(const char *fmt, ...)         \
-{                                                      \
-        va_list args;                                  \
-        int ret;                                       \
-                                                       \
-        va_start(args, fmt);                           \
-       if (enabled) {                                  \
-               fprintf(stderr, "[" #name "] ");        \
-               ret = vfprintf(stderr, fmt, args);      \
-       }                                               \
-        va_end(args);                                  \
-        return ret;                                    \
+static bool debug = 0;
+static int libbpf_debug_print(enum libbpf_print_level level,
+                             const char *fmt, ...)
+{
+       va_list args;
+       int ret;
+
+       if (level == LIBBPF_DEBUG && !debug)
+               return 0;
+
+       va_start(args, fmt);
+       fprintf(stderr, "[%d] ", level);
+       ret = vfprintf(stderr, fmt, args);
+       va_end(args);
+       return ret;
 }
-DEFINE_PRINT_FN(warning, 1)
-DEFINE_PRINT_FN(info, 1)
-DEFINE_PRINT_FN(debug, 1)
 
 #define EXIT_FAIL_LIBBPF EXIT_FAILURE
 #define EXIT_FAIL_OPTION 2
@@ -120,15 +119,14 @@ int main(int argc, char **argv)
        int longindex = 0;
        int opt;
 
-       libbpf_set_print(libbpf_warning, libbpf_info, NULL);
+       libbpf_set_print(libbpf_debug_print);
 
        /* Parse commands line args */
        while ((opt = getopt_long(argc, argv, "hDq",
                                  long_options, &longindex)) != -1) {
                switch (opt) {
                case 'D':
-                       libbpf_set_print(libbpf_warning, libbpf_info,
-                                        libbpf_debug);
+                       debug = 1;
                        break;
                case 'q': /* Use in scripting mode */
                        verbose = 0;
index a08d026ac39685ec0c794e429f1a1e417d56aba8..55d05102e7bfb15d10d2153078cf74938c17bd54 100644 (file)
@@ -10,6 +10,7 @@
 #include <string.h>
 #include <assert.h>
 #include <stdlib.h>
+#include <stdarg.h>
 #include <time.h>
 
 #include <linux/types.h>
@@ -1783,6 +1784,21 @@ static void test_task_fd_query_tp(void)
                                   "sys_enter_read");
 }
 
+static int libbpf_debug_print(enum libbpf_print_level level,
+                             const char *format, ...)
+{
+       va_list args;
+       int ret;
+
+       if (level == LIBBPF_DEBUG)
+               return 0;
+
+       va_start(args, format);
+       ret = vfprintf(stderr, format, args);
+       va_end(args);
+       return ret;
+}
+
 static void test_reference_tracking()
 {
        const char *file = "./test_sk_lookup_kern.o";
@@ -1809,9 +1825,9 @@ static void test_reference_tracking()
 
                /* Expect verifier failure if test name has 'fail' */
                if (strstr(title, "fail") != NULL) {
-                       libbpf_set_print(NULL, NULL, NULL);
+                       libbpf_set_print(NULL);
                        err = !bpf_program__load(prog, "GPL", 0);
-                       libbpf_set_print(printf, printf, NULL);
+                       libbpf_set_print(libbpf_debug_print);
                } else {
                        err = bpf_program__load(prog, "GPL", 0);
                }