1313 // The very lower end of the stack |
1313 // The very lower end of the stack |
1314 address stack_limit = thread->stack_base() - thread->stack_size(); |
1314 address stack_limit = thread->stack_base() - thread->stack_size(); |
1315 return (sp > (stack_limit + reserved_area)); |
1315 return (sp > (stack_limit + reserved_area)); |
1316 } |
1316 } |
1317 |
1317 |
1318 size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size, |
1318 size_t os::page_size_for_region(size_t region_size, size_t min_pages) { |
1319 uint min_pages) |
|
1320 { |
|
1321 assert(min_pages > 0, "sanity"); |
1319 assert(min_pages > 0, "sanity"); |
1322 if (UseLargePages) { |
1320 if (UseLargePages) { |
1323 const size_t max_page_size = region_max_size / min_pages; |
1321 const size_t max_page_size = region_size / min_pages; |
1324 |
1322 |
1325 for (unsigned int i = 0; _page_sizes[i] != 0; ++i) { |
1323 for (size_t i = 0; _page_sizes[i] != 0; ++i) { |
1326 const size_t sz = _page_sizes[i]; |
1324 const size_t page_size = _page_sizes[i]; |
1327 const size_t mask = sz - 1; |
1325 if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) { |
1328 if ((region_min_size & mask) == 0 && (region_max_size & mask) == 0) { |
1326 return page_size; |
1329 // The largest page size with no fragmentation. |
|
1330 return sz; |
|
1331 } |
|
1332 |
|
1333 if (sz <= max_page_size) { |
|
1334 // The largest page size that satisfies the min_pages requirement. |
|
1335 return sz; |
|
1336 } |
1327 } |
1337 } |
1328 } |
1338 } |
1329 } |
1339 |
1330 |
1340 return vm_page_size(); |
1331 return vm_page_size(); |
1572 return to; |
1563 return to; |
1573 } |
1564 } |
1574 return result; |
1565 return result; |
1575 } |
1566 } |
1576 #endif |
1567 #endif |
|
1568 |
|
1569 /////////////// Unit tests /////////////// |
|
1570 |
|
1571 #ifndef PRODUCT |
|
1572 |
|
1573 #define assert_eq(a,b) assert(a == b, err_msg(SIZE_FORMAT " != " SIZE_FORMAT, a, b)) |
|
1574 |
|
1575 class TestOS : AllStatic { |
|
1576 static size_t small_page_size() { |
|
1577 return os::vm_page_size(); |
|
1578 } |
|
1579 |
|
1580 static size_t large_page_size() { |
|
1581 const size_t large_page_size_example = 4 * M; |
|
1582 return os::page_size_for_region(large_page_size_example, 1); |
|
1583 } |
|
1584 |
|
1585 static void test_page_size_for_region() { |
|
1586 if (UseLargePages) { |
|
1587 const size_t small_page = small_page_size(); |
|
1588 const size_t large_page = large_page_size(); |
|
1589 |
|
1590 if (large_page > small_page) { |
|
1591 size_t num_small_pages_in_large = large_page / small_page; |
|
1592 size_t page = os::page_size_for_region(large_page, num_small_pages_in_large); |
|
1593 |
|
1594 assert_eq(page, small_page); |
|
1595 } |
|
1596 } |
|
1597 } |
|
1598 |
|
1599 static void test_page_size_for_region_alignment() { |
|
1600 if (UseLargePages) { |
|
1601 const size_t small_page = small_page_size(); |
|
1602 const size_t large_page = large_page_size(); |
|
1603 if (large_page > small_page) { |
|
1604 const size_t unaligned_region = large_page + 17; |
|
1605 size_t page = os::page_size_for_region(unaligned_region, 1); |
|
1606 assert_eq(page, small_page); |
|
1607 |
|
1608 const size_t num_pages = 5; |
|
1609 const size_t aligned_region = large_page * num_pages; |
|
1610 page = os::page_size_for_region(aligned_region, num_pages); |
|
1611 assert_eq(page, large_page); |
|
1612 } |
|
1613 } |
|
1614 } |
|
1615 |
|
1616 public: |
|
1617 static void run_tests() { |
|
1618 test_page_size_for_region(); |
|
1619 test_page_size_for_region_alignment(); |
|
1620 } |
|
1621 }; |
|
1622 |
|
1623 void TestOS_test() { |
|
1624 TestOS::run_tests(); |
|
1625 } |
|
1626 |
|
1627 #endif // PRODUCT |