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