2267 |
2267 |
2268 // NOTE: Linux kernel does not really reserve the pages for us. |
2268 // NOTE: Linux kernel does not really reserve the pages for us. |
2269 // All it does is to check if there are enough free pages |
2269 // All it does is to check if there are enough free pages |
2270 // left at the time of mmap(). This could be a potential |
2270 // left at the time of mmap(). This could be a potential |
2271 // problem. |
2271 // problem. |
2272 bool os::commit_memory(char* addr, size_t size) { |
2272 bool os::commit_memory(char* addr, size_t size, bool exec) { |
2273 uintptr_t res = (uintptr_t) ::mmap(addr, size, |
2273 int prot = exec ? PROT_READ|PROT_WRITE|PROT_EXEC : PROT_READ|PROT_WRITE; |
2274 PROT_READ|PROT_WRITE|PROT_EXEC, |
2274 uintptr_t res = (uintptr_t) ::mmap(addr, size, prot, |
2275 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); |
2275 MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0); |
2276 return res != (uintptr_t) MAP_FAILED; |
2276 return res != (uintptr_t) MAP_FAILED; |
2277 } |
2277 } |
2278 |
2278 |
2279 bool os::commit_memory(char* addr, size_t size, size_t alignment_hint) { |
2279 bool os::commit_memory(char* addr, size_t size, size_t alignment_hint, |
2280 return commit_memory(addr, size); |
2280 bool exec) { |
|
2281 return commit_memory(addr, size, exec); |
2281 } |
2282 } |
2282 |
2283 |
2283 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } |
2284 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { } |
2284 |
2285 |
2285 void os::free_memory(char *addr, size_t bytes) { |
2286 void os::free_memory(char *addr, size_t bytes) { |
2415 os::Linux::numa_tonode_memory_func_t os::Linux::_numa_tonode_memory; |
2416 os::Linux::numa_tonode_memory_func_t os::Linux::_numa_tonode_memory; |
2416 os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory; |
2417 os::Linux::numa_interleave_memory_func_t os::Linux::_numa_interleave_memory; |
2417 unsigned long* os::Linux::_numa_all_nodes; |
2418 unsigned long* os::Linux::_numa_all_nodes; |
2418 |
2419 |
2419 bool os::uncommit_memory(char* addr, size_t size) { |
2420 bool os::uncommit_memory(char* addr, size_t size) { |
2420 return ::mmap(addr, size, |
2421 return ::mmap(addr, size, PROT_NONE, |
2421 PROT_READ|PROT_WRITE|PROT_EXEC, |
|
2422 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0) |
2422 MAP_PRIVATE|MAP_FIXED|MAP_NORESERVE|MAP_ANONYMOUS, -1, 0) |
2423 != MAP_FAILED; |
2423 != MAP_FAILED; |
2424 } |
2424 } |
2425 |
2425 |
2426 static address _highest_vm_reserved_address = NULL; |
2426 static address _highest_vm_reserved_address = NULL; |
2439 if (fixed) { |
2439 if (fixed) { |
2440 assert((uintptr_t)requested_addr % os::Linux::page_size() == 0, "unaligned address"); |
2440 assert((uintptr_t)requested_addr % os::Linux::page_size() == 0, "unaligned address"); |
2441 flags |= MAP_FIXED; |
2441 flags |= MAP_FIXED; |
2442 } |
2442 } |
2443 |
2443 |
2444 addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE|PROT_EXEC, |
2444 // Map uncommitted pages PROT_READ and PROT_WRITE, change access |
|
2445 // to PROT_EXEC if executable when we commit the page. |
|
2446 addr = (char*)::mmap(requested_addr, bytes, PROT_READ|PROT_WRITE, |
2445 flags, -1, 0); |
2447 flags, -1, 0); |
2446 |
2448 |
2447 if (addr != MAP_FAILED) { |
2449 if (addr != MAP_FAILED) { |
2448 // anon_mmap() should only get called during VM initialization, |
2450 // anon_mmap() should only get called during VM initialization, |
2449 // don't need lock (actually we can skip locking even it can be called |
2451 // don't need lock (actually we can skip locking even it can be called |
2580 |
2582 |
2581 #ifndef SHM_HUGETLB |
2583 #ifndef SHM_HUGETLB |
2582 #define SHM_HUGETLB 04000 |
2584 #define SHM_HUGETLB 04000 |
2583 #endif |
2585 #endif |
2584 |
2586 |
2585 char* os::reserve_memory_special(size_t bytes, char* req_addr) { |
2587 char* os::reserve_memory_special(size_t bytes, char* req_addr, bool exec) { |
|
2588 // "exec" is passed in but not used. Creating the shared image for |
|
2589 // the code cache doesn't have an SHM_X executable permission to check. |
2586 assert(UseLargePages, "only for large pages"); |
2590 assert(UseLargePages, "only for large pages"); |
2587 |
2591 |
2588 key_t key = IPC_PRIVATE; |
2592 key_t key = IPC_PRIVATE; |
2589 char *addr; |
2593 char *addr; |
2590 |
2594 |