From ae32d7169ddbcc79a7cb3cabf202d7170bf6fd0b Mon Sep 17 00:00:00 2001 From: JP Kobryn Date: Fri, 24 Mar 2023 18:08:45 -0700 Subject: [PATCH] libbpf: Ensure print callback usage is thread-safe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This patch prevents races on the print function pointer, allowing the libbpf_set_print() function to become thread-safe. Signed-off-by: JP Kobryn Signed-off-by: Andrii Nakryiko Link: https://lore.kernel.org/bpf/20230325010845.46000-1-inwardvessel@gmail.com Signed-off-by: Daniel Müller --- src/libbpf.c | 9 ++++++--- src/libbpf.h | 2 ++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/libbpf.c b/src/libbpf.c index f6a071d..15737d7 100644 --- a/src/libbpf.c +++ b/src/libbpf.c @@ -216,9 +216,10 @@ static libbpf_print_fn_t __libbpf_pr = __base_pr; libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn) { - libbpf_print_fn_t old_print_fn = __libbpf_pr; + libbpf_print_fn_t old_print_fn; + + old_print_fn = __atomic_exchange_n(&__libbpf_pr, fn, __ATOMIC_RELAXED); - __libbpf_pr = fn; return old_print_fn; } @@ -227,8 +228,10 @@ void libbpf_print(enum libbpf_print_level level, const char *format, ...) { va_list args; int old_errno; + libbpf_print_fn_t print_fn; - if (!__libbpf_pr) + print_fn = __atomic_load_n(&__libbpf_pr, __ATOMIC_RELAXED); + if (!print_fn) return; old_errno = errno; diff --git a/src/libbpf.h b/src/libbpf.h index 1615e55..0b73623 100644 --- a/src/libbpf.h +++ b/src/libbpf.h @@ -101,6 +101,8 @@ typedef int (*libbpf_print_fn_t)(enum libbpf_print_level level, * be used for libbpf warnings and informational messages. * @param fn The log print function. If NULL, libbpf won't print anything. * @return Pointer to old print function. + * + * This function is thread-safe. */ LIBBPF_API libbpf_print_fn_t libbpf_set_print(libbpf_print_fn_t fn);