< 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 >