src/share/vm/runtime/os.cpp

changeset 7778
c2ce24504334
parent 7777
340ca8812af9
child 7780
5788dbd1f2d6
     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

mercurial