lists.openwall.net   lists  /  announce  owl-users  owl-dev  john-users  john-dev  passwdqc-users  yescrypt  popa3d-users  /  oss-security  kernel-hardening  musl  sabotage  tlsify  passwords  /  crypt-dev  xvendor  /  Bugtraq  Full-Disclosure  linux-kernel  linux-netdev  linux-ext4  linux-hardening  linux-cve-announce  PHC 
Open Source and information security mailing list archives
 
Hash Suite for Android: free password hash cracker in your pocket
[<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

Powered by Openwall GNU/*/Linux Powered by OpenVZ