Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Actually enable the global memory barriers if supported by the OS. Because only recent versions of Linux include the support, they are disabled by default. Note that it also has to be disabled for QEMU to run under Wine. Before this patch, rcutorture reports 85 ns/read for my machine, after the patch it reports 12.5 ns/read. On the other hand updates go from 50 *micro*seconds to 20 *milli*seconds. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
- Loading branch information
Showing
4 changed files
with
102 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
/* | ||
* Process-global memory barriers | ||
* | ||
* Copyright (c) 2018 Red Hat, Inc. | ||
* | ||
* Author: Paolo Bonzini <pbonzini@redhat.com> | ||
*/ | ||
|
||
#include <qemu/osdep.h> | ||
#include <qemu/sys_membarrier.h> | ||
#include <qemu/error-report.h> | ||
|
||
#ifdef CONFIG_LINUX | ||
#include <linux/membarrier.h> | ||
#include <sys/syscall.h> | ||
|
||
static int | ||
membarrier(int cmd, int flags) | ||
{ | ||
return syscall(__NR_membarrier, cmd, flags); | ||
} | ||
#endif | ||
|
||
void smp_mb_global(void) | ||
{ | ||
#if defined CONFIG_WIN32 | ||
FlushProcessWriteBuffers(); | ||
#elif defined CONFIG_LINUX | ||
membarrier(MEMBARRIER_CMD_SHARED, 0); | ||
#else | ||
#error --enable-membarrier is not supported on this operating system. | ||
#endif | ||
} | ||
|
||
void smp_mb_global_init(void) | ||
{ | ||
#ifdef CONFIG_LINUX | ||
int ret = membarrier(MEMBARRIER_CMD_QUERY, 0); | ||
if (ret < 0) { | ||
error_report("This QEMU binary requires the membarrier system call."); | ||
error_report("Please upgrade your system to a newer version of Linux"); | ||
exit(1); | ||
} | ||
if (!(ret & MEMBARRIER_CMD_SHARED)) { | ||
error_report("This QEMU binary requires MEMBARRIER_CMD_SHARED support."); | ||
error_report("Please upgrade your system to a newer version of Linux"); | ||
exit(1); | ||
} | ||
#endif | ||
} |