comparison src/os_cpu/solaris_x86/vm/orderAccess_solaris_x86.inline.hpp @ 1711:a6bff45449bc

6973570: OrderAccess::storestore() scales poorly on multi-socket x64 and sparc: cache-line ping-ponging Summary: volatile store to static variable removed in favour of a volatile store to stack to avoid excessive cache coherency traffic; verified that the volatile store is not elided by any of our current compilers. Reviewed-by: dholmes, dice, jcoomes, kvn
author ysr
date Tue, 10 Aug 2010 14:53:35 -0700
parents c18cbe5936b8
children f95d63e2154a
comparison
equal deleted inserted replaced
1710:94251661de76 1711:a6bff45449bc
1 /* 1 /*
2 * Copyright (c) 2003, 2009, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 2003, 2010, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
38 _OrderAccess_acquire(); 38 _OrderAccess_acquire();
39 39
40 } 40 }
41 41
42 inline void OrderAccess::release() { 42 inline void OrderAccess::release() {
43 dummy = 0; 43 // Avoid hitting the same cache-line from
44 // different threads.
45 volatile jint local_dummy = 0;
44 } 46 }
45 47
46 inline void OrderAccess::fence() { 48 inline void OrderAccess::fence() {
47 if (os::is_MP()) { 49 if (os::is_MP()) {
48 _OrderAccess_fence(); 50 _OrderAccess_fence();
51 53
52 #ifdef _GNU_SOURCE 54 #ifdef _GNU_SOURCE
53 55
54 extern "C" { 56 extern "C" {
55 inline void _OrderAccess_acquire() { 57 inline void _OrderAccess_acquire() {
56 volatile intptr_t dummy; 58 volatile intptr_t local_dummy;
57 #ifdef AMD64 59 #ifdef AMD64
58 __asm__ volatile ("movq 0(%%rsp), %0" : "=r" (dummy) : : "memory"); 60 __asm__ volatile ("movq 0(%%rsp), %0" : "=r" (local_dummy) : : "memory");
59 #else 61 #else
60 __asm__ volatile ("movl 0(%%esp),%0" : "=r" (dummy) : : "memory"); 62 __asm__ volatile ("movl 0(%%esp),%0" : "=r" (local_dummy) : : "memory");
61 #endif // AMD64 63 #endif // AMD64
62 } 64 }
63 inline void _OrderAccess_fence() { 65 inline void _OrderAccess_fence() {
64 // Always use locked addl since mfence is sometimes expensive 66 // Always use locked addl since mfence is sometimes expensive
65 __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory"); 67 __asm__ volatile ("lock; addl $0,0(%%esp)" : : : "cc", "memory");