Skip to content

Commit

Permalink
tools/bpf: simplify libbpf API function libbpf_set_print()
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Yonghong Song authored and Alexei Starovoitov committed Feb 4, 2019
1 parent 9d100a1 commit 6f1ae8b
Show file tree
Hide file tree
Showing 7 changed files with 68 additions and 76 deletions.
33 changes: 12 additions & 21 deletions tools/lib/bpf/libbpf.c
Original file line number Diff line number Diff line change
Expand Up @@ -54,47 +54,38 @@

#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)
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);
}

Expand Down
14 changes: 4 additions & 10 deletions tools/lib/bpf/libbpf.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
2 changes: 1 addition & 1 deletion tools/lib/bpf/test_libbpf.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
32 changes: 12 additions & 20 deletions tools/perf/util/bpf-loader.c
Original file line number Diff line number Diff line change
Expand Up @@ -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_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;
Expand All @@ -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;
}

Expand All @@ -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;
}

Expand Down
7 changes: 4 additions & 3 deletions tools/testing/selftests/bpf/test_btf.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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();
Expand Down
36 changes: 17 additions & 19 deletions tools/testing/selftests/bpf/test_libbpf_open.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down
20 changes: 18 additions & 2 deletions tools/testing/selftests/bpf/test_progs.c
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
#include <string.h>
#include <assert.h>
#include <stdlib.h>
#include <stdarg.h>
#include <time.h>

#include <linux/types.h>
Expand Down Expand Up @@ -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";
Expand All @@ -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);
}
Expand Down

0 comments on commit 6f1ae8b

Please sign in to comment.