Mercurial > hg > graal-jvmci-8
comparison src/os/linux/vm/os_linux.cpp @ 656:6bdd6923ba16
6541756: Reduce executable C-heap
Summary: Add executable parameters to reserve_memory and commit_memory to reduce executable memory to only the Code Heap.
Reviewed-by: xlu, kvn, acorn
author | coleenp |
---|---|
date | Wed, 25 Mar 2009 14:19:20 -0400 |
parents | bd441136a5ce |
children | 956304450e80 |
comparison
equal
deleted
inserted
replaced
655:60bfce711da4 | 656:6bdd6923ba16 |
---|---|
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 |