src/share/vm/runtime/os.cpp

changeset 7778
c2ce24504334
parent 7777
340ca8812af9
child 7780
5788dbd1f2d6
equal deleted inserted replaced
7777:340ca8812af9 7778:c2ce24504334
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

mercurial