< prev index next >

src/share/vm/runtime/os.cpp

Print this page
rev 7514 : 8066875: VirtualSpace does not use large pages

*** 1413,1422 **** --- 1413,1434 ---- } return vm_page_size(); } + size_t os::largest_page_size_less_than(size_t sz) { + if (UseLargePages) { + // The page sizes are sorted descendingly. + for (size_t i = 0; _page_sizes[i] != 0; ++i) { + if (_page_sizes[i] <= sz) { + return _page_sizes[i]; + } + } + } + return vm_page_size(); + } + #ifndef PRODUCT void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count) { if (TracePageSizes) { tty->print("%s: ", str);
*** 1690,1703 **** --- 1702,1747 ---- assert_eq(page, large_page); } } } + static void test_largest_page_size_less_than() { + if (UseLargePages) { + // Given exact page size, should return that page size + for (size_t i = 0; os::_page_sizes[i] != 0; i++) { + size_t expected = os::_page_sizes[i]; + size_t actual = os::largest_page_size_less_than(expected); + assert_eq(expected, actual); + } + + // Given slightly larger size than a page size, return the page size + for (size_t i = 0; os::_page_sizes[i] != 0; i++) { + size_t expected = os::_page_sizes[i]; + size_t actual = os::largest_page_size_less_than(expected + 17); + assert_eq(expected, actual); + } + + // Given a slightly smaller size than a page size, + // return the next smaller page size + if (os::_page_sizes[1] > os::_page_sizes[0]) { + size_t expected = os::_page_sizes[0]; + size_t actual = os::largest_page_size_less_than(os::_page_sizes[1] - 17); + assert_eq(actual, expected); + } + + // Return small page size for values less than a small page + size_t small_page = small_page_size(); + size_t actual = os::largest_page_size_less_than(small_page - 17); + assert_eq(small_page, actual); + } + } + public: static void run_tests() { test_page_size_for_region(); test_page_size_for_region_alignment(); + test_largest_page_size_less_than(); } }; void TestOS_test() { TestOS::run_tests();
< prev index next >