mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-20 19:14:38 +02:00
Merge
This commit is contained in:
commit
6db67f9317
14 changed files with 72 additions and 94 deletions
|
@ -1291,15 +1291,24 @@ bool os::stack_shadow_pages_available(Thread *thread, methodHandle method) {
|
|||
return (sp > (stack_limit + reserved_area));
|
||||
}
|
||||
|
||||
size_t os::page_size_for_region(size_t region_size, size_t min_pages) {
|
||||
size_t os::page_size_for_region(size_t region_min_size, size_t region_max_size,
|
||||
uint min_pages)
|
||||
{
|
||||
assert(min_pages > 0, "sanity");
|
||||
if (UseLargePages) {
|
||||
const size_t max_page_size = region_size / min_pages;
|
||||
const size_t max_page_size = region_max_size / min_pages;
|
||||
|
||||
for (size_t i = 0; _page_sizes[i] != 0; ++i) {
|
||||
const size_t page_size = _page_sizes[i];
|
||||
if (page_size <= max_page_size && is_size_aligned(region_size, page_size)) {
|
||||
return page_size;
|
||||
for (unsigned int i = 0; _page_sizes[i] != 0; ++i) {
|
||||
const size_t sz = _page_sizes[i];
|
||||
const size_t mask = sz - 1;
|
||||
if ((region_min_size & mask) == 0 && (region_max_size & mask) == 0) {
|
||||
// The largest page size with no fragmentation.
|
||||
return sz;
|
||||
}
|
||||
|
||||
if (sz <= max_page_size) {
|
||||
// The largest page size that satisfies the min_pages requirement.
|
||||
return sz;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1527,63 +1536,3 @@ os::SuspendResume::State os::SuspendResume::switch_state(os::SuspendResume::Stat
|
|||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/////////////// Unit tests ///////////////
|
||||
|
||||
#ifndef PRODUCT
|
||||
|
||||
#define assert_eq(a,b) assert(a == b, err_msg(SIZE_FORMAT " != " SIZE_FORMAT, a, b))
|
||||
|
||||
class TestOS : AllStatic {
|
||||
static size_t small_page_size() {
|
||||
return os::vm_page_size();
|
||||
}
|
||||
|
||||
static size_t large_page_size() {
|
||||
const size_t large_page_size_example = 4 * M;
|
||||
return os::page_size_for_region(large_page_size_example, 1);
|
||||
}
|
||||
|
||||
static void test_page_size_for_region() {
|
||||
if (UseLargePages) {
|
||||
const size_t small_page = small_page_size();
|
||||
const size_t large_page = large_page_size();
|
||||
|
||||
if (large_page > small_page) {
|
||||
size_t num_small_pages_in_large = large_page / small_page;
|
||||
size_t page = os::page_size_for_region(large_page, num_small_pages_in_large);
|
||||
|
||||
assert_eq(page, small_page);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void test_page_size_for_region_alignment() {
|
||||
if (UseLargePages) {
|
||||
const size_t small_page = small_page_size();
|
||||
const size_t large_page = large_page_size();
|
||||
if (large_page > small_page) {
|
||||
const size_t unaligned_region = large_page + 17;
|
||||
size_t page = os::page_size_for_region(unaligned_region, 1);
|
||||
assert_eq(page, small_page);
|
||||
|
||||
const size_t num_pages = 5;
|
||||
const size_t aligned_region = large_page * num_pages;
|
||||
page = os::page_size_for_region(aligned_region, num_pages);
|
||||
assert_eq(page, large_page);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public:
|
||||
static void run_tests() {
|
||||
test_page_size_for_region();
|
||||
test_page_size_for_region_alignment();
|
||||
}
|
||||
};
|
||||
|
||||
void TestOS_test() {
|
||||
TestOS::run_tests();
|
||||
}
|
||||
|
||||
#endif // PRODUCT
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue