hotspot/src/os/linux/vm/os_linux.cpp
changeset 2268 bea8be80ec88
parent 2259 d3c946e7f127
child 2358 7c8346929fc6
equal deleted inserted replaced
2267:2e18a3d0155b 2268:bea8be80ec88
  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