| From fd9e9b722ea56986be2ae31051a2cd5ea2222581 Mon Sep 17 00:00:00 2001 |
| From: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
| Date: Thu, 19 Sep 2019 13:36:59 -0400 |
| Subject: [PATCH] sched/membarrier: Fix private expedited registration check |
| |
| commit fc0d77387cb5ae883fd774fc559e056a8dde024c upstream. |
| |
| Fix a logic flaw in the way membarrier_register_private_expedited() |
| handles ready state checks for private expedited sync core and private |
| expedited registrations. |
| |
| If a private expedited membarrier registration is first performed, and |
| then a private expedited sync_core registration is performed, the ready |
| state check will skip the second registration when it really should not. |
| |
| Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Chris Metcalf <cmetcalf@ezchip.com> |
| Cc: Christoph Lameter <cl@linux.com> |
| Cc: Eric W. Biederman <ebiederm@xmission.com> |
| Cc: Kirill Tkhai <tkhai@yandex.ru> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Mike Galbraith <efault@gmx.de> |
| Cc: Oleg Nesterov <oleg@redhat.com> |
| Cc: Paul E. McKenney <paulmck@linux.ibm.com> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Russell King - ARM Linux admin <linux@armlinux.org.uk> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Link: https://lkml.kernel.org/r/20190919173705.2181-2-mathieu.desnoyers@efficios.com |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c |
| index aa8d75804108..5110d91b1b0e 100644 |
| --- a/kernel/sched/membarrier.c |
| +++ b/kernel/sched/membarrier.c |
| @@ -226,7 +226,7 @@ static int membarrier_register_private_expedited(int flags) |
| * groups, which use the same mm. (CLONE_VM but not |
| * CLONE_THREAD). |
| */ |
| - if (atomic_read(&mm->membarrier_state) & state) |
| + if ((atomic_read(&mm->membarrier_state) & state) == state) |
| return 0; |
| atomic_or(MEMBARRIER_STATE_PRIVATE_EXPEDITED, &mm->membarrier_state); |
| if (flags & MEMBARRIER_FLAG_SYNC_CORE) |
| -- |
| 2.7.4 |
| |