src/hotspot/os/linux/os_linux.cpp
changeset 52396 e292e94b448a
parent 52302 912b79d983d9
child 52581 d402a406bbc3
equal deleted inserted replaced
52395:5ca10e4e052c 52396:e292e94b448a
  5954 
  5954 
  5955 /////////////// Unit tests ///////////////
  5955 /////////////// Unit tests ///////////////
  5956 
  5956 
  5957 #ifndef PRODUCT
  5957 #ifndef PRODUCT
  5958 
  5958 
  5959 #define test_log(...)              \
       
  5960   do {                             \
       
  5961     if (VerboseInternalVMTests) {  \
       
  5962       tty->print_cr(__VA_ARGS__);  \
       
  5963       tty->flush();                \
       
  5964     }                              \
       
  5965   } while (false)
       
  5966 
       
  5967 class TestReserveMemorySpecial : AllStatic {
  5959 class TestReserveMemorySpecial : AllStatic {
  5968  public:
  5960  public:
  5969   static void small_page_write(void* addr, size_t size) {
  5961   static void small_page_write(void* addr, size_t size) {
  5970     size_t page_size = os::vm_page_size();
  5962     size_t page_size = os::vm_page_size();
  5971 
  5963 
  5977 
  5969 
  5978   static void test_reserve_memory_special_huge_tlbfs_only(size_t size) {
  5970   static void test_reserve_memory_special_huge_tlbfs_only(size_t size) {
  5979     if (!UseHugeTLBFS) {
  5971     if (!UseHugeTLBFS) {
  5980       return;
  5972       return;
  5981     }
  5973     }
  5982 
       
  5983     test_log("test_reserve_memory_special_huge_tlbfs_only(" SIZE_FORMAT ")", size);
       
  5984 
  5974 
  5985     char* addr = os::Linux::reserve_memory_special_huge_tlbfs_only(size, NULL, false);
  5975     char* addr = os::Linux::reserve_memory_special_huge_tlbfs_only(size, NULL, false);
  5986 
  5976 
  5987     if (addr != NULL) {
  5977     if (addr != NULL) {
  5988       small_page_write(addr, size);
  5978       small_page_write(addr, size);
  6038     // mapping will serve as a value for a "good" req_addr (case 2). The second
  6028     // mapping will serve as a value for a "good" req_addr (case 2). The second
  6039     // mapping, still intact, as "bad" req_addr (case 3).
  6029     // mapping, still intact, as "bad" req_addr (case 3).
  6040     ::munmap(mapping1, mapping_size);
  6030     ::munmap(mapping1, mapping_size);
  6041 
  6031 
  6042     // Case 1
  6032     // Case 1
  6043     test_log("%s, req_addr NULL:", __FUNCTION__);
       
  6044     test_log("size            align           result");
       
  6045 
       
  6046     for (int i = 0; i < num_sizes; i++) {
  6033     for (int i = 0; i < num_sizes; i++) {
  6047       const size_t size = sizes[i];
  6034       const size_t size = sizes[i];
  6048       for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) {
  6035       for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) {
  6049         char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, NULL, false);
  6036         char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, NULL, false);
  6050         test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " ->  " PTR_FORMAT " %s",
       
  6051                  size, alignment, p2i(p), (p != NULL ? "" : "(failed)"));
       
  6052         if (p != NULL) {
  6037         if (p != NULL) {
  6053           assert(is_aligned(p, alignment), "must be");
  6038           assert(is_aligned(p, alignment), "must be");
  6054           small_page_write(p, size);
  6039           small_page_write(p, size);
  6055           os::Linux::release_memory_special_huge_tlbfs(p, size);
  6040           os::Linux::release_memory_special_huge_tlbfs(p, size);
  6056         }
  6041         }
  6057       }
  6042       }
  6058     }
  6043     }
  6059 
  6044 
  6060     // Case 2
  6045     // Case 2
  6061     test_log("%s, req_addr non-NULL:", __FUNCTION__);
       
  6062     test_log("size            align           req_addr         result");
       
  6063 
       
  6064     for (int i = 0; i < num_sizes; i++) {
  6046     for (int i = 0; i < num_sizes; i++) {
  6065       const size_t size = sizes[i];
  6047       const size_t size = sizes[i];
  6066       for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) {
  6048       for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) {
  6067         char* const req_addr = align_up(mapping1, alignment);
  6049         char* const req_addr = align_up(mapping1, alignment);
  6068         char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false);
  6050         char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false);
  6069         test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " ->  " PTR_FORMAT " %s",
       
  6070                  size, alignment, p2i(req_addr), p2i(p),
       
  6071                  ((p != NULL ? (p == req_addr ? "(exact match)" : "") : "(failed)")));
       
  6072         if (p != NULL) {
  6051         if (p != NULL) {
  6073           assert(p == req_addr, "must be");
  6052           assert(p == req_addr, "must be");
  6074           small_page_write(p, size);
  6053           small_page_write(p, size);
  6075           os::Linux::release_memory_special_huge_tlbfs(p, size);
  6054           os::Linux::release_memory_special_huge_tlbfs(p, size);
  6076         }
  6055         }
  6077       }
  6056       }
  6078     }
  6057     }
  6079 
  6058 
  6080     // Case 3
  6059     // Case 3
  6081     test_log("%s, req_addr non-NULL with preexisting mapping:", __FUNCTION__);
       
  6082     test_log("size            align           req_addr         result");
       
  6083 
       
  6084     for (int i = 0; i < num_sizes; i++) {
  6060     for (int i = 0; i < num_sizes; i++) {
  6085       const size_t size = sizes[i];
  6061       const size_t size = sizes[i];
  6086       for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) {
  6062       for (size_t alignment = ag; is_aligned(size, alignment); alignment *= 2) {
  6087         char* const req_addr = align_up(mapping2, alignment);
  6063         char* const req_addr = align_up(mapping2, alignment);
  6088         char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false);
  6064         char* p = os::Linux::reserve_memory_special_huge_tlbfs_mixed(size, alignment, req_addr, false);
  6089         test_log(SIZE_FORMAT_HEX " " SIZE_FORMAT_HEX " " PTR_FORMAT " ->  " PTR_FORMAT " %s",
       
  6090                  size, alignment, p2i(req_addr), p2i(p), ((p != NULL ? "" : "(failed)")));
       
  6091         // as the area around req_addr contains already existing mappings, the API should always
  6065         // as the area around req_addr contains already existing mappings, the API should always
  6092         // return NULL (as per contract, it cannot return another address)
  6066         // return NULL (as per contract, it cannot return another address)
  6093         assert(p == NULL, "must be");
  6067         assert(p == NULL, "must be");
  6094       }
  6068       }
  6095     }
  6069     }
  6110   static void test_reserve_memory_special_shm(size_t size, size_t alignment) {
  6084   static void test_reserve_memory_special_shm(size_t size, size_t alignment) {
  6111     if (!UseSHM) {
  6085     if (!UseSHM) {
  6112       return;
  6086       return;
  6113     }
  6087     }
  6114 
  6088 
  6115     test_log("test_reserve_memory_special_shm(" SIZE_FORMAT ", " SIZE_FORMAT ")", size, alignment);
       
  6116 
       
  6117     char* addr = os::Linux::reserve_memory_special_shm(size, alignment, NULL, false);
  6089     char* addr = os::Linux::reserve_memory_special_shm(size, alignment, NULL, false);
  6118 
  6090 
  6119     if (addr != NULL) {
  6091     if (addr != NULL) {
  6120       assert(is_aligned(addr, alignment), "Check");
  6092       assert(is_aligned(addr, alignment), "Check");
  6121       assert(is_aligned(addr, os::large_page_size()), "Check");
  6093       assert(is_aligned(addr, os::large_page_size()), "Check");