Mercurial > hg > truffle
annotate src/os/linux/vm/os_linux.hpp @ 20338:8d5f66b42c53
8055525: Bigapp weblogic+medrec fails to startup after JDK-8038423
Summary: If large pages are enabled and configured in Linux, the VM always pre-commits the entire space. The VM fails verification of the commit of the initial heap because some internal data structure marked all memory pages of the heap as committed during initialization. This makes the code think that we attempted a double-commit during first allocation of the heap. Remove the initial marking of memory pages of the heap to committed.
Reviewed-by: mgerdin
author | tschatzl |
---|---|
date | Wed, 20 Aug 2014 14:34:40 +0200 |
parents | b0133e4187d3 |
children | bb9356ec5967 833b0f92429a |
rev | line source |
---|---|
0 | 1 /* |
8675
63e54c37ac64
8008959: Fix non-PCH build on Linux, Windows and MacOS X
simonis
parents:
6630
diff
changeset
|
2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
4 * | |
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 | |
7 * published by the Free Software Foundation. | |
8 * | |
9 * This code is distributed in the hope that it will be useful, but WITHOUT | |
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
12 * version 2 for more details (a copy is included in the LICENSE file that | |
13 * accompanied this code). | |
14 * | |
15 * You should have received a copy of the GNU General Public License version | |
16 * 2 along with this work; if not, write to the Free Software Foundation, | |
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
18 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #ifndef OS_LINUX_VM_OS_LINUX_HPP |
26 #define OS_LINUX_VM_OS_LINUX_HPP | |
27 | |
0 | 28 // Linux_OS defines the interface to Linux operating systems |
29 | |
30 /* pthread_getattr_np comes with LinuxThreads-0.9-7 on RedHat 7.1 */ | |
31 typedef int (*pthread_getattr_func_type) (pthread_t, pthread_attr_t *); | |
32 | |
14436
b0133e4187d3
8028471: PPC64 (part 215): opto: Extend ImplicitNullCheck optimization.
goetz
parents:
12211
diff
changeset
|
33 // Information about the protection of the page at address '0' on this os. |
b0133e4187d3
8028471: PPC64 (part 215): opto: Extend ImplicitNullCheck optimization.
goetz
parents:
12211
diff
changeset
|
34 static bool zero_page_read_protected() { return true; } |
b0133e4187d3
8028471: PPC64 (part 215): opto: Extend ImplicitNullCheck optimization.
goetz
parents:
12211
diff
changeset
|
35 |
0 | 36 class Linux { |
37 friend class os; | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
38 friend class TestReserveMemorySpecial; |
0 | 39 |
40 // For signal-chaining | |
41 #define MAXSIGNUM 32 | |
42 static struct sigaction sigact[MAXSIGNUM]; // saved preinstalled sigactions | |
43 static unsigned int sigs; // mask of signals that have | |
44 // preinstalled signal handlers | |
45 static bool libjsig_is_loaded; // libjsig that interposes sigaction(), | |
46 // __sigaction(), signal() is loaded | |
47 static struct sigaction *(*get_signal_action)(int); | |
48 static struct sigaction *get_preinstalled_handler(int); | |
49 static void save_preinstalled_handler(int, struct sigaction&); | |
50 | |
51 static void check_signal_handler(int sig); | |
52 | |
53 // For signal flags diagnostics | |
54 static int sigflags[MAXSIGNUM]; | |
55 | |
56 static int (*_clock_gettime)(clockid_t, struct timespec *); | |
57 static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *); | |
58 | |
59 static address _initial_thread_stack_bottom; | |
60 static uintptr_t _initial_thread_stack_size; | |
61 | |
199
f139919897d2
6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents:
141
diff
changeset
|
62 static const char *_glibc_version; |
f139919897d2
6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents:
141
diff
changeset
|
63 static const char *_libpthread_version; |
0 | 64 |
65 static bool _is_floating_stack; | |
66 static bool _is_NPTL; | |
67 static bool _supports_fast_thread_cpu_time; | |
68 | |
141 | 69 static GrowableArray<int>* _cpu_to_node; |
70 | |
0 | 71 protected: |
72 | |
73 static julong _physical_memory; | |
74 static pthread_t _main_thread; | |
75 static Mutex* _createThread_lock; | |
76 static int _page_size; | |
10164
b4081e9714ec
8013398: Adjust number of stack guard pages on systems with large memory page size
vladidan
parents:
8812
diff
changeset
|
77 static const int _vm_default_page_size; |
0 | 78 |
79 static julong available_memory(); | |
80 static julong physical_memory() { return _physical_memory; } | |
81 static void initialize_system_info(); | |
82 | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10405
diff
changeset
|
83 static int commit_memory_impl(char* addr, size_t bytes, bool exec); |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10405
diff
changeset
|
84 static int commit_memory_impl(char* addr, size_t bytes, |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10405
diff
changeset
|
85 size_t alignment_hint, bool exec); |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10405
diff
changeset
|
86 |
199
f139919897d2
6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents:
141
diff
changeset
|
87 static void set_glibc_version(const char *s) { _glibc_version = s; } |
f139919897d2
6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents:
141
diff
changeset
|
88 static void set_libpthread_version(const char *s) { _libpthread_version = s; } |
0 | 89 |
90 static bool supports_variable_stack_size(); | |
91 | |
92 static void set_is_NPTL() { _is_NPTL = true; } | |
93 static void set_is_LinuxThreads() { _is_NPTL = false; } | |
94 static void set_is_floating_stack() { _is_floating_stack = true; } | |
95 | |
141 | 96 static void rebuild_cpu_to_node_map(); |
97 static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; } | |
3286
139667d9836a
7034464: Support transparent large pages on Linux
iveresov
parents:
1972
diff
changeset
|
98 |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
99 static size_t find_large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
100 static size_t setup_large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
101 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
102 static bool setup_large_page_type(size_t page_size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
103 static bool transparent_huge_pages_sanity_check(bool warn, size_t pages_size); |
3286
139667d9836a
7034464: Support transparent large pages on Linux
iveresov
parents:
1972
diff
changeset
|
104 static bool hugetlbfs_sanity_check(bool warn, size_t page_size); |
139667d9836a
7034464: Support transparent large pages on Linux
iveresov
parents:
1972
diff
changeset
|
105 |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
106 static char* reserve_memory_special_shm(size_t bytes, size_t alignment, char* req_addr, bool exec); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
107 static char* reserve_memory_special_huge_tlbfs(size_t bytes, size_t alignment, char* req_addr, bool exec); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
108 static char* reserve_memory_special_huge_tlbfs_only(size_t bytes, char* req_addr, bool exec); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
109 static char* reserve_memory_special_huge_tlbfs_mixed(size_t bytes, size_t alignment, char* req_addr, bool exec); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
110 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
111 static bool release_memory_special_shm(char* base, size_t bytes); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
112 static bool release_memory_special_huge_tlbfs(char* base, size_t bytes); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
113 |
6080
7432b9db36ff
7165755: OS Information much longer on linux than other platforms
nloodin
parents:
3826
diff
changeset
|
114 static void print_full_memory_info(outputStream* st); |
7432b9db36ff
7165755: OS Information much longer on linux than other platforms
nloodin
parents:
3826
diff
changeset
|
115 static void print_distro_info(outputStream* st); |
7432b9db36ff
7165755: OS Information much longer on linux than other platforms
nloodin
parents:
3826
diff
changeset
|
116 static void print_libversion_info(outputStream* st); |
7432b9db36ff
7165755: OS Information much longer on linux than other platforms
nloodin
parents:
3826
diff
changeset
|
117 |
0 | 118 public: |
8710
9058789475af
7107135: Stack guard pages are no more protected after loading a shared library with executable stack
iklam
parents:
8675
diff
changeset
|
119 static bool _stack_is_executable; |
8812
14509df4cd63
8010389: After fix for 7107135 a failed dlopen() call results in a VM crash
iklam
parents:
8710
diff
changeset
|
120 static void *dlopen_helper(const char *name, char *ebuf, int ebuflen); |
14509df4cd63
8010389: After fix for 7107135 a failed dlopen() call results in a VM crash
iklam
parents:
8710
diff
changeset
|
121 static void *dll_load_in_vmthread(const char *name, char *ebuf, int ebuflen); |
8710
9058789475af
7107135: Stack guard pages are no more protected after loading a shared library with executable stack
iklam
parents:
8675
diff
changeset
|
122 |
0 | 123 static void init_thread_fpu_state(); |
124 static int get_fpu_control_word(); | |
125 static void set_fpu_control_word(int fpu_control); | |
126 static pthread_t main_thread(void) { return _main_thread; } | |
127 // returns kernel thread id (similar to LWP id on Solaris), which can be | |
128 // used to access /proc | |
129 static pid_t gettid(); | |
130 static void set_createThread_lock(Mutex* lk) { _createThread_lock = lk; } | |
131 static Mutex* createThread_lock(void) { return _createThread_lock; } | |
132 static void hotspot_sigmask(Thread* thread); | |
133 | |
134 static address initial_thread_stack_bottom(void) { return _initial_thread_stack_bottom; } | |
135 static uintptr_t initial_thread_stack_size(void) { return _initial_thread_stack_size; } | |
136 static bool is_initial_thread(void); | |
137 | |
138 static int page_size(void) { return _page_size; } | |
139 static void set_page_size(int val) { _page_size = val; } | |
140 | |
10164
b4081e9714ec
8013398: Adjust number of stack guard pages on systems with large memory page size
vladidan
parents:
8812
diff
changeset
|
141 static int vm_default_page_size(void) { return _vm_default_page_size; } |
b4081e9714ec
8013398: Adjust number of stack guard pages on systems with large memory page size
vladidan
parents:
8812
diff
changeset
|
142 |
0 | 143 static address ucontext_get_pc(ucontext_t* uc); |
144 static intptr_t* ucontext_get_sp(ucontext_t* uc); | |
145 static intptr_t* ucontext_get_fp(ucontext_t* uc); | |
146 | |
147 // For Analyzer Forte AsyncGetCallTrace profiling support: | |
148 // | |
149 // This interface should be declared in os_linux_i486.hpp, but | |
150 // that file provides extensions to the os class and not the | |
151 // Linux class. | |
152 static ExtendedPC fetch_frame_from_ucontext(Thread* thread, ucontext_t* uc, | |
153 intptr_t** ret_sp, intptr_t** ret_fp); | |
154 | |
155 // This boolean allows users to forward their own non-matching signals | |
156 // to JVM_handle_linux_signal, harmlessly. | |
157 static bool signal_handlers_are_installed; | |
158 | |
159 static int get_our_sigflags(int); | |
160 static void set_our_sigflags(int, int); | |
161 static void signal_sets_init(); | |
162 static void install_signal_handlers(); | |
163 static void set_signal_handler(int, bool); | |
164 static bool is_sig_ignored(int sig); | |
165 | |
166 static sigset_t* unblocked_signals(); | |
167 static sigset_t* vm_signals(); | |
168 static sigset_t* allowdebug_blocked_signals(); | |
169 | |
170 // For signal-chaining | |
171 static struct sigaction *get_chained_signal_action(int sig); | |
172 static bool chained_handler(int sig, siginfo_t* siginfo, void* context); | |
173 | |
174 // GNU libc and libpthread version strings | |
199
f139919897d2
6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents:
141
diff
changeset
|
175 static const char *glibc_version() { return _glibc_version; } |
f139919897d2
6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents:
141
diff
changeset
|
176 static const char *libpthread_version() { return _libpthread_version; } |
0 | 177 |
178 // NPTL or LinuxThreads? | |
179 static bool is_LinuxThreads() { return !_is_NPTL; } | |
180 static bool is_NPTL() { return _is_NPTL; } | |
181 | |
182 // NPTL is always floating stack. LinuxThreads could be using floating | |
183 // stack or fixed stack. | |
184 static bool is_floating_stack() { return _is_floating_stack; } | |
185 | |
186 static void libpthread_init(); | |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
187 static bool libnuma_init(); |
763
cf71f149d7ae
6840196: NUMA allocator: crash in fastdebug during startup on Linux
iveresov
parents:
462
diff
changeset
|
188 static void* libnuma_dlsym(void* handle, const char* name); |
0 | 189 // Minimum stack size a thread can be created with (allowing |
190 // the VM to completely create the thread and enter user code) | |
191 static size_t min_stack_allowed; | |
192 | |
193 // Return default stack size or guard size for the specified thread type | |
194 static size_t default_stack_size(os::ThreadType thr_type); | |
195 static size_t default_guard_size(os::ThreadType thr_type); | |
196 | |
197 static void capture_initial_stack(size_t max_size); | |
198 | |
199 // Stack overflow handling | |
200 static bool manually_expand_stack(JavaThread * t, address addr); | |
201 static int max_register_window_saves_before_flushing(); | |
202 | |
203 // Real-time clock functions | |
204 static void clock_init(void); | |
205 | |
206 // fast POSIX clocks support | |
207 static void fast_thread_clock_init(void); | |
208 | |
6630
fa9253dcd4df
7194409: os::javaTimeNanos() shows hot on CPU_CLK_UNHALTED profiles
johnc
parents:
6197
diff
changeset
|
209 static inline bool supports_monotonic_clock() { |
0 | 210 return _clock_gettime != NULL; |
211 } | |
212 | |
213 static int clock_gettime(clockid_t clock_id, struct timespec *tp) { | |
214 return _clock_gettime ? _clock_gettime(clock_id, tp) : -1; | |
215 } | |
216 | |
217 static int pthread_getcpuclockid(pthread_t tid, clockid_t *clock_id) { | |
218 return _pthread_getcpuclockid ? _pthread_getcpuclockid(tid, clock_id) : -1; | |
219 } | |
220 | |
221 static bool supports_fast_thread_cpu_time() { | |
222 return _supports_fast_thread_cpu_time; | |
223 } | |
224 | |
225 static jlong fast_thread_cpu_time(clockid_t clockid); | |
226 | |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
227 // pthread_cond clock suppport |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
228 private: |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
229 static pthread_condattr_t _condattr[1]; |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
230 |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
231 public: |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
232 static pthread_condattr_t* condAttr() { return _condattr; } |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
233 |
0 | 234 // Stack repair handling |
235 | |
236 // none present | |
237 | |
238 // LinuxThreads work-around for 6292965 | |
239 static int safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime); | |
240 | |
141 | 241 private: |
242 typedef int (*sched_getcpu_func_t)(void); | |
243 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen); | |
244 typedef int (*numa_max_node_func_t)(void); | |
245 typedef int (*numa_available_func_t)(void); | |
246 typedef int (*numa_tonode_memory_func_t)(void *start, size_t size, int node); | |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
247 typedef void (*numa_interleave_memory_func_t)(void *start, size_t size, unsigned long *nodemask); |
12176
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
248 typedef void (*numa_set_bind_policy_func_t)(int policy); |
141 | 249 |
250 static sched_getcpu_func_t _sched_getcpu; | |
251 static numa_node_to_cpus_func_t _numa_node_to_cpus; | |
252 static numa_max_node_func_t _numa_max_node; | |
253 static numa_available_func_t _numa_available; | |
254 static numa_tonode_memory_func_t _numa_tonode_memory; | |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
255 static numa_interleave_memory_func_t _numa_interleave_memory; |
12176
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
256 static numa_set_bind_policy_func_t _numa_set_bind_policy; |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
257 static unsigned long* _numa_all_nodes; |
141 | 258 |
259 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; } | |
260 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; } | |
261 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; } | |
262 static void set_numa_available(numa_available_func_t func) { _numa_available = func; } | |
263 static void set_numa_tonode_memory(numa_tonode_memory_func_t func) { _numa_tonode_memory = func; } | |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
264 static void set_numa_interleave_memory(numa_interleave_memory_func_t func) { _numa_interleave_memory = func; } |
12176
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
265 static void set_numa_set_bind_policy(numa_set_bind_policy_func_t func) { _numa_set_bind_policy = func; } |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
266 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; } |
3826 | 267 static int sched_getcpu_syscall(void); |
141 | 268 public: |
269 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; } | |
270 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) { | |
271 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1; | |
272 } | |
273 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; } | |
274 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; } | |
275 static int numa_tonode_memory(void *start, size_t size, int node) { | |
276 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1; | |
277 } | |
462
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
278 static void numa_interleave_memory(void *start, size_t size) { |
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
279 if (_numa_interleave_memory != NULL && _numa_all_nodes != NULL) { |
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
280 _numa_interleave_memory(start, size, _numa_all_nodes); |
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
281 } |
85f1b9537f70
6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents:
235
diff
changeset
|
282 } |
12176
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
283 static void numa_set_bind_policy(int policy) { |
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
284 if (_numa_set_bind_policy != NULL) { |
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
285 _numa_set_bind_policy(policy); |
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
286 } |
88c255656030
8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents:
10969
diff
changeset
|
287 } |
141 | 288 static int get_node_by_cpu(int cpu_id); |
0 | 289 }; |
290 | |
291 | |
6197 | 292 class PlatformEvent : public CHeapObj<mtInternal> { |
0 | 293 private: |
294 double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line | |
295 volatile int _Event ; | |
296 volatile int _nParked ; | |
297 pthread_mutex_t _mutex [1] ; | |
298 pthread_cond_t _cond [1] ; | |
299 double PostPad [2] ; | |
300 Thread * _Assoc ; | |
301 | |
302 public: // TODO-FIXME: make dtor private | |
303 ~PlatformEvent() { guarantee (0, "invariant") ; } | |
304 | |
305 public: | |
306 PlatformEvent() { | |
307 int status; | |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
308 status = pthread_cond_init (_cond, os::Linux::condAttr()); |
0 | 309 assert_status(status == 0, status, "cond_init"); |
310 status = pthread_mutex_init (_mutex, NULL); | |
311 assert_status(status == 0, status, "mutex_init"); | |
312 _Event = 0 ; | |
313 _nParked = 0 ; | |
314 _Assoc = NULL ; | |
315 } | |
316 | |
317 // Use caution with reset() and fired() -- they may require MEMBARs | |
318 void reset() { _Event = 0 ; } | |
319 int fired() { return _Event; } | |
320 void park () ; | |
321 void unpark () ; | |
322 int TryPark () ; | |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
323 int park (jlong millis) ; // relative timed-wait only |
0 | 324 void SetAssociation (Thread * a) { _Assoc = a ; } |
325 } ; | |
326 | |
6197 | 327 class PlatformParker : public CHeapObj<mtInternal> { |
0 | 328 protected: |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
329 enum { |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
330 REL_INDEX = 0, |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
331 ABS_INDEX = 1 |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
332 }; |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
333 int _cur_index; // which cond is in use: -1, 0, 1 |
0 | 334 pthread_mutex_t _mutex [1] ; |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
335 pthread_cond_t _cond [2] ; // one for relative times and one for abs. |
0 | 336 |
337 public: // TODO-FIXME: make dtor private | |
338 ~PlatformParker() { guarantee (0, "invariant") ; } | |
339 | |
340 public: | |
341 PlatformParker() { | |
342 int status; | |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
343 status = pthread_cond_init (&_cond[REL_INDEX], os::Linux::condAttr()); |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
344 assert_status(status == 0, status, "cond_init rel"); |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
345 status = pthread_cond_init (&_cond[ABS_INDEX], NULL); |
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
346 assert_status(status == 0, status, "cond_init abs"); |
0 | 347 status = pthread_mutex_init (_mutex, NULL); |
348 assert_status(status == 0, status, "mutex_init"); | |
12211
2e6938dd68f2
6900441: PlatformEvent.park(millis) on Linux could still be affected by changes to the time-of-day clock
dholmes
parents:
12177
diff
changeset
|
349 _cur_index = -1; // mark as unused |
0 | 350 } |
10405 | 351 }; |
1972 | 352 |
353 #endif // OS_LINUX_VM_OS_LINUX_HPP |