src/share/vm/runtime/os.cpp

Print this page
rev 6634 : 8048895: Back out JDK-8027915

*** 1301,1319 **** // The very lower end of the stack address stack_limit = thread->stack_base() - thread->stack_size(); return (sp > (stack_limit + reserved_area)); } ! size_t os::page_size_for_region(size_t region_size, size_t min_pages) { assert(min_pages > 0, "sanity"); if (UseLargePages) { ! const size_t max_page_size = region_size / min_pages; ! for (size_t i = 0; _page_sizes[i] != 0; ++i) { ! const size_t page_size = _page_sizes[i]; ! if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) { ! return page_size; } } } return vm_page_size(); --- 1301,1328 ---- // The very lower end of the stack address stack_limit = thread->stack_base() - thread->stack_size(); return (sp > (stack_limit + reserved_area)); } ! size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size, ! uint min_pages) ! { assert(min_pages > 0, "sanity"); if (UseLargePages) { ! const size_t max_page_size = region_max_size / min_pages; ! ! for (unsigned int i = 0; _page_sizes[i] != 0; ++i) { ! const size_t sz = _page_sizes[i]; ! const size_t mask = sz - 1; ! if ((region_min_size & mask) == 0 && (region_max_size & mask) == 0) { ! // The largest page size with no fragmentation. ! return sz; ! } ! if (sz <= max_page_size) { ! // The largest page size that satisfies the min_pages requirement. ! return sz; } } } return vm_page_size();
*** 1537,1601 **** return to; } return result; } #endif - - /////////////// Unit tests /////////////// - - #ifndef PRODUCT - - #define assert_eq(a,b) assert(a == b, err_msg(SIZE_FORMAT " != " SIZE_FORMAT, a, b)) - - class TestOS : AllStatic { - static size_t small_page_size() { - return os::vm_page_size(); - } - - static size_t large_page_size() { - const size_t large_page_size_example = 4 * M; - return os::page_size_for_region(large_page_size_example, 1); - } - - static void test_page_size_for_region() { - if (UseLargePages) { - const size_t small_page = small_page_size(); - const size_t large_page = large_page_size(); - - if (large_page > small_page) { - size_t num_small_pages_in_large = large_page / small_page; - size_t page = os::page_size_for_region(large_page, num_small_pages_in_large); - - assert_eq(page, small_page); - } - } - } - - static void test_page_size_for_region_alignment() { - if (UseLargePages) { - const size_t small_page = small_page_size(); - const size_t large_page = large_page_size(); - if (large_page > small_page) { - const size_t unaligned_region = large_page + 17; - size_t page = os::page_size_for_region(unaligned_region, 1); - assert_eq(page, small_page); - - const size_t num_pages = 5; - const size_t aligned_region = large_page * num_pages; - page = os::page_size_for_region(aligned_region, num_pages); - assert_eq(page, large_page); - } - } - } - - public: - static void run_tests() { - test_page_size_for_region(); - test_page_size_for_region_alignment(); - } - }; - - void TestOS_test() { - TestOS::run_tests(); - } - - #endif // PRODUCT --- 1546,1550 ----