annotate src/os/linux/vm/os_linux.hpp @ 12176:88c255656030

8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld Summary: When using NUMA and large pages we need to ease the requirement on which node the memory should be allocated on. To avoid the SIGBUS we now use the memory policy MPOL_PREFERRED, which prefers a certain node, instead of MPOL_BIND, which requires a certain node. Reviewed-by: jmasa, pliden Contributed-by: stefan.johansson@oracle.com
author mgerdin
date Thu, 22 Aug 2013 10:50:41 +0200
parents a837fa3d3f86
children 0d59407e7e09
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
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
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #ifndef OS_LINUX_VM_OS_LINUX_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #define OS_LINUX_VM_OS_LINUX_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27
0
a61af66fc99e Initial load
duke
parents:
diff changeset
28 // Linux_OS defines the interface to Linux operating systems
a61af66fc99e Initial load
duke
parents:
diff changeset
29
a61af66fc99e Initial load
duke
parents:
diff changeset
30 /* pthread_getattr_np comes with LinuxThreads-0.9-7 on RedHat 7.1 */
a61af66fc99e Initial load
duke
parents:
diff changeset
31 typedef int (*pthread_getattr_func_type) (pthread_t, pthread_attr_t *);
a61af66fc99e Initial load
duke
parents:
diff changeset
32
a61af66fc99e Initial load
duke
parents:
diff changeset
33 class Linux {
a61af66fc99e Initial load
duke
parents:
diff changeset
34 friend class os;
a61af66fc99e Initial load
duke
parents:
diff changeset
35
a61af66fc99e Initial load
duke
parents:
diff changeset
36 // For signal-chaining
a61af66fc99e Initial load
duke
parents:
diff changeset
37 #define MAXSIGNUM 32
a61af66fc99e Initial load
duke
parents:
diff changeset
38 static struct sigaction sigact[MAXSIGNUM]; // saved preinstalled sigactions
a61af66fc99e Initial load
duke
parents:
diff changeset
39 static unsigned int sigs; // mask of signals that have
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // preinstalled signal handlers
a61af66fc99e Initial load
duke
parents:
diff changeset
41 static bool libjsig_is_loaded; // libjsig that interposes sigaction(),
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // __sigaction(), signal() is loaded
a61af66fc99e Initial load
duke
parents:
diff changeset
43 static struct sigaction *(*get_signal_action)(int);
a61af66fc99e Initial load
duke
parents:
diff changeset
44 static struct sigaction *get_preinstalled_handler(int);
a61af66fc99e Initial load
duke
parents:
diff changeset
45 static void save_preinstalled_handler(int, struct sigaction&);
a61af66fc99e Initial load
duke
parents:
diff changeset
46
a61af66fc99e Initial load
duke
parents:
diff changeset
47 static void check_signal_handler(int sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 // For signal flags diagnostics
a61af66fc99e Initial load
duke
parents:
diff changeset
50 static int sigflags[MAXSIGNUM];
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 static int (*_clock_gettime)(clockid_t, struct timespec *);
a61af66fc99e Initial load
duke
parents:
diff changeset
53 static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *);
a61af66fc99e Initial load
duke
parents:
diff changeset
54
a61af66fc99e Initial load
duke
parents:
diff changeset
55 static address _initial_thread_stack_bottom;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 static uintptr_t _initial_thread_stack_size;
a61af66fc99e Initial load
duke
parents:
diff changeset
57
199
f139919897d2 6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents: 141
diff changeset
58 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
59 static const char *_libpthread_version;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
60
a61af66fc99e Initial load
duke
parents:
diff changeset
61 static bool _is_floating_stack;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 static bool _is_NPTL;
a61af66fc99e Initial load
duke
parents:
diff changeset
63 static bool _supports_fast_thread_cpu_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
64
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
65 static GrowableArray<int>* _cpu_to_node;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
66
0
a61af66fc99e Initial load
duke
parents:
diff changeset
67 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 static julong _physical_memory;
a61af66fc99e Initial load
duke
parents:
diff changeset
70 static pthread_t _main_thread;
a61af66fc99e Initial load
duke
parents:
diff changeset
71 static Mutex* _createThread_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
72 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
73 static const int _vm_default_page_size;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75 static julong available_memory();
a61af66fc99e Initial load
duke
parents:
diff changeset
76 static julong physical_memory() { return _physical_memory; }
a61af66fc99e Initial load
duke
parents:
diff changeset
77 static void initialize_system_info();
a61af66fc99e Initial load
duke
parents:
diff changeset
78
10969
a837fa3d3f86 8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents: 10405
diff changeset
79 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
80 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
81 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
82
199
f139919897d2 6681796: hotspot build failure on gcc 4.2.x (ubuntu 8.04) w/ openjdk 6
xlu
parents: 141
diff changeset
83 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
84 static void set_libpthread_version(const char *s) { _libpthread_version = s; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 static bool supports_variable_stack_size();
a61af66fc99e Initial load
duke
parents:
diff changeset
87
a61af66fc99e Initial load
duke
parents:
diff changeset
88 static void set_is_NPTL() { _is_NPTL = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
89 static void set_is_LinuxThreads() { _is_NPTL = false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 static void set_is_floating_stack() { _is_floating_stack = true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
91
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
92 static void rebuild_cpu_to_node_map();
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
93 static GrowableArray<int>* cpu_to_node() { return _cpu_to_node; }
3286
139667d9836a 7034464: Support transparent large pages on Linux
iveresov
parents: 1972
diff changeset
94
139667d9836a 7034464: Support transparent large pages on Linux
iveresov
parents: 1972
diff changeset
95 static bool hugetlbfs_sanity_check(bool warn, size_t page_size);
139667d9836a 7034464: Support transparent large pages on Linux
iveresov
parents: 1972
diff changeset
96
6080
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 3826
diff changeset
97 static void print_full_memory_info(outputStream* st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 3826
diff changeset
98 static void print_distro_info(outputStream* st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 3826
diff changeset
99 static void print_libversion_info(outputStream* st);
7432b9db36ff 7165755: OS Information much longer on linux than other platforms
nloodin
parents: 3826
diff changeset
100
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 public:
8710
9058789475af 7107135: Stack guard pages are no more protected after loading a shared library with executable stack
iklam
parents: 8675
diff changeset
102 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
103 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
104 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
105
0
a61af66fc99e Initial load
duke
parents:
diff changeset
106 static void init_thread_fpu_state();
a61af66fc99e Initial load
duke
parents:
diff changeset
107 static int get_fpu_control_word();
a61af66fc99e Initial load
duke
parents:
diff changeset
108 static void set_fpu_control_word(int fpu_control);
a61af66fc99e Initial load
duke
parents:
diff changeset
109 static pthread_t main_thread(void) { return _main_thread; }
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // returns kernel thread id (similar to LWP id on Solaris), which can be
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // used to access /proc
a61af66fc99e Initial load
duke
parents:
diff changeset
112 static pid_t gettid();
a61af66fc99e Initial load
duke
parents:
diff changeset
113 static void set_createThread_lock(Mutex* lk) { _createThread_lock = lk; }
a61af66fc99e Initial load
duke
parents:
diff changeset
114 static Mutex* createThread_lock(void) { return _createThread_lock; }
a61af66fc99e Initial load
duke
parents:
diff changeset
115 static void hotspot_sigmask(Thread* thread);
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 static address initial_thread_stack_bottom(void) { return _initial_thread_stack_bottom; }
a61af66fc99e Initial load
duke
parents:
diff changeset
118 static uintptr_t initial_thread_stack_size(void) { return _initial_thread_stack_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
119 static bool is_initial_thread(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
120
a61af66fc99e Initial load
duke
parents:
diff changeset
121 static int page_size(void) { return _page_size; }
a61af66fc99e Initial load
duke
parents:
diff changeset
122 static void set_page_size(int val) { _page_size = val; }
a61af66fc99e Initial load
duke
parents:
diff changeset
123
10164
b4081e9714ec 8013398: Adjust number of stack guard pages on systems with large memory page size
vladidan
parents: 8812
diff changeset
124 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
125
0
a61af66fc99e Initial load
duke
parents:
diff changeset
126 static address ucontext_get_pc(ucontext_t* uc);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 static intptr_t* ucontext_get_sp(ucontext_t* uc);
a61af66fc99e Initial load
duke
parents:
diff changeset
128 static intptr_t* ucontext_get_fp(ucontext_t* uc);
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130 // For Analyzer Forte AsyncGetCallTrace profiling support:
a61af66fc99e Initial load
duke
parents:
diff changeset
131 //
a61af66fc99e Initial load
duke
parents:
diff changeset
132 // This interface should be declared in os_linux_i486.hpp, but
a61af66fc99e Initial load
duke
parents:
diff changeset
133 // that file provides extensions to the os class and not the
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // Linux class.
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static ExtendedPC fetch_frame_from_ucontext(Thread* thread, ucontext_t* uc,
a61af66fc99e Initial load
duke
parents:
diff changeset
136 intptr_t** ret_sp, intptr_t** ret_fp);
a61af66fc99e Initial load
duke
parents:
diff changeset
137
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // This boolean allows users to forward their own non-matching signals
a61af66fc99e Initial load
duke
parents:
diff changeset
139 // to JVM_handle_linux_signal, harmlessly.
a61af66fc99e Initial load
duke
parents:
diff changeset
140 static bool signal_handlers_are_installed;
a61af66fc99e Initial load
duke
parents:
diff changeset
141
a61af66fc99e Initial load
duke
parents:
diff changeset
142 static int get_our_sigflags(int);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 static void set_our_sigflags(int, int);
a61af66fc99e Initial load
duke
parents:
diff changeset
144 static void signal_sets_init();
a61af66fc99e Initial load
duke
parents:
diff changeset
145 static void install_signal_handlers();
a61af66fc99e Initial load
duke
parents:
diff changeset
146 static void set_signal_handler(int, bool);
a61af66fc99e Initial load
duke
parents:
diff changeset
147 static bool is_sig_ignored(int sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
148
a61af66fc99e Initial load
duke
parents:
diff changeset
149 static sigset_t* unblocked_signals();
a61af66fc99e Initial load
duke
parents:
diff changeset
150 static sigset_t* vm_signals();
a61af66fc99e Initial load
duke
parents:
diff changeset
151 static sigset_t* allowdebug_blocked_signals();
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 // For signal-chaining
a61af66fc99e Initial load
duke
parents:
diff changeset
154 static struct sigaction *get_chained_signal_action(int sig);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 static bool chained_handler(int sig, siginfo_t* siginfo, void* context);
a61af66fc99e Initial load
duke
parents:
diff changeset
156
a61af66fc99e Initial load
duke
parents:
diff changeset
157 // 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
158 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
159 static const char *libpthread_version() { return _libpthread_version; }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
160
a61af66fc99e Initial load
duke
parents:
diff changeset
161 // NPTL or LinuxThreads?
a61af66fc99e Initial load
duke
parents:
diff changeset
162 static bool is_LinuxThreads() { return !_is_NPTL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 static bool is_NPTL() { return _is_NPTL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
164
a61af66fc99e Initial load
duke
parents:
diff changeset
165 // NPTL is always floating stack. LinuxThreads could be using floating
a61af66fc99e Initial load
duke
parents:
diff changeset
166 // stack or fixed stack.
a61af66fc99e Initial load
duke
parents:
diff changeset
167 static bool is_floating_stack() { return _is_floating_stack; }
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 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
170 static bool libnuma_init();
763
cf71f149d7ae 6840196: NUMA allocator: crash in fastdebug during startup on Linux
iveresov
parents: 462
diff changeset
171 static void* libnuma_dlsym(void* handle, const char* name);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
172 // Minimum stack size a thread can be created with (allowing
a61af66fc99e Initial load
duke
parents:
diff changeset
173 // the VM to completely create the thread and enter user code)
a61af66fc99e Initial load
duke
parents:
diff changeset
174 static size_t min_stack_allowed;
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176 // Return default stack size or guard size for the specified thread type
a61af66fc99e Initial load
duke
parents:
diff changeset
177 static size_t default_stack_size(os::ThreadType thr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
178 static size_t default_guard_size(os::ThreadType thr_type);
a61af66fc99e Initial load
duke
parents:
diff changeset
179
a61af66fc99e Initial load
duke
parents:
diff changeset
180 static void capture_initial_stack(size_t max_size);
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 // Stack overflow handling
a61af66fc99e Initial load
duke
parents:
diff changeset
183 static bool manually_expand_stack(JavaThread * t, address addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
184 static int max_register_window_saves_before_flushing();
a61af66fc99e Initial load
duke
parents:
diff changeset
185
a61af66fc99e Initial load
duke
parents:
diff changeset
186 // Real-time clock functions
a61af66fc99e Initial load
duke
parents:
diff changeset
187 static void clock_init(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
188
a61af66fc99e Initial load
duke
parents:
diff changeset
189 // fast POSIX clocks support
a61af66fc99e Initial load
duke
parents:
diff changeset
190 static void fast_thread_clock_init(void);
a61af66fc99e Initial load
duke
parents:
diff changeset
191
6630
fa9253dcd4df 7194409: os::javaTimeNanos() shows hot on CPU_CLK_UNHALTED profiles
johnc
parents: 6197
diff changeset
192 static inline bool supports_monotonic_clock() {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
193 return _clock_gettime != NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
194 }
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 static int clock_gettime(clockid_t clock_id, struct timespec *tp) {
a61af66fc99e Initial load
duke
parents:
diff changeset
197 return _clock_gettime ? _clock_gettime(clock_id, tp) : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
198 }
a61af66fc99e Initial load
duke
parents:
diff changeset
199
a61af66fc99e Initial load
duke
parents:
diff changeset
200 static int pthread_getcpuclockid(pthread_t tid, clockid_t *clock_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
201 return _pthread_getcpuclockid ? _pthread_getcpuclockid(tid, clock_id) : -1;
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204 static bool supports_fast_thread_cpu_time() {
a61af66fc99e Initial load
duke
parents:
diff changeset
205 return _supports_fast_thread_cpu_time;
a61af66fc99e Initial load
duke
parents:
diff changeset
206 }
a61af66fc99e Initial load
duke
parents:
diff changeset
207
a61af66fc99e Initial load
duke
parents:
diff changeset
208 static jlong fast_thread_cpu_time(clockid_t clockid);
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210 // Stack repair handling
a61af66fc99e Initial load
duke
parents:
diff changeset
211
a61af66fc99e Initial load
duke
parents:
diff changeset
212 // none present
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214 // LinuxThreads work-around for 6292965
a61af66fc99e Initial load
duke
parents:
diff changeset
215 static int safe_cond_timedwait(pthread_cond_t *_cond, pthread_mutex_t *_mutex, const struct timespec *_abstime);
a61af66fc99e Initial load
duke
parents:
diff changeset
216
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
217 private:
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
218 typedef int (*sched_getcpu_func_t)(void);
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
219 typedef int (*numa_node_to_cpus_func_t)(int node, unsigned long *buffer, int bufferlen);
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
220 typedef int (*numa_max_node_func_t)(void);
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
221 typedef int (*numa_available_func_t)(void);
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
222 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
223 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
224 typedef void (*numa_set_bind_policy_func_t)(int policy);
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
225
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
226 static sched_getcpu_func_t _sched_getcpu;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
227 static numa_node_to_cpus_func_t _numa_node_to_cpus;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
228 static numa_max_node_func_t _numa_max_node;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
229 static numa_available_func_t _numa_available;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
230 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
231 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
232 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
233 static unsigned long* _numa_all_nodes;
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
234
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
235 static void set_sched_getcpu(sched_getcpu_func_t func) { _sched_getcpu = func; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
236 static void set_numa_node_to_cpus(numa_node_to_cpus_func_t func) { _numa_node_to_cpus = func; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
237 static void set_numa_max_node(numa_max_node_func_t func) { _numa_max_node = func; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
238 static void set_numa_available(numa_available_func_t func) { _numa_available = func; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
239 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
240 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
241 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
242 static void set_numa_all_nodes(unsigned long* ptr) { _numa_all_nodes = ptr; }
3826
7c2653aefc46 7060836: RHEL 5.5 and 5.6 should support UseNUMA
iveresov
parents: 3286
diff changeset
243 static int sched_getcpu_syscall(void);
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
244 public:
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
245 static int sched_getcpu() { return _sched_getcpu != NULL ? _sched_getcpu() : -1; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
246 static int numa_node_to_cpus(int node, unsigned long *buffer, int bufferlen) {
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
247 return _numa_node_to_cpus != NULL ? _numa_node_to_cpus(node, buffer, bufferlen) : -1;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
248 }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
249 static int numa_max_node() { return _numa_max_node != NULL ? _numa_max_node() : -1; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
250 static int numa_available() { return _numa_available != NULL ? _numa_available() : -1; }
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
251 static int numa_tonode_memory(void *start, size_t size, int node) {
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
252 return _numa_tonode_memory != NULL ? _numa_tonode_memory(start, size, node) : -1;
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
253 }
462
85f1b9537f70 6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents: 235
diff changeset
254 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
255 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
256 _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
257 }
85f1b9537f70 6779436: NUMA allocator: libnuma expects certain size of the buffer in numa_node_to_cpus()
iveresov
parents: 235
diff changeset
258 }
12176
88c255656030 8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents: 10969
diff changeset
259 static void numa_set_bind_policy(int policy) {
88c255656030 8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents: 10969
diff changeset
260 if (_numa_set_bind_policy != NULL) {
88c255656030 8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents: 10969
diff changeset
261 _numa_set_bind_policy(policy);
88c255656030 8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents: 10969
diff changeset
262 }
88c255656030 8016155: SIGBUS when running Kitchensink with ParallelScavenge and ParallelOld
mgerdin
parents: 10969
diff changeset
263 }
141
fcbfc50865ab 6684395: Port NUMA-aware allocator to linux
iveresov
parents: 0
diff changeset
264 static int get_node_by_cpu(int cpu_id);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
265 };
a61af66fc99e Initial load
duke
parents:
diff changeset
266
a61af66fc99e Initial load
duke
parents:
diff changeset
267
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
268 class PlatformEvent : public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
269 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
270 double CachePad [4] ; // increase odds that _mutex is sole occupant of cache line
a61af66fc99e Initial load
duke
parents:
diff changeset
271 volatile int _Event ;
a61af66fc99e Initial load
duke
parents:
diff changeset
272 volatile int _nParked ;
a61af66fc99e Initial load
duke
parents:
diff changeset
273 pthread_mutex_t _mutex [1] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
274 pthread_cond_t _cond [1] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
275 double PostPad [2] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
276 Thread * _Assoc ;
a61af66fc99e Initial load
duke
parents:
diff changeset
277
a61af66fc99e Initial load
duke
parents:
diff changeset
278 public: // TODO-FIXME: make dtor private
a61af66fc99e Initial load
duke
parents:
diff changeset
279 ~PlatformEvent() { guarantee (0, "invariant") ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
282 PlatformEvent() {
a61af66fc99e Initial load
duke
parents:
diff changeset
283 int status;
a61af66fc99e Initial load
duke
parents:
diff changeset
284 status = pthread_cond_init (_cond, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
285 assert_status(status == 0, status, "cond_init");
a61af66fc99e Initial load
duke
parents:
diff changeset
286 status = pthread_mutex_init (_mutex, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
287 assert_status(status == 0, status, "mutex_init");
a61af66fc99e Initial load
duke
parents:
diff changeset
288 _Event = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
289 _nParked = 0 ;
a61af66fc99e Initial load
duke
parents:
diff changeset
290 _Assoc = NULL ;
a61af66fc99e Initial load
duke
parents:
diff changeset
291 }
a61af66fc99e Initial load
duke
parents:
diff changeset
292
a61af66fc99e Initial load
duke
parents:
diff changeset
293 // Use caution with reset() and fired() -- they may require MEMBARs
a61af66fc99e Initial load
duke
parents:
diff changeset
294 void reset() { _Event = 0 ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
295 int fired() { return _Event; }
a61af66fc99e Initial load
duke
parents:
diff changeset
296 void park () ;
a61af66fc99e Initial load
duke
parents:
diff changeset
297 void unpark () ;
a61af66fc99e Initial load
duke
parents:
diff changeset
298 int TryPark () ;
a61af66fc99e Initial load
duke
parents:
diff changeset
299 int park (jlong millis) ;
a61af66fc99e Initial load
duke
parents:
diff changeset
300 void SetAssociation (Thread * a) { _Assoc = a ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
301 } ;
a61af66fc99e Initial load
duke
parents:
diff changeset
302
6197
d2a62e0f25eb 6995781: Native Memory Tracking (Phase 1)
zgu
parents: 6080
diff changeset
303 class PlatformParker : public CHeapObj<mtInternal> {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
304 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
305 pthread_mutex_t _mutex [1] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
306 pthread_cond_t _cond [1] ;
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 public: // TODO-FIXME: make dtor private
a61af66fc99e Initial load
duke
parents:
diff changeset
309 ~PlatformParker() { guarantee (0, "invariant") ; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310
a61af66fc99e Initial load
duke
parents:
diff changeset
311 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
312 PlatformParker() {
a61af66fc99e Initial load
duke
parents:
diff changeset
313 int status;
a61af66fc99e Initial load
duke
parents:
diff changeset
314 status = pthread_cond_init (_cond, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
315 assert_status(status == 0, status, "cond_init");
a61af66fc99e Initial load
duke
parents:
diff changeset
316 status = pthread_mutex_init (_mutex, NULL);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 assert_status(status == 0, status, "mutex_init");
a61af66fc99e Initial load
duke
parents:
diff changeset
318 }
10405
f2110083203d 8005849: JEP 167: Event-Based JVM Tracing
sla
parents: 10164
diff changeset
319 };
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
320
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
321 #endif // OS_LINUX_VM_OS_LINUX_HPP