[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAEf4Bzbb8u0L8c6yZS0mPf554A0Udvs_idaX9xBdwmC8vcUK3A@mail.gmail.com>
Date: Fri, 1 Feb 2019 11:02:50 -0800
From: Andrii Nakryiko <andrii.nakryiko@...il.com>
To: Yonghong Song <yhs@...com>
Cc: Arnaldo Carvalho de Melo <acme@...hat.com>,
Magnus Karlsson <magnus.karlsson@...el.com>,
netdev@...r.kernel.org, Alexei Starovoitov <ast@...com>,
Daniel Borkmann <daniel@...earbox.net>, kernel-team@...com
Subject: Re: [PATCH bpf-next v2 3/3] tools/bpf: simplify libbpf API function libbpf_set_print()
On Fri, Feb 1, 2019 at 10:16 AM Yonghong Song <yhs@...com> wrote:
>
> 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@...com>
> ---
> tools/lib/bpf/libbpf.c | 28 ++++-----------
> tools/lib/bpf/libbpf.h | 14 +++-----
> tools/lib/bpf/test_libbpf.cpp | 2 +-
> tools/perf/util/bpf-loader.c | 32 +++++++----------
> tools/testing/selftests/bpf/test_btf.c | 7 ++--
> .../testing/selftests/bpf/test_libbpf_open.c | 36 +++++++++----------
> tools/testing/selftests/bpf/test_progs.c | 20 +++++++++--
> 7 files changed, 63 insertions(+), 76 deletions(-)
>
> diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
> index 1b1c0b504d25..d2337a179837 100644
> --- a/tools/lib/bpf/libbpf.c
> +++ b/tools/lib/bpf/libbpf.c
> @@ -54,8 +54,8 @@
>
> #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;
> @@ -66,17 +66,11 @@ static int __base_pr(const char *format, ...)
> 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)
> @@ -85,16 +79,8 @@ void libbpf_debug_print(enum libbpf_print_level level, const char *format, ...)
> va_list args;
>
> 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);
> - }
> + if (__libbpf_pr)
If __libbpf_pr is NULL, is there a need to call va_start/va_end? If
not, should they be moved inside if's body?
> + __libbpf_pr(level, format, args);
> va_end(args);
> }
>
> diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
> index 4e21971101c9..f8f27f1bb6bf 100644
> --- a/tools/lib/bpf/libbpf.h
> +++ b/tools/lib/bpf/libbpf.h
> @@ -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;
> diff --git a/tools/lib/bpf/test_libbpf.cpp b/tools/lib/bpf/test_libbpf.cpp
> index be67f5ea2c19..fc134873bb6d 100644
> --- a/tools/lib/bpf/test_libbpf.cpp
> +++ b/tools/lib/bpf/test_libbpf.cpp
> @@ -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);
> diff --git a/tools/perf/util/bpf-loader.c b/tools/perf/util/bpf-loader.c
> index 2f3eb6d293ee..c492f3a2acdc 100644
> --- a/tools/perf/util/bpf-loader.c
> +++ b/tools/perf/util/bpf-loader.c
> @@ -24,21 +24,17 @@
> #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_dprint(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_dprint);
> 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_dprint);
> libbpf_initialized = true;
> }
>
> diff --git a/tools/testing/selftests/bpf/test_btf.c b/tools/testing/selftests/bpf/test_btf.c
> index 179f1d8ec5bf..aebaeff5a5a0 100644
> --- a/tools/testing/selftests/bpf/test_btf.c
> +++ b/tools/testing/selftests/bpf/test_btf.c
> @@ -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();
> diff --git a/tools/testing/selftests/bpf/test_libbpf_open.c b/tools/testing/selftests/bpf/test_libbpf_open.c
> index 8fcd1c076add..3fe258520e4b 100644
> --- a/tools/testing/selftests/bpf/test_libbpf_open.c
> +++ b/tools/testing/selftests/bpf/test_libbpf_open.c
> @@ -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_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_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;
> diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c
> index d8940b8b2f8d..5eff68ab2c1c 100644
> --- a/tools/testing/selftests/bpf/test_progs.c
> +++ b/tools/testing/selftests/bpf/test_progs.c
> @@ -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_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_print);
> } else {
> err = bpf_program__load(prog, "GPL", 0);
> }
> --
> 2.17.1
>
Powered by blists - more mailing lists