diff options
author | Mathieu Desnoyers <mathieu.desnoyers@efficios.com> | 2016-11-03 12:29:28 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-03-12 00:41:45 -0500 |
commit | 3de5a92847c1d87d86ee945e6002f2051e02e868 (patch) | |
tree | 00855b571ffca59e369312ee215a3e87d4aa18dd /kernel | |
parent | 206af3d97f00d5c96de5bfd5a48045d444b3eec4 (diff) |
Fix: Disable sys_membarrier when nohz_full is enabled
commit 907565337ebf998a68cb5c5b2174ce5e5da065eb upstream.
Userspace applications should be allowed to expect the membarrier system
call with MEMBARRIER_CMD_SHARED command to issue memory barriers on
nohz_full CPUs, but synchronize_sched() does not take those into
account.
Given that we do not want unrelated processes to be able to affect
real-time sensitive nohz_full CPUs, simply return ENOSYS when membarrier
is invoked on a kernel with enabled nohz_full CPUs.
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
CC: Josh Triplett <josh@joshtriplett.org>
CC: Steven Rostedt <rostedt@goodmis.org>
Signed-off-by: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Chris Metcalf <cmetcalf@mellanox.com>
Cc: Rik van Riel <riel@redhat.com>
Acked-by: Lai Jiangshan <jiangshanlai@gmail.com>
Reviewed-by: Josh Triplett <josh@joshtriplett.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/membarrier.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/kernel/membarrier.c b/kernel/membarrier.c index 536c727a56e9..9f9284f37f8d 100644 --- a/kernel/membarrier.c +++ b/kernel/membarrier.c | |||
@@ -16,6 +16,7 @@ | |||
16 | 16 | ||
17 | #include <linux/syscalls.h> | 17 | #include <linux/syscalls.h> |
18 | #include <linux/membarrier.h> | 18 | #include <linux/membarrier.h> |
19 | #include <linux/tick.h> | ||
19 | 20 | ||
20 | /* | 21 | /* |
21 | * Bitmask made from a "or" of all commands within enum membarrier_cmd, | 22 | * Bitmask made from a "or" of all commands within enum membarrier_cmd, |
@@ -51,6 +52,9 @@ | |||
51 | */ | 52 | */ |
52 | SYSCALL_DEFINE2(membarrier, int, cmd, int, flags) | 53 | SYSCALL_DEFINE2(membarrier, int, cmd, int, flags) |
53 | { | 54 | { |
55 | /* MEMBARRIER_CMD_SHARED is not compatible with nohz_full. */ | ||
56 | if (tick_nohz_full_enabled()) | ||
57 | return -ENOSYS; | ||
54 | if (unlikely(flags)) | 58 | if (unlikely(flags)) |
55 | return -EINVAL; | 59 | return -EINVAL; |
56 | switch (cmd) { | 60 | switch (cmd) { |