const char *cg_sysctl[] = {
                "./test_sysctl_loop1.o", "./test_sysctl_loop2.o",
        };
+       libbpf_print_fn_t old_print_fn = NULL;
        int err, i;
 
        if (verifier_stats)
-               libbpf_set_print(libbpf_debug_print);
+               old_print_fn = libbpf_set_print(libbpf_debug_print);
 
        err = check_load("./loop3.o", BPF_PROG_TYPE_RAW_TRACEPOINT);
        printf("test_scale:loop3:%s\n", err ? (error_cnt--, "OK") : "FAIL");
 
        err = check_load("./test_seg6_loop.o", BPF_PROG_TYPE_LWT_SEG6LOCAL);
        printf("test_scale:test_seg6_loop:%s\n", err ? "FAIL" : "OK");
+
+       if (verifier_stats)
+               libbpf_set_print(old_print_fn);
 }
 
 // SPDX-License-Identifier: GPL-2.0
 #include <test_progs.h>
 
-static int libbpf_debug_print(enum libbpf_print_level level,
-                             const char *format, va_list args)
-{
-       if (level == LIBBPF_DEBUG)
-               return 0;
-
-       return vfprintf(stderr, format, args);
-}
-
 void test_reference_tracking(void)
 {
        const char *file = "./test_sk_lookup_kern.o";
 
                /* Expect verifier failure if test name has 'fail' */
                if (strstr(title, "fail") != NULL) {
-                       libbpf_set_print(NULL);
+                       libbpf_print_fn_t old_print_fn;
+
+                       old_print_fn = libbpf_set_print(NULL);
                        err = !bpf_program__load(prog, "GPL", 0);
-                       libbpf_set_print(libbpf_debug_print);
+                       libbpf_set_print(old_print_fn);
                } else {
                        err = bpf_program__load(prog, "GPL", 0);
                }
 
        ARG_TEST_NUM = 'n',
        ARG_TEST_NAME = 't',
        ARG_VERIFIER_STATS = 's',
+
+       ARG_VERBOSE = 'v',
 };
        
 static const struct argp_option opts[] = {
          "Run tests with names containing NAME" },
        { "verifier-stats", ARG_VERIFIER_STATS, NULL, 0,
          "Output verifier statistics", },
+       { "verbose", ARG_VERBOSE, "LEVEL", OPTION_ARG_OPTIONAL,
+         "Verbose output (use -vv for extra verbose output)" },
        {},
 };
 
        int test_num_selector;
        const char *test_name_selector;
        bool verifier_stats;
+       bool verbose;
+       bool very_verbose;
 };
 
 static struct test_env env = {
        .test_num_selector = -1,
 };
 
+static int libbpf_print_fn(enum libbpf_print_level level,
+                          const char *format, va_list args)
+{
+       if (!env.very_verbose && level == LIBBPF_DEBUG)
+               return 0;
+       return vfprintf(stderr, format, args);
+}
+
 static error_t parse_arg(int key, char *arg, struct argp_state *state)
 {
        struct test_env *env = state->input;
        case ARG_VERIFIER_STATS:
                env->verifier_stats = true;
                break;
+       case ARG_VERBOSE:
+               if (arg) {
+                       if (strcmp(arg, "v") == 0) {
+                               env->very_verbose = true;
+                       } else {
+                               fprintf(stderr,
+                                       "Unrecognized verbosity setting ('%s'), only -v and -vv are supported\n",
+                                       arg);
+                               return -EINVAL;
+                       }
+               }
+               env->verbose = true;
+               break;
        case ARGP_KEY_ARG:
                argp_usage(state);
                break;
        if (err)
                return err;
 
+       libbpf_set_print(libbpf_print_fn);
+
        srand(time(NULL));
 
        jit_enabled = is_jit_enabled();