diff options
Diffstat (limited to 'tools/testing/selftests/bpf/test_progs.c')
| -rw-r--r-- | tools/testing/selftests/bpf/test_progs.c | 13 | 
1 files changed, 12 insertions, 1 deletions
diff --git a/tools/testing/selftests/bpf/test_progs.c b/tools/testing/selftests/bpf/test_progs.c index 7d077d48cadd..6396932b97e2 100644 --- a/tools/testing/selftests/bpf/test_progs.c +++ b/tools/testing/selftests/bpf/test_progs.c @@ -11,6 +11,7 @@  #include <signal.h>  #include <string.h>  #include <execinfo.h> /* backtrace */ +#include <linux/membarrier.h>  #define EXIT_NO_TEST		2  #define EXIT_ERR_SETUP_INFRA	3 @@ -370,8 +371,18 @@ static int delete_module(const char *name, int flags)  	return syscall(__NR_delete_module, name, flags);  } +/* + * Trigger synchronize_rcu() in kernel. + */ +int kern_sync_rcu(void) +{ +	return syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0, 0); +} +  static void unload_bpf_testmod(void)  { +	if (kern_sync_rcu()) +		fprintf(env.stderr, "Failed to trigger kernel-side RCU sync!\n");  	if (delete_module("bpf_testmod", 0)) {  		if (errno == ENOENT) {  			if (env.verbosity > VERBOSE_NONE) @@ -379,7 +390,7 @@ static void unload_bpf_testmod(void)  			return;  		}  		fprintf(env.stderr, "Failed to unload bpf_testmod.ko from kernel: %d\n", -errno); -		exit(1); +		return;  	}  	if (env.verbosity > VERBOSE_NONE)  		fprintf(stdout, "Successfully unloaded bpf_testmod.ko.\n");  | 
