# HG changeset patch # User jcoomes # Date 1313602373 25200 # Node ID 24cee90e9453a9e12f3c1dc4b382fcd925b13012 # Parent 76b1a9420e3d5007910bba9c41a3ca6c7369dbb9 6791672: enable 1G and larger pages on solaris Reviewed-by: ysr, iveresov, johnc diff -r 76b1a9420e3d -r 24cee90e9453 src/os/solaris/vm/os_solaris.cpp --- a/src/os/solaris/vm/os_solaris.cpp Tue Aug 16 08:02:29 2011 -0700 +++ b/src/os/solaris/vm/os_solaris.cpp Wed Aug 17 10:32:53 2011 -0700 @@ -3252,7 +3252,6 @@ // supported Solaris versions, this combination // is equivalent to +UseISM -UseMPSS. -typedef int (*getpagesizes_func_type) (size_t[], int); static size_t _large_page_size = 0; bool os::Solaris::ism_sanity_check(bool warn, size_t * page_size) { @@ -3284,23 +3283,29 @@ } bool os::Solaris::mpss_sanity_check(bool warn, size_t * page_size) { - getpagesizes_func_type getpagesizes_func = - CAST_TO_FN_PTR(getpagesizes_func_type, dlsym(RTLD_DEFAULT, "getpagesizes")); - if (getpagesizes_func == NULL) { - if (warn) { - warning("MPSS is not supported by the operating system."); - } - return false; - } - const unsigned int usable_count = VM_Version::page_size_count(); if (usable_count == 1) { return false; } + // Find the right getpagesizes interface. When solaris 11 is the minimum + // build platform, getpagesizes() (without the '2') can be called directly. + typedef int (*gps_t)(size_t[], int); + gps_t gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes2")); + if (gps_func == NULL) { + gps_func = CAST_TO_FN_PTR(gps_t, dlsym(RTLD_DEFAULT, "getpagesizes")); + if (gps_func == NULL) { + if (warn) { + warning("MPSS is not supported by the operating system."); + } + return false; + } + } + // Fill the array of page sizes. - int n = getpagesizes_func(_page_sizes, page_sizes_max); + int n = (*gps_func)(_page_sizes, page_sizes_max); assert(n > 0, "Solaris bug?"); + if (n == page_sizes_max) { // Add a sentinel value (necessary only if the array was completely filled // since it is static (zeroed at initialization)). @@ -3308,6 +3313,7 @@ DEBUG_ONLY(warning("increase the size of the os::_page_sizes array.");) } assert(_page_sizes[n] == 0, "missing sentinel"); + trace_page_sizes("available page sizes", _page_sizes, n); if (n == 1) return false; // Only one page size available. @@ -3337,6 +3343,7 @@ } *page_size = _page_sizes[0]; + trace_page_sizes("usable page sizes", _page_sizes, end + 1); return true; } diff -r 76b1a9420e3d -r 24cee90e9453 src/share/vm/runtime/os.cpp --- a/src/share/vm/runtime/os.cpp Tue Aug 16 08:02:29 2011 -0700 +++ b/src/share/vm/runtime/os.cpp Wed Aug 17 10:32:53 2011 -0700 @@ -1232,6 +1232,17 @@ } #ifndef PRODUCT +void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count) +{ + if (TracePageSizes) { + tty->print("%s: ", str); + for (int i = 0; i < count; ++i) { + tty->print(" " SIZE_FORMAT, page_sizes[i]); + } + tty->cr(); + } +} + void os::trace_page_sizes(const char* str, const size_t region_min_size, const size_t region_max_size, const size_t page_size, const char* base, const size_t size) diff -r 76b1a9420e3d -r 24cee90e9453 src/share/vm/runtime/os.hpp --- a/src/share/vm/runtime/os.hpp Tue Aug 16 08:02:29 2011 -0700 +++ b/src/share/vm/runtime/os.hpp Wed Aug 17 10:32:53 2011 -0700 @@ -208,11 +208,13 @@ size_t region_max_size, uint min_pages); - // Method for tracing page sizes returned by the above method; enabled by + // Methods for tracing page sizes returned by the above method; enabled by // TracePageSizes. The region_{min,max}_size parameters should be the values // passed to page_size_for_region() and page_size should be the result of that // call. The (optional) base and size parameters should come from the // ReservedSpace base() and size() methods. + static void trace_page_sizes(const char* str, const size_t* page_sizes, + int count) PRODUCT_RETURN; static void trace_page_sizes(const char* str, const size_t region_min_size, const size_t region_max_size, const size_t page_size,