libbpf: Ensure print callback usage is thread-safe
authorJP Kobryn <inwardvessel@gmail.com>
Sat, 25 Mar 2023 01:08:45 +0000 (18:08 -0700)
committerAndrii Nakryiko <andrii@kernel.org>
Mon, 27 Mar 2023 18:33:43 +0000 (11:33 -0700)
This patch prevents races on the print function pointer, allowing the
libbpf_set_print() function to become thread-safe.

Signed-off-by: JP Kobryn <inwardvessel@gmail.com>
Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
Link: https://lore.kernel.org/bpf/20230325010845.46000-1-inwardvessel@gmail.com
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf.h

index f6a071d..15737d7 100644 (file)
@@ -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;
index 1615e55..0b73623 100644 (file)
@@ -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);