1.1 --- a/src/share/vm/runtime/os.cpp Thu Dec 18 09:37:02 2014 +0100 1.2 +++ b/src/share/vm/runtime/os.cpp Tue Jun 24 15:50:50 2014 +0200 1.3 @@ -1315,24 +1315,15 @@ 1.4 return (sp > (stack_limit + reserved_area)); 1.5 } 1.6 1.7 -size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size, 1.8 - uint min_pages) 1.9 -{ 1.10 +size_t os::page_size_for_region(size_t region_size, size_t min_pages) { 1.11 assert(min_pages > 0, "sanity"); 1.12 if (UseLargePages) { 1.13 - const size_t max_page_size = region_max_size / min_pages; 1.14 + const size_t max_page_size = region_size / min_pages; 1.15 1.16 - for (unsigned int i = 0; _page_sizes[i] != 0; ++i) { 1.17 - const size_t sz = _page_sizes[i]; 1.18 - const size_t mask = sz - 1; 1.19 - if ((region_min_size & mask) == 0 && (region_max_size & mask) == 0) { 1.20 - // The largest page size with no fragmentation. 1.21 - return sz; 1.22 - } 1.23 - 1.24 - if (sz <= max_page_size) { 1.25 - // The largest page size that satisfies the min_pages requirement. 1.26 - return sz; 1.27 + for (size_t i = 0; _page_sizes[i] != 0; ++i) { 1.28 + const size_t page_size = _page_sizes[i]; 1.29 + if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) { 1.30 + return page_size; 1.31 } 1.32 } 1.33 } 1.34 @@ -1574,3 +1565,63 @@ 1.35 return result; 1.36 } 1.37 #endif 1.38 + 1.39 +/////////////// Unit tests /////////////// 1.40 + 1.41 +#ifndef PRODUCT 1.42 + 1.43 +#define assert_eq(a,b) assert(a == b, err_msg(SIZE_FORMAT " != " SIZE_FORMAT, a, b)) 1.44 + 1.45 +class TestOS : AllStatic { 1.46 + static size_t small_page_size() { 1.47 + return os::vm_page_size(); 1.48 + } 1.49 + 1.50 + static size_t large_page_size() { 1.51 + const size_t large_page_size_example = 4 * M; 1.52 + return os::page_size_for_region(large_page_size_example, 1); 1.53 + } 1.54 + 1.55 + static void test_page_size_for_region() { 1.56 + if (UseLargePages) { 1.57 + const size_t small_page = small_page_size(); 1.58 + const size_t large_page = large_page_size(); 1.59 + 1.60 + if (large_page > small_page) { 1.61 + size_t num_small_pages_in_large = large_page / small_page; 1.62 + size_t page = os::page_size_for_region(large_page, num_small_pages_in_large); 1.63 + 1.64 + assert_eq(page, small_page); 1.65 + } 1.66 + } 1.67 + } 1.68 + 1.69 + static void test_page_size_for_region_alignment() { 1.70 + if (UseLargePages) { 1.71 + const size_t small_page = small_page_size(); 1.72 + const size_t large_page = large_page_size(); 1.73 + if (large_page > small_page) { 1.74 + const size_t unaligned_region = large_page + 17; 1.75 + size_t page = os::page_size_for_region(unaligned_region, 1); 1.76 + assert_eq(page, small_page); 1.77 + 1.78 + const size_t num_pages = 5; 1.79 + const size_t aligned_region = large_page * num_pages; 1.80 + page = os::page_size_for_region(aligned_region, num_pages); 1.81 + assert_eq(page, large_page); 1.82 + } 1.83 + } 1.84 + } 1.85 + 1.86 + public: 1.87 + static void run_tests() { 1.88 + test_page_size_for_region(); 1.89 + test_page_size_for_region_alignment(); 1.90 + } 1.91 +}; 1.92 + 1.93 +void TestOS_test() { 1.94 + TestOS::run_tests(); 1.95 +} 1.96 + 1.97 +#endif // PRODUCT