6830069: UseLargePages is broken on Win64
Summary: Making VirtualAlloc/VirtualProtect two calls for PAGE_EXECUTE_READWRITE doesn't work for MEM_LARGE_PAGES.
Reviewed-by: xlu, kvn, jcoomes
--- a/hotspot/src/os/windows/vm/os_windows.cpp Fri Apr 17 12:22:18 2009 -0700
+++ b/hotspot/src/os/windows/vm/os_windows.cpp Tue Apr 21 16:12:51 2009 -0400
@@ -2632,6 +2632,8 @@
char* os::reserve_memory_special(size_t bytes, char* addr, bool exec) {
+ const DWORD prot = exec ? PAGE_EXECUTE_READWRITE : PAGE_READWRITE;
+
if (UseLargePagesIndividualAllocation) {
if (TracePageSizes && Verbose) {
tty->print_cr("Reserving large pages individually.");
@@ -2694,13 +2696,7 @@
p_new = (char *) VirtualAlloc(next_alloc_addr,
bytes_to_rq,
MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES,
- PAGE_READWRITE);
- if (p_new != NULL && exec) {
- DWORD oldprot;
- // Windows doc says to use VirtualProtect to get execute permissions
- VirtualProtect(next_alloc_addr, bytes_to_rq,
- PAGE_EXECUTE_READWRITE, &oldprot);
- }
+ prot);
}
if (p_new == NULL) {
@@ -2729,12 +2725,7 @@
} else {
// normal policy just allocate it all at once
DWORD flag = MEM_RESERVE | MEM_COMMIT | MEM_LARGE_PAGES;
- char * res = (char *)VirtualAlloc(NULL, bytes, flag, PAGE_READWRITE);
- if (res != NULL && exec) {
- DWORD oldprot;
- // Windows doc says to use VirtualProtect to get execute permissions
- VirtualProtect(res, bytes, PAGE_EXECUTE_READWRITE, &oldprot);
- }
+ char * res = (char *)VirtualAlloc(NULL, bytes, flag, prot);
return res;
}
}