comparison src/share/vm/runtime/os.cpp @ 22976:5788dbd1f2d6

8066875: VirtualSpace does not use large pages Reviewed-by: stefank, tschatzl, anoll, thartmann
author ehelin
date Fri, 16 Jan 2015 10:29:12 +0100
parents c2ce24504334
children dd9cc155639c d2dd79a4fd69
comparison
equal deleted inserted replaced
22975:cc5c3ef1f03a 22976:5788dbd1f2d6
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_size, size_t min_pages) { 1318 size_t os::page_size_for_region(size_t region_size, size_t min_pages, bool must_be_aligned) {
1319 assert(min_pages > 0, "sanity"); 1319 assert(min_pages > 0, "sanity");
1320 if (UseLargePages) { 1320 if (UseLargePages) {
1321 const size_t max_page_size = region_size / min_pages; 1321 const size_t max_page_size = region_size / min_pages;
1322 1322
1323 for (size_t i = 0; _page_sizes[i] != 0; ++i) { 1323 for (size_t i = 0; _page_sizes[i] != 0; ++i) {
1324 const size_t page_size = _page_sizes[i]; 1324 const size_t page_size = _page_sizes[i];
1325 if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) { 1325 if (page_size <= max_page_size) {
1326 return page_size; 1326 if (!must_be_aligned || is_size_aligned(region_size, page_size)) {
1327 return page_size;
1328 }
1327 } 1329 }
1328 } 1330 }
1329 } 1331 }
1330 1332
1331 return vm_page_size(); 1333 return vm_page_size();
1334 }
1335
1336 size_t os::page_size_for_region_aligned(size_t region_size, size_t min_pages) {
1337 return page_size_for_region(region_size, min_pages, true);
1338 }
1339
1340 size_t os::page_size_for_region_unaligned(size_t region_size, size_t min_pages) {
1341 return page_size_for_region(region_size, min_pages, false);
1332 } 1342 }
1333 1343
1334 #ifndef PRODUCT 1344 #ifndef PRODUCT
1335 void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count) 1345 void os::trace_page_sizes(const char* str, const size_t* page_sizes, int count)
1336 { 1346 {
1577 return os::vm_page_size(); 1587 return os::vm_page_size();
1578 } 1588 }
1579 1589
1580 static size_t large_page_size() { 1590 static size_t large_page_size() {
1581 const size_t large_page_size_example = 4 * M; 1591 const size_t large_page_size_example = 4 * M;
1582 return os::page_size_for_region(large_page_size_example, 1); 1592 return os::page_size_for_region_aligned(large_page_size_example, 1);
1583 } 1593 }
1584 1594
1585 static void test_page_size_for_region() { 1595 static void test_page_size_for_region_aligned() {
1586 if (UseLargePages) { 1596 if (UseLargePages) {
1587 const size_t small_page = small_page_size(); 1597 const size_t small_page = small_page_size();
1588 const size_t large_page = large_page_size(); 1598 const size_t large_page = large_page_size();
1589 1599
1590 if (large_page > small_page) { 1600 if (large_page > small_page) {
1591 size_t num_small_pages_in_large = large_page / small_page; 1601 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); 1602 size_t page = os::page_size_for_region_aligned(large_page, num_small_pages_in_large);
1593 1603
1594 assert_eq(page, small_page); 1604 assert_eq(page, small_page);
1595 } 1605 }
1596 } 1606 }
1597 } 1607 }
1600 if (UseLargePages) { 1610 if (UseLargePages) {
1601 const size_t small_page = small_page_size(); 1611 const size_t small_page = small_page_size();
1602 const size_t large_page = large_page_size(); 1612 const size_t large_page = large_page_size();
1603 if (large_page > small_page) { 1613 if (large_page > small_page) {
1604 const size_t unaligned_region = large_page + 17; 1614 const size_t unaligned_region = large_page + 17;
1605 size_t page = os::page_size_for_region(unaligned_region, 1); 1615 size_t page = os::page_size_for_region_aligned(unaligned_region, 1);
1606 assert_eq(page, small_page); 1616 assert_eq(page, small_page);
1607 1617
1608 const size_t num_pages = 5; 1618 const size_t num_pages = 5;
1609 const size_t aligned_region = large_page * num_pages; 1619 const size_t aligned_region = large_page * num_pages;
1610 page = os::page_size_for_region(aligned_region, num_pages); 1620 page = os::page_size_for_region_aligned(aligned_region, num_pages);
1611 assert_eq(page, large_page); 1621 assert_eq(page, large_page);
1612 } 1622 }
1623 }
1624 }
1625
1626 static void test_page_size_for_region_unaligned() {
1627 if (UseLargePages) {
1628 // Given exact page size, should return that page size.
1629 for (size_t i = 0; os::_page_sizes[i] != 0; i++) {
1630 size_t expected = os::_page_sizes[i];
1631 size_t actual = os::page_size_for_region_unaligned(expected, 1);
1632 assert_eq(expected, actual);
1633 }
1634
1635 // Given slightly larger size than a page size, return the page size.
1636 for (size_t i = 0; os::_page_sizes[i] != 0; i++) {
1637 size_t expected = os::_page_sizes[i];
1638 size_t actual = os::page_size_for_region_unaligned(expected + 17, 1);
1639 assert_eq(expected, actual);
1640 }
1641
1642 // Given a slightly smaller size than a page size,
1643 // return the next smaller page size.
1644 if (os::_page_sizes[1] > os::_page_sizes[0]) {
1645 size_t expected = os::_page_sizes[0];
1646 size_t actual = os::page_size_for_region_unaligned(os::_page_sizes[1] - 17, 1);
1647 assert_eq(actual, expected);
1648 }
1649
1650 // Return small page size for values less than a small page.
1651 size_t small_page = small_page_size();
1652 size_t actual = os::page_size_for_region_unaligned(small_page - 17, 1);
1653 assert_eq(small_page, actual);
1613 } 1654 }
1614 } 1655 }
1615 1656
1616 public: 1657 public:
1617 static void run_tests() { 1658 static void run_tests() {
1618 test_page_size_for_region(); 1659 test_page_size_for_region_aligned();
1619 test_page_size_for_region_alignment(); 1660 test_page_size_for_region_alignment();
1661 test_page_size_for_region_unaligned();
1620 } 1662 }
1621 }; 1663 };
1622 1664
1623 void TestOS_test() { 1665 void TestOS_test() {
1624 TestOS::run_tests(); 1666 TestOS::run_tests();