hotspot/src/os/windows/vm/os_windows.cpp
changeset 10527 fedb7f148e85
parent 10494 3f347ed8bd3c
child 10536 28111f5acd64
equal deleted inserted replaced
10526:3e92f211533f 10527:fedb7f148e85
  2704   _hToken = NULL;
  2704   _hToken = NULL;
  2705 }
  2705 }
  2706 
  2706 
  2707 static bool numa_interleaving_init() {
  2707 static bool numa_interleaving_init() {
  2708   bool success = false;
  2708   bool success = false;
  2709   bool use_numa_specified = !FLAG_IS_DEFAULT(UseNUMA);
       
  2710   bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
  2709   bool use_numa_interleaving_specified = !FLAG_IS_DEFAULT(UseNUMAInterleaving);
  2711 
  2710 
  2712   // print a warning if UseNUMA or UseNUMAInterleaving flag is specified on command line
  2711   // print a warning if UseNUMAInterleaving flag is specified on command line
  2713   bool warn_on_failure =  use_numa_specified || use_numa_interleaving_specified;
  2712   bool warn_on_failure = use_numa_interleaving_specified;
  2714 # define WARN(msg) if (warn_on_failure) { warning(msg); }
  2713 # define WARN(msg) if (warn_on_failure) { warning(msg); }
  2715 
  2714 
  2716   // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages)
  2715   // NUMAInterleaveGranularity cannot be less than vm_allocation_granularity (or _large_page_size if using large pages)
  2717   size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
  2716   size_t min_interleave_granularity = UseLargePages ? _large_page_size : os::vm_allocation_granularity();
  2718   NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
  2717   NUMAInterleaveGranularity = align_size_up(NUMAInterleaveGranularity, min_interleave_granularity);
  2719 
  2718 
  2720   if (os::Kernel32Dll::NumaCallsAvailable()) {
  2719   if (os::Kernel32Dll::NumaCallsAvailable()) {
  2721     if (numa_node_list_holder.build()) {
  2720     if (numa_node_list_holder.build()) {
  2722       if (PrintMiscellaneous && Verbose) {
  2721       if (PrintMiscellaneous && Verbose) {
  2723         tty->print("NUMA UsedNodeCount=%d, namely ", os::numa_get_groups_num());
  2722         tty->print("NUMA UsedNodeCount=%d, namely ", numa_node_list_holder.get_count());
  2724         for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
  2723         for (int i = 0; i < numa_node_list_holder.get_count(); i++) {
  2725           tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
  2724           tty->print("%d ", numa_node_list_holder.get_node_list_entry(i));
  2726         }
  2725         }
  2727         tty->print("\n");
  2726         tty->print("\n");
  2728       }
  2727       }
  2732     }
  2731     }
  2733   } else {
  2732   } else {
  2734     WARN("NUMA Interleaving is not supported by the operating system.");
  2733     WARN("NUMA Interleaving is not supported by the operating system.");
  2735   }
  2734   }
  2736   if (!success) {
  2735   if (!success) {
  2737     if (use_numa_specified) WARN("...Ignoring UseNUMA flag.");
       
  2738     if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
  2736     if (use_numa_interleaving_specified) WARN("...Ignoring UseNUMAInterleaving flag.");
  2739   }
  2737   }
  2740   return success;
  2738   return success;
  2741 #undef WARN
  2739 #undef WARN
  2742 }
  2740 }
  2814                                       bytes_to_rq,
  2812                                       bytes_to_rq,
  2815                                       flags,
  2813                                       flags,
  2816                                       prot);
  2814                                       prot);
  2817       } else {
  2815       } else {
  2818         // get the next node to use from the used_node_list
  2816         // get the next node to use from the used_node_list
  2819         DWORD node = numa_node_list_holder.get_node_list_entry(count % os::numa_get_groups_num());
  2817         assert(numa_node_list_holder.get_count() > 0, "Multiple NUMA nodes expected");
       
  2818         DWORD node = numa_node_list_holder.get_node_list_entry(count % numa_node_list_holder.get_count());
  2820         p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
  2819         p_new = (char *)os::Kernel32Dll::VirtualAllocExNuma(hProc,
  2821                                                             next_alloc_addr,
  2820                                                             next_alloc_addr,
  2822                                                             bytes_to_rq,
  2821                                                             bytes_to_rq,
  2823                                                             flags,
  2822                                                             flags,
  2824                                                             prot,
  2823                                                             prot,
  3130 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
  3129 void os::realign_memory(char *addr, size_t bytes, size_t alignment_hint) { }
  3131 void os::free_memory(char *addr, size_t bytes)         { }
  3130 void os::free_memory(char *addr, size_t bytes)         { }
  3132 void os::numa_make_global(char *addr, size_t bytes)    { }
  3131 void os::numa_make_global(char *addr, size_t bytes)    { }
  3133 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint)    { }
  3132 void os::numa_make_local(char *addr, size_t bytes, int lgrp_hint)    { }
  3134 bool os::numa_topology_changed()                       { return false; }
  3133 bool os::numa_topology_changed()                       { return false; }
  3135 size_t os::numa_get_groups_num()                       { return numa_node_list_holder.get_count(); }
  3134 size_t os::numa_get_groups_num()                       { return MAX2(numa_node_list_holder.get_count(), 1); }
  3136 int os::numa_get_group_id()                            { return 0; }
  3135 int os::numa_get_group_id()                            { return 0; }
  3137 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
  3136 size_t os::numa_get_leaf_groups(int *ids, size_t size) {
  3138   // check for size bigger than actual groups_num
  3137   if (numa_node_list_holder.get_count() == 0 && size > 0) {
  3139   size = MIN2(size, numa_get_groups_num());
  3138     // Provide an answer for UMA systems
  3140   for (int i = 0; i < (int)size; i++) {
  3139     ids[0] = 0;
  3141     ids[i] = numa_node_list_holder.get_node_list_entry(i);
  3140     return 1;
  3142   }
  3141   } else {
  3143   return size;
  3142     // check for size bigger than actual groups_num
       
  3143     size = MIN2(size, numa_get_groups_num());
       
  3144     for (int i = 0; i < (int)size; i++) {
       
  3145       ids[i] = numa_node_list_holder.get_node_list_entry(i);
       
  3146     }
       
  3147     return size;
       
  3148   }
  3144 }
  3149 }
  3145 
  3150 
  3146 bool os::get_page_info(char *start, page_info* info) {
  3151 bool os::get_page_info(char *start, page_info* info) {
  3147   return false;
  3152   return false;
  3148 }
  3153 }
  3765   NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
  3770   NOT_PRODUCT(if (PrintMiscellaneous && Verbose) nx_check_protection());
  3766 #endif
  3771 #endif
  3767 
  3772 
  3768   // initialize thread priority policy
  3773   // initialize thread priority policy
  3769   prio_init();
  3774   prio_init();
       
  3775 
       
  3776   if (UseNUMA && !ForceNUMA) {
       
  3777     UseNUMA = false; // We don't fully support this yet
       
  3778   }
  3770 
  3779 
  3771   if (UseNUMAInterleaving) {
  3780   if (UseNUMAInterleaving) {
  3772     // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
  3781     // first check whether this Windows OS supports VirtualAllocExNuma, if not ignore this flag
  3773     bool success = numa_interleaving_init();
  3782     bool success = numa_interleaving_init();
  3774     if (!success) UseNUMAInterleaving = false;
  3783     if (!success) UseNUMAInterleaving = false;