hotspot/test/native/runtime/test_os.cpp
changeset 42056 9296564b8c8b
parent 41705 332239c052cc
child 46587 6c97f34cb194
--- a/hotspot/test/native/runtime/test_os.cpp	Fri May 20 16:45:00 2016 +0200
+++ b/hotspot/test/native/runtime/test_os.cpp	Mon May 23 19:46:43 2016 +0200
@@ -25,6 +25,15 @@
 #include "runtime/os.hpp"
 #include "unittest.hpp"
 
+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_aligned(large_page_size_example, 1);
+}
+
 TEST_VM(os, page_size_for_region) {
   size_t large_page_example = 4 * M;
   size_t large_page = os::page_size_for_region_aligned(large_page_example, 1);
@@ -37,6 +46,68 @@
   }
 }
 
+TEST_VM(os, page_size_for_region_aligned) {
+  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_aligned(large_page, num_small_pages_in_large);
+
+      ASSERT_EQ(page, small_page);
+    }
+  }
+}
+
+TEST_VM(os, 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_aligned(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(aligned_region, num_pages);
+      ASSERT_EQ(page, large_page);
+    }
+  }
+}
+
+TEST_VM(os, page_size_for_region_unaligned) {
+  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::page_size_for_region_unaligned(expected, 1);
+      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::page_size_for_region_unaligned(expected + 17, 1);
+      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::page_size_for_region_unaligned(os::_page_sizes[1] - 17, 1);
+      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::page_size_for_region_unaligned(small_page - 17, 1);
+    ASSERT_EQ(small_page, actual);
+  }
+}
+
 #ifdef ASSERT
 TEST_VM_ASSERT_MSG(os, page_size_for_region_with_zero_min_pages, "sanity") {
   size_t region_size = 16 * os::vm_page_size();