Re: [PATCH v2 22/32] s390: define __smp_xxx
From: Martin Schwidefsky <hidden>
Date: 2016-01-05 14:21:34
Also in:
linux-arm-kernel, linux-mips, linux-s390, linux-sh, linux-um, linuxppc-dev, lkml, sparclinux
On Tue, 5 Jan 2016 15:04:43 +0200 "Michael S. Tsirkin" [off-list ref] wrote:
On Tue, Jan 05, 2016 at 01:08:52PM +0100, Martin Schwidefsky wrote:quoted
On Tue, 5 Jan 2016 11:30:19 +0200 "Michael S. Tsirkin" [off-list ref] wrote:quoted
On Tue, Jan 05, 2016 at 09:13:19AM +0100, Martin Schwidefsky wrote:quoted
On Mon, 4 Jan 2016 22:18:58 +0200 "Michael S. Tsirkin" [off-list ref] wrote:quoted
On Mon, Jan 04, 2016 at 02:45:25PM +0100, Peter Zijlstra wrote:quoted
On Thu, Dec 31, 2015 at 09:08:38PM +0200, Michael S. Tsirkin wrote:quoted
This defines __smp_xxx barriers for s390, for use by virtualization. Some smp_xxx barriers are removed as they are defined correctly by asm-generic/barriers.h Note: smp_mb, smp_rmb and smp_wmb are defined as full barriers unconditionally on this architecture. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> Acked-by: Arnd Bergmann <arnd@arndb.de> --- arch/s390/include/asm/barrier.h | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)diff --git a/arch/s390/include/asm/barrier.h b/arch/s390/include/asm/barrier.h index c358c31..fbd25b2 100644 --- a/arch/s390/include/asm/barrier.h +++ b/arch/s390/include/asm/barrier.h@@ -26,18 +26,21 @@ #define wmb() barrier() #define dma_rmb() mb() #define dma_wmb() mb() -#define smp_mb() mb() -#define smp_rmb() rmb() -#define smp_wmb() wmb() - -#define smp_store_release(p, v) \ +#define __smp_mb() mb() +#define __smp_rmb() rmb() +#define __smp_wmb() wmb() +#define smp_mb() __smp_mb() +#define smp_rmb() __smp_rmb() +#define smp_wmb() __smp_wmb()Why define the smp_*mb() primitives here? Would not the inclusion of asm-generic/barrier.h do this?No because the generic one is a nop on !SMP, this one isn't. Pls note this patch is just reordering code without making functional changes. And at the moment, on s390 smp_xxx barriers are always non empty.The s390 kernel is SMP to 99.99%, we just didn't bother with a non-smp variant for the memory-barriers. If the generic header is used we'd get the non-smp version for free. It will save a small amount of text space for CONFIG_SMP=n.OK, so I'll queue a patch to do this then?Yes please.OK, I'll add a patch on top in v3.
Good, with this addition: Acked-by: Martin Schwidefsky <redacted>
quoted
quoted
Just to make sure: the question would be, are smp_xxx barriers ever used in s390 arch specific code to flush in/out memory accesses for synchronization with the hypervisor? I went over s390 arch code and it seems to me the answer is no (except of course for virtio).Correct. Guest to host communication either uses instructions which imply a memory barrier or QDIO which uses atomics.And atomics imply a barrier on s390, right?
Yes they do.
quoted
quoted
But I also see a lot of weirdness on this architecture.Mostly historical, s390 actually is one of the easiest architectures in regard to memory barriers.quoted
I found these calls: arch/s390/include/asm/bitops.h: smp_mb__before_atomic(); arch/s390/include/asm/bitops.h: smp_mb(); Not used in arch specific code so this is likely OK.This has been introduced with git commit 5402ea6af11dc5a9, the smp_mb and smp_mb__before_atomic are used in clear_bit_unlock and __clear_bit_unlock which are 1:1 copies from the code in include/asm-generic/bitops/lock.h. Only test_and_set_bit_lock differs from the generic implementation.something to keep in mind, but I'd rather not touch bitops at the moment - this patchset is already too big.
With the conversion smp_mb__before_atomic to a barrier() it does the correct thing. I don't think that any chance is necessary. -- blue skies, Martin. "Reality continues to ruin my life." - Calvin.