public inbox for linux-arch@vger.kernel.org
 help / color / mirror / Atom feed
  • * [RFC PATCH for 4.16 03/11] powerpc: membarrier: Skip memory barrier in switch_mm() (v7)
           [not found] <20171222201536.29809-1-mathieu.desnoyers@efficios.com>
           [not found] ` <20171222201536.29809-1-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
    @ 2017-12-22 20:15 ` Mathieu Desnoyers
      2017-12-22 20:15   ` Mathieu Desnoyers
      2017-12-22 20:15 ` [RFC PATCH for 4.16 06/11] membarrier: selftest: Test shared expedited cmd Mathieu Desnoyers
                       ` (2 subsequent siblings)
      4 siblings, 1 reply; 16+ messages in thread
    From: Mathieu Desnoyers @ 2017-12-22 20:15 UTC (permalink / raw)
      To: Will Deacon, Peter Zijlstra, Andy Lutomirski, Paul E . McKenney
      Cc: Maged Michael, Dave Watson, Russell King, David Sehr,
    	Paul Mackerras, H . Peter Anvin, linux-arch, x86, Andrew Hunter,
    	Greg Hackmann, Ingo Molnar, Alan Stern, Andrea Parri, Avi Kivity,
    	Boqun Feng, linuxppc-dev, Nicholas Piggin, Mathieu Desnoyers,
    	Alexander Viro, Thomas Gleixner, linux-api, linux-kernel,
    	Linus Torvalds
    
    Allow PowerPC to skip the full memory barrier in switch_mm(), and
    only issue the barrier when scheduling into a task belonging to a
    process that has registered to use expedited private.
    
    Threads targeting the same VM but which belong to different thread
    groups is a tricky case. It has a few consequences:
    
    It turns out that we cannot rely on get_nr_threads(p) to count the
    number of threads using a VM. We can use
    (atomic_read(&mm->mm_users) == 1 && get_nr_threads(p) == 1)
    instead to skip the synchronize_sched() for cases where the VM only has
    a single user, and that user only has a single thread.
    
    It also turns out that we cannot use for_each_thread() to set
    thread flags in all threads using a VM, as it only iterates on the
    thread group.
    
    Therefore, test the membarrier state variable directly rather than
    relying on thread flags. This means
    membarrier_register_private_expedited() needs to set the
    MEMBARRIER_STATE_PRIVATE_EXPEDITED flag, issue synchronize_sched(), and
    only then set MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY which allows
    private expedited membarrier commands to succeed.
    membarrier_arch_switch_mm() now tests for the
    MEMBARRIER_STATE_PRIVATE_EXPEDITED flag.
    
    Changes since v1:
    - Use test_ti_thread_flag(next, ...) instead of test_thread_flag() in
      powerpc membarrier_arch_sched_in(), given that we want to specifically
      check the next thread state.
    - Add missing ARCH_HAS_MEMBARRIER_HOOKS in Kconfig.
    - Use task_thread_info() to pass thread_info from task to
      *_ti_thread_flag().
    
    Changes since v2:
    - Move membarrier_arch_sched_in() call to finish_task_switch().
    - Check for NULL t->mm in membarrier_arch_fork().
    - Use membarrier_sched_in() in generic code, which invokes the
      arch-specific membarrier_arch_sched_in(). This fixes allnoconfig
      build on PowerPC.
    - Move asm/membarrier.h include under CONFIG_MEMBARRIER, fixing
      allnoconfig build on PowerPC.
    - Build and runtime tested on PowerPC.
    
    Changes since v3:
    - Simply rely on copy_mm() to copy the membarrier_private_expedited mm
      field on fork.
    - powerpc: test thread flag instead of reading
      membarrier_private_expedited in membarrier_arch_fork().
    - powerpc: skip memory barrier in membarrier_arch_sched_in() if coming
      from kernel thread, since mmdrop() implies a full barrier.
    - Set membarrier_private_expedited to 1 only after arch registration
      code, thus eliminating a race where concurrent commands could succeed
      when they should fail if issued concurrently with process
      registration.
    - Use READ_ONCE() for membarrier_private_expedited field access in
      membarrier_private_expedited. Matches WRITE_ONCE() performed in
      process registration.
    
    Changes since v4:
    - Move powerpc hook from sched_in() to switch_mm(), based on feedback
      from Nicholas Piggin.
    
    Changes since v5:
    - Rebase on v4.14-rc6.
    - Fold "Fix: membarrier: Handle CLONE_VM + !CLONE_THREAD correctly on
      powerpc (v2)"
    
    Changes since v6:
    - Rename MEMBARRIER_STATE_SWITCH_MM to MEMBARRIER_STATE_PRIVATE_EXPEDITED.
    
    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    CC: Peter Zijlstra <peterz@infradead.org>
    CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    CC: Boqun Feng <boqun.feng@gmail.com>
    CC: Andrew Hunter <ahh@google.com>
    CC: Maged Michael <maged.michael@gmail.com>
    CC: Avi Kivity <avi@scylladb.com>
    CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    CC: Paul Mackerras <paulus@samba.org>
    CC: Michael Ellerman <mpe@ellerman.id.au>
    CC: Dave Watson <davejwatson@fb.com>
    CC: Alan Stern <stern@rowland.harvard.edu>
    CC: Will Deacon <will.deacon@arm.com>
    CC: Andy Lutomirski <luto@kernel.org>
    CC: Ingo Molnar <mingo@redhat.com>
    CC: Alexander Viro <viro@zeniv.linux.org.uk>
    CC: Nicholas Piggin <npiggin@gmail.com>
    CC: linuxppc-dev@lists.ozlabs.org
    CC: linux-arch@vger.kernel.org
    ---
     MAINTAINERS                           |  1 +
     arch/powerpc/Kconfig                  |  1 +
     arch/powerpc/include/asm/membarrier.h | 26 ++++++++++++++++++++++++++
     arch/powerpc/mm/mmu_context.c         |  7 +++++++
     include/linux/sched/mm.h              | 13 ++++++++++++-
     init/Kconfig                          |  3 +++
     kernel/sched/core.c                   | 10 ----------
     kernel/sched/membarrier.c             |  8 ++++++++
     8 files changed, 58 insertions(+), 11 deletions(-)
     create mode 100644 arch/powerpc/include/asm/membarrier.h
    
    diff --git a/MAINTAINERS b/MAINTAINERS
    index a6e86e20761e..bd1666217c73 100644
    --- a/MAINTAINERS
    +++ b/MAINTAINERS
    @@ -8934,6 +8934,7 @@ L:	linux-kernel@vger.kernel.org
     S:	Supported
     F:	kernel/sched/membarrier.c
     F:	include/uapi/linux/membarrier.h
    +F:	arch/powerpc/include/asm/membarrier.h
     
     MEMORY MANAGEMENT
     L:	linux-mm@kvack.org
    diff --git a/arch/powerpc/Kconfig b/arch/powerpc/Kconfig
    index c51e6ce42e7a..a63adb082c0a 100644
    --- a/arch/powerpc/Kconfig
    +++ b/arch/powerpc/Kconfig
    @@ -140,6 +140,7 @@ config PPC
     	select ARCH_HAS_FORTIFY_SOURCE
     	select ARCH_HAS_GCOV_PROFILE_ALL
     	select ARCH_HAS_PMEM_API                if PPC64
    +	select ARCH_HAS_MEMBARRIER_HOOKS
     	select ARCH_HAS_SCALED_CPUTIME		if VIRT_CPU_ACCOUNTING_NATIVE
     	select ARCH_HAS_SG_CHAIN
     	select ARCH_HAS_TICK_BROADCAST		if GENERIC_CLOCKEVENTS_BROADCAST
    diff --git a/arch/powerpc/include/asm/membarrier.h b/arch/powerpc/include/asm/membarrier.h
    new file mode 100644
    index 000000000000..98ff4f1fcf2b
    --- /dev/null
    +++ b/arch/powerpc/include/asm/membarrier.h
    @@ -0,0 +1,26 @@
    +#ifndef _ASM_POWERPC_MEMBARRIER_H
    +#define _ASM_POWERPC_MEMBARRIER_H
    +
    +static inline void membarrier_arch_switch_mm(struct mm_struct *prev,
    +					     struct mm_struct *next,
    +					     struct task_struct *tsk)
    +{
    +	/*
    +	 * Only need the full barrier when switching between processes.
    +	 * Barrier when switching from kernel to userspace is not
    +	 * required here, given that it is implied by mmdrop(). Barrier
    +	 * when switching from userspace to kernel is not needed after
    +	 * store to rq->curr.
    +	 */
    +	if (likely(!(atomic_read(&next->membarrier_state) &
    +		     MEMBARRIER_STATE_PRIVATE_EXPEDITED) || !prev))
    +		return;
    +
    +	/*
    +	 * The membarrier system call requires a full memory barrier
    +	 * after storing to rq->curr, before going back to user-space.
    +	 */
    +	smp_mb();
    +}
    +
    +#endif /* _ASM_POWERPC_MEMBARRIER_H */
    diff --git a/arch/powerpc/mm/mmu_context.c b/arch/powerpc/mm/mmu_context.c
    index d60a62bf4fc7..0ab297c4cfad 100644
    --- a/arch/powerpc/mm/mmu_context.c
    +++ b/arch/powerpc/mm/mmu_context.c
    @@ -12,6 +12,7 @@
     
     #include <linux/mm.h>
     #include <linux/cpu.h>
    +#include <linux/sched/mm.h>
     
     #include <asm/mmu_context.h>
     
    @@ -58,6 +59,10 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
     		 *
     		 * On the read side the barrier is in pte_xchg(), which orders
     		 * the store to the PTE vs the load of mm_cpumask.
    +		 *
    +		 * This full barrier is needed by membarrier when switching
    +		 * between processes after store to rq->curr, before user-space
    +		 * memory accesses.
     		 */
     		smp_mb();
     
    @@ -80,6 +85,8 @@ void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
     
     	if (new_on_cpu)
     		radix_kvm_prefetch_workaround(next);
    +	else
    +		membarrier_arch_switch_mm(prev, next, tsk);
     
     	/*
     	 * The actual HW switching method differs between the various
    diff --git a/include/linux/sched/mm.h b/include/linux/sched/mm.h
    index 3d49b91b674d..1754396795f6 100644
    --- a/include/linux/sched/mm.h
    +++ b/include/linux/sched/mm.h
    @@ -215,14 +215,25 @@ static inline void memalloc_noreclaim_restore(unsigned int flags)
     #ifdef CONFIG_MEMBARRIER
     enum {
     	MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY	= (1U << 0),
    -	MEMBARRIER_STATE_SWITCH_MM			= (1U << 1),
    +	MEMBARRIER_STATE_PRIVATE_EXPEDITED		= (1U << 1),
     };
     
    +#ifdef CONFIG_ARCH_HAS_MEMBARRIER_HOOKS
    +#include <asm/membarrier.h>
    +#endif
    +
     static inline void membarrier_execve(struct task_struct *t)
     {
     	atomic_set(&t->mm->membarrier_state, 0);
     }
     #else
    +#ifdef CONFIG_ARCH_HAS_MEMBARRIER_HOOKS
    +static inline void membarrier_arch_switch_mm(struct mm_struct *prev,
    +					     struct mm_struct *next,
    +					     struct task_struct *tsk)
    +{
    +}
    +#endif
     static inline void membarrier_execve(struct task_struct *t)
     {
     }
    diff --git a/init/Kconfig b/init/Kconfig
    index 2934249fba46..dbf2d85ba67d 100644
    --- a/init/Kconfig
    +++ b/init/Kconfig
    @@ -1400,6 +1400,9 @@ config USERFAULTFD
     	  Enable the userfaultfd() system call that allows to intercept and
     	  handle page faults in userland.
     
    +config ARCH_HAS_MEMBARRIER_HOOKS
    +	bool
    +
     config EMBEDDED
     	bool "Embedded system"
     	option allnoconfig_y
    diff --git a/kernel/sched/core.c b/kernel/sched/core.c
    index 644fa2e3d993..524b705892db 100644
    --- a/kernel/sched/core.c
    +++ b/kernel/sched/core.c
    @@ -2653,16 +2653,6 @@ static struct rq *finish_task_switch(struct task_struct *prev)
     	prev_state = prev->state;
     	vtime_task_switch(prev);
     	perf_event_task_sched_in(prev, current);
    -	/*
    -	 * The membarrier system call requires a full memory barrier
    -	 * after storing to rq->curr, before going back to user-space.
    -	 *
    -	 * TODO: This smp_mb__after_unlock_lock can go away if PPC end
    -	 * up adding a full barrier to switch_mm(), or we should figure
    -	 * out if a smp_mb__after_unlock_lock is really the proper API
    -	 * to use.
    -	 */
    -	smp_mb__after_unlock_lock();
     	finish_lock_switch(rq, prev);
     	finish_arch_post_lock_switch();
     
    diff --git a/kernel/sched/membarrier.c b/kernel/sched/membarrier.c
    index 9bcbacba82a8..678577267a9a 100644
    --- a/kernel/sched/membarrier.c
    +++ b/kernel/sched/membarrier.c
    @@ -118,6 +118,14 @@ static void membarrier_register_private_expedited(void)
     	if (atomic_read(&mm->membarrier_state)
     			& MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY)
     		return;
    +	atomic_or(MEMBARRIER_STATE_PRIVATE_EXPEDITED, &mm->membarrier_state);
    +	if (!(atomic_read(&mm->mm_users) == 1 && get_nr_threads(p) == 1)) {
    +		/*
    +		 * Ensure all future scheduler executions will observe the
    +		 * new thread flag state for this process.
    +		 */
    +		synchronize_sched();
    +	}
     	atomic_or(MEMBARRIER_STATE_PRIVATE_EXPEDITED_READY,
     			&mm->membarrier_state);
     }
    -- 
    2.11.0
    
    ^ permalink raw reply related	[flat|nested] 16+ messages in thread
  • * [RFC PATCH for 4.16 06/11] membarrier: selftest: Test shared expedited cmd
           [not found] <20171222201536.29809-1-mathieu.desnoyers@efficios.com>
           [not found] ` <20171222201536.29809-1-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
      2017-12-22 20:15 ` [RFC PATCH for 4.16 03/11] powerpc: membarrier: Skip memory barrier in switch_mm() (v7) Mathieu Desnoyers
    @ 2017-12-22 20:15 ` Mathieu Desnoyers
      2017-12-22 20:15   ` Mathieu Desnoyers
      2017-12-22 20:15 ` [RFC PATCH for 4.16 08/11] x86: Introduce sync_core_before_usermode (v2) Mathieu Desnoyers
      2017-12-22 20:15 ` [RFC PATCH for 4.16 10/11] membarrier: arm64: Provide core serializing command Mathieu Desnoyers
      4 siblings, 1 reply; 16+ messages in thread
    From: Mathieu Desnoyers @ 2017-12-22 20:15 UTC (permalink / raw)
      To: Will Deacon, Peter Zijlstra, Andy Lutomirski, Paul E . McKenney
      Cc: linux-kernel, linux-api, Boqun Feng, Andrew Hunter, Maged Michael,
    	Avi Kivity, Benjamin Herrenschmidt, Paul Mackerras,
    	Michael Ellerman, Dave Watson, Thomas Gleixner, Ingo Molnar,
    	H . Peter Anvin, Andrea Parri, Russell King, Greg Hackmann,
    	David Sehr, Linus Torvalds, x86, Mathieu Desnoyers,
    	Greg Kroah-Hartman
    
    Test the new MEMBARRIER_CMD_SHARED_EXPEDITED and
    MEMBARRIER_CMD_REGISTER_SHARED_EXPEDITED commands.
    
    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    Acked-by: Shuah Khan <shuahkh@osg.samsung.com>
    CC: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    CC: Peter Zijlstra <peterz@infradead.org>
    CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    CC: Boqun Feng <boqun.feng@gmail.com>
    CC: Andrew Hunter <ahh@google.com>
    CC: Maged Michael <maged.michael@gmail.com>
    CC: Avi Kivity <avi@scylladb.com>
    CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    CC: Paul Mackerras <paulus@samba.org>
    CC: Michael Ellerman <mpe@ellerman.id.au>
    CC: Dave Watson <davejwatson@fb.com>
    CC: Alan Stern <stern@rowland.harvard.edu>
    CC: Will Deacon <will.deacon@arm.com>
    CC: Andy Lutomirski <luto@kernel.org>
    CC: Alice Ferrazzi <alice.ferrazzi@gmail.com>
    CC: Paul Elder <paul.elder@pitt.edu>
    CC: linux-kselftest@vger.kernel.org
    CC: linux-arch@vger.kernel.org
    ---
     .../testing/selftests/membarrier/membarrier_test.c | 51 +++++++++++++++++++++-
     1 file changed, 50 insertions(+), 1 deletion(-)
    
    diff --git a/tools/testing/selftests/membarrier/membarrier_test.c b/tools/testing/selftests/membarrier/membarrier_test.c
    index e6ee73d01fa1..bb9c58072c5c 100644
    --- a/tools/testing/selftests/membarrier/membarrier_test.c
    +++ b/tools/testing/selftests/membarrier/membarrier_test.c
    @@ -132,6 +132,40 @@ static int test_membarrier_private_expedited_success(void)
     	return 0;
     }
     
    +static int test_membarrier_register_shared_expedited_success(void)
    +{
    +	int cmd = MEMBARRIER_CMD_REGISTER_SHARED_EXPEDITED, flags = 0;
    +	const char *test_name = "sys membarrier MEMBARRIER_CMD_REGISTER_SHARED_EXPEDITED";
    +
    +	if (sys_membarrier(cmd, flags) != 0) {
    +		ksft_exit_fail_msg(
    +			"%s test: flags = %d, errno = %d\n",
    +			test_name, flags, errno);
    +	}
    +
    +	ksft_test_result_pass(
    +		"%s test: flags = %d\n",
    +		test_name, flags);
    +	return 0;
    +}
    +
    +static int test_membarrier_shared_expedited_success(void)
    +{
    +	int cmd = MEMBARRIER_CMD_SHARED_EXPEDITED, flags = 0;
    +	const char *test_name = "sys membarrier MEMBARRIER_CMD_SHARED_EXPEDITED";
    +
    +	if (sys_membarrier(cmd, flags) != 0) {
    +		ksft_exit_fail_msg(
    +			"%s test: flags = %d, errno = %d\n",
    +			test_name, flags, errno);
    +	}
    +
    +	ksft_test_result_pass(
    +		"%s test: flags = %d\n",
    +		test_name, flags);
    +	return 0;
    +}
    +
     static int test_membarrier(void)
     {
     	int status;
    @@ -154,6 +188,19 @@ static int test_membarrier(void)
     	status = test_membarrier_private_expedited_success();
     	if (status)
     		return status;
    +	/*
    +	 * It is valid to send a shared membarrier from a non-registered
    +	 * process.
    +	 */
    +	status = test_membarrier_shared_expedited_success();
    +	if (status)
    +		return status;
    +	status = test_membarrier_register_shared_expedited_success();
    +	if (status)
    +		return status;
    +	status = test_membarrier_shared_expedited_success();
    +	if (status)
    +		return status;
     	return 0;
     }
     
    @@ -173,8 +220,10 @@ static int test_membarrier_query(void)
     		}
     		ksft_exit_fail_msg("sys_membarrier() failed\n");
     	}
    -	if (!(ret & MEMBARRIER_CMD_SHARED))
    +	if (!(ret & MEMBARRIER_CMD_SHARED)) {
    +		ksft_test_result_fail("sys_membarrier() CMD_SHARED query failed\n");
     		ksft_exit_fail_msg("sys_membarrier is not supported.\n");
    +	}
     
     	ksft_test_result_pass("sys_membarrier available\n");
     	return 0;
    -- 
    2.11.0
    
    ^ permalink raw reply related	[flat|nested] 16+ messages in thread
  • * [RFC PATCH for 4.16 08/11] x86: Introduce sync_core_before_usermode (v2)
           [not found] <20171222201536.29809-1-mathieu.desnoyers@efficios.com>
                       ` (2 preceding siblings ...)
      2017-12-22 20:15 ` [RFC PATCH for 4.16 06/11] membarrier: selftest: Test shared expedited cmd Mathieu Desnoyers
    @ 2017-12-22 20:15 ` Mathieu Desnoyers
      2017-12-22 20:15   ` Mathieu Desnoyers
      2017-12-22 20:15 ` [RFC PATCH for 4.16 10/11] membarrier: arm64: Provide core serializing command Mathieu Desnoyers
      4 siblings, 1 reply; 16+ messages in thread
    From: Mathieu Desnoyers @ 2017-12-22 20:15 UTC (permalink / raw)
      To: Will Deacon, Peter Zijlstra, Andy Lutomirski, Paul E . McKenney
      Cc: linux-kernel, linux-api, Boqun Feng, Andrew Hunter, Maged Michael,
    	Avi Kivity, Benjamin Herrenschmidt, Paul Mackerras,
    	Michael Ellerman, Dave Watson, Thomas Gleixner, Ingo Molnar,
    	H . Peter Anvin, Andrea Parri, Russell King, Greg Hackmann,
    	David Sehr, Linus Torvalds, x86, Mathieu Desnoyers, linux-arch
    
    Introduce an architecture function that ensures the current CPU
    issues a core serializing instruction before returning to usermode.
    
    This is needed for the membarrier "sync_core" command.
    
    Architectures defining the sync_core_before_usermode() static inline
    need to select ARCH_HAS_SYNC_CORE_BEFORE_USERMODE.
    
    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    CC: Peter Zijlstra <peterz@infradead.org>
    CC: Andy Lutomirski <luto@kernel.org>
    CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    CC: Boqun Feng <boqun.feng@gmail.com>
    CC: Andrew Hunter <ahh@google.com>
    CC: Maged Michael <maged.michael@gmail.com>
    CC: Avi Kivity <avi@scylladb.com>
    CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    CC: Paul Mackerras <paulus@samba.org>
    CC: Michael Ellerman <mpe@ellerman.id.au>
    CC: Dave Watson <davejwatson@fb.com>
    CC: Thomas Gleixner <tglx@linutronix.de>
    CC: Ingo Molnar <mingo@redhat.com>
    CC: "H. Peter Anvin" <hpa@zytor.com>
    CC: Andrea Parri <parri.andrea@gmail.com>
    CC: Russell King <linux@armlinux.org.uk>
    CC: Greg Hackmann <ghackmann@google.com>
    CC: Will Deacon <will.deacon@arm.com>
    CC: David Sehr <sehr@google.com>
    CC: Linus Torvalds <torvalds@linux-foundation.org>
    CC: x86@kernel.org
    CC: linux-arch@vger.kernel.org
    ---
    Changes since v1:
    - Fix prototype of sync_core_before_usermode in generic code (missing
      return type).
    - Add linux/processor.h include to sched/core.c.
    - Add ARCH_HAS_SYNC_CORE_BEFORE_USERMODE to init/Kconfig.
    - Fix linux/processor.h ifdef to target
      CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE rather than
      ARCH_HAS_SYNC_CORE_BEFORE_USERMODE.
    ---
     arch/x86/Kconfig                 |  1 +
     arch/x86/include/asm/processor.h | 10 ++++++++++
     include/linux/processor.h        |  6 ++++++
     init/Kconfig                     |  3 +++
     4 files changed, 20 insertions(+)
    
    diff --git a/arch/x86/Kconfig b/arch/x86/Kconfig
    index 8eed3f94bfc7..fbf05a880603 100644
    --- a/arch/x86/Kconfig
    +++ b/arch/x86/Kconfig
    @@ -62,6 +62,7 @@ config X86
     	select ARCH_HAS_SG_CHAIN
     	select ARCH_HAS_STRICT_KERNEL_RWX
     	select ARCH_HAS_STRICT_MODULE_RWX
    +	select ARCH_HAS_SYNC_CORE_BEFORE_USERMODE
     	select ARCH_HAS_UBSAN_SANITIZE_ALL
     	select ARCH_HAS_ZONE_DEVICE		if X86_64
     	select ARCH_HAVE_NMI_SAFE_CMPXCHG
    diff --git a/arch/x86/include/asm/processor.h b/arch/x86/include/asm/processor.h
    index cc16fa882e3e..6dee02118207 100644
    --- a/arch/x86/include/asm/processor.h
    +++ b/arch/x86/include/asm/processor.h
    @@ -707,6 +707,16 @@ static inline void sync_core(void)
     #endif
     }
     
    +/*
    + * Ensure that a core serializing instruction is issued before returning
    + * to user-mode. x86 implements return to user-space through sysexit,
    + * sysrel, and sysretq, which are not core serializing.
    + */
    +static inline void sync_core_before_usermode(void)
    +{
    +	sync_core();
    +}
    +
     extern void select_idle_routine(const struct cpuinfo_x86 *c);
     extern void amd_e400_c1e_apic_setup(void);
     
    diff --git a/include/linux/processor.h b/include/linux/processor.h
    index dbc952eec869..866de5326d34 100644
    --- a/include/linux/processor.h
    +++ b/include/linux/processor.h
    @@ -68,4 +68,10 @@ do {								\
     
     #endif
     
    +#ifndef CONFIG_ARCH_HAS_SYNC_CORE_BEFORE_USERMODE
    +static inline void sync_core_before_usermode(void)
    +{
    +}
    +#endif
    +
     #endif /* _LINUX_PROCESSOR_H */
    diff --git a/init/Kconfig b/init/Kconfig
    index 92b4a07aa56d..178659a91090 100644
    --- a/init/Kconfig
    +++ b/init/Kconfig
    @@ -1909,3 +1909,6 @@ config ASN1
     	  functions to call on what tags.
     
     source "kernel/Kconfig.locks"
    +
    +config ARCH_HAS_SYNC_CORE_BEFORE_USERMODE
    +	bool
    -- 
    2.11.0
    
    ^ permalink raw reply related	[flat|nested] 16+ messages in thread
  • * [RFC PATCH for 4.16 10/11] membarrier: arm64: Provide core serializing command
           [not found] <20171222201536.29809-1-mathieu.desnoyers@efficios.com>
                       ` (3 preceding siblings ...)
      2017-12-22 20:15 ` [RFC PATCH for 4.16 08/11] x86: Introduce sync_core_before_usermode (v2) Mathieu Desnoyers
    @ 2017-12-22 20:15 ` Mathieu Desnoyers
      2017-12-22 20:15   ` Mathieu Desnoyers
      4 siblings, 1 reply; 16+ messages in thread
    From: Mathieu Desnoyers @ 2017-12-22 20:15 UTC (permalink / raw)
      To: Will Deacon, Peter Zijlstra, Andy Lutomirski, Paul E . McKenney
      Cc: linux-kernel, linux-api, Boqun Feng, Andrew Hunter, Maged Michael,
    	Avi Kivity, Benjamin Herrenschmidt, Paul Mackerras,
    	Michael Ellerman, Dave Watson, Thomas Gleixner, Ingo Molnar,
    	H . Peter Anvin, Andrea Parri, Russell King, Greg Hackmann,
    	David Sehr, Linus Torvalds, x86, Mathieu Desnoyers, linux-arch
    
    Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
    CC: Peter Zijlstra <peterz@infradead.org>
    CC: Andy Lutomirski <luto@kernel.org>
    CC: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    CC: Boqun Feng <boqun.feng@gmail.com>
    CC: Andrew Hunter <ahh@google.com>
    CC: Maged Michael <maged.michael@gmail.com>
    CC: Avi Kivity <avi@scylladb.com>
    CC: Benjamin Herrenschmidt <benh@kernel.crashing.org>
    CC: Paul Mackerras <paulus@samba.org>
    CC: Michael Ellerman <mpe@ellerman.id.au>
    CC: Dave Watson <davejwatson@fb.com>
    CC: Thomas Gleixner <tglx@linutronix.de>
    CC: Ingo Molnar <mingo@redhat.com>
    CC: "H. Peter Anvin" <hpa@zytor.com>
    CC: Andrea Parri <parri.andrea@gmail.com>
    CC: Russell King <linux@armlinux.org.uk>
    CC: Greg Hackmann <ghackmann@google.com>
    CC: Will Deacon <will.deacon@arm.com>
    CC: David Sehr <sehr@google.com>
    CC: x86@kernel.org
    CC: linux-arch@vger.kernel.org
    ---
     arch/arm64/Kconfig        | 1 +
     arch/arm64/kernel/entry.S | 4 ++++
     2 files changed, 5 insertions(+)
    
    diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig
    index c9a7e9e1414f..5b0c06d8dbbe 100644
    --- a/arch/arm64/Kconfig
    +++ b/arch/arm64/Kconfig
    @@ -16,6 +16,7 @@ config ARM64
     	select ARCH_HAS_GCOV_PROFILE_ALL
     	select ARCH_HAS_GIGANTIC_PAGE if (MEMORY_ISOLATION && COMPACTION) || CMA
     	select ARCH_HAS_KCOV
    +	select ARCH_HAS_MEMBARRIER_SYNC_CORE
     	select ARCH_HAS_SET_MEMORY
     	select ARCH_HAS_SG_CHAIN
     	select ARCH_HAS_STRICT_KERNEL_RWX
    diff --git a/arch/arm64/kernel/entry.S b/arch/arm64/kernel/entry.S
    index 6d14b8f29b5f..5edde1c2e93e 100644
    --- a/arch/arm64/kernel/entry.S
    +++ b/arch/arm64/kernel/entry.S
    @@ -302,6 +302,10 @@ alternative_else_nop_endif
     	ldp	x28, x29, [sp, #16 * 14]
     	ldr	lr, [sp, #S_LR]
     	add	sp, sp, #S_FRAME_SIZE		// restore sp
    +	/*
    +	 * ARCH_HAS_MEMBARRIER_SYNC_CORE rely on eret context synchronization
    +	 * when returning from IPI handler, and when returning to user-space.
    +	 */
     	eret					// return to kernel
     	.endm
     
    -- 
    2.11.0
    
    ^ permalink raw reply related	[flat|nested] 16+ messages in thread

  • end of thread, other threads:[~2017-12-22 20:16 UTC | newest]
    
    Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <20171222201536.29809-1-mathieu.desnoyers@efficios.com>
         [not found] ` <20171222201536.29809-1-mathieu.desnoyers-vg+e7yoeK/dWk0Htik3J/w@public.gmane.org>
    2017-12-22 20:15   ` [RFC PATCH for 4.16 02/11] membarrier: selftest: Test private expedited cmd (v2) Mathieu Desnoyers
    2017-12-22 20:15     ` Mathieu Desnoyers
    2017-12-22 20:15   ` [RFC PATCH for 4.16 07/11] membarrier: Provide core serializing command Mathieu Desnoyers
    2017-12-22 20:15     ` Mathieu Desnoyers
    2017-12-22 20:15   ` [RFC PATCH for 4.16 09/11] membarrier: x86: Provide core serializing command (v3) Mathieu Desnoyers
    2017-12-22 20:15     ` Mathieu Desnoyers
    2017-12-22 20:15   ` [RFC PATCH for 4.16 11/11] membarrier: selftest: Test private expedited sync core cmd Mathieu Desnoyers
    2017-12-22 20:15     ` Mathieu Desnoyers
    2017-12-22 20:15 ` [RFC PATCH for 4.16 03/11] powerpc: membarrier: Skip memory barrier in switch_mm() (v7) Mathieu Desnoyers
    2017-12-22 20:15   ` Mathieu Desnoyers
    2017-12-22 20:15 ` [RFC PATCH for 4.16 06/11] membarrier: selftest: Test shared expedited cmd Mathieu Desnoyers
    2017-12-22 20:15   ` Mathieu Desnoyers
    2017-12-22 20:15 ` [RFC PATCH for 4.16 08/11] x86: Introduce sync_core_before_usermode (v2) Mathieu Desnoyers
    2017-12-22 20:15   ` Mathieu Desnoyers
    2017-12-22 20:15 ` [RFC PATCH for 4.16 10/11] membarrier: arm64: Provide core serializing command Mathieu Desnoyers
    2017-12-22 20:15   ` Mathieu Desnoyers
    

    This is a public inbox, see mirroring instructions
    for how to clone and mirror all data and code used for this inbox