RFR(XL): 8220310: Implementation: NUMA-Aware Memory Allocation for G1, Mutator (1/3)

Per Liden per.liden at oracle.com
Thu Oct 24 12:00:28 UTC 2019


Hi Sangheon,

On 10/23/19 6:20 PM, sangheon.kim at oracle.com wrote:
> Hi Per,
> 
> Thanks for taking a look at this.
> 
> I agree all your comments and here's the webrev.
> - All comments from Per.
> - Move G1PageBasedVirtualSpace::page_size() near to page_start() from Kim.
> 
> Webrev:
> http://cr.openjdk.java.net/~sangheki/8220310/webrev.6
> http://cr.openjdk.java.net/~sangheki/8220310/webrev.6.inc
> Testing: build test for linux, solaris, windows and mac.

Thanks for fixing. os changes look good to me.

/Per

> 
> FYI, as I think existing numa related API names and -1 stuff seem not 
> good, I planned to refine those later after pushing. But as you said 
> following existing rule and then refine all together later seems better.
> 
> Thanks,
> Sangheon
> 
> 
> On 10/23/19 1:21 AM, Per Liden wrote:
>> Hi Sangheon,
>>
>> I noticed that this patch adds os::numa_get_address_id(). That name is 
>> misleading as it doesn't return an "address id", but a "numa node id". 
>> However, the terminology used in the os class for numa node is "group" 
>> (for example, numa_get_groups_num, numa_get_group_id, etc). So I'd 
>> suggest we instead name this os::numa_get_group_id(void* address), 
>> i.e. an overload of os::numa_get_group_id().
>>
>> Btw, I think that the numa related names used in the os class are odd, 
>> but I guess that are brought over from Solaris. We can refine those at 
>> some later time if we want, but for now I think we should follow the 
>> naming convention that we have there.
>>
>> Also, I don't think this function should print warnings, as that's up 
>> to the caller to decide what to do, what to print, etc.
>>
>> Furthermore, I suggest we remove os::InvalidNUMAId. Other numa 
>> functions in the os class returns -1 on error, so I think we should do 
>> that here too.
>>
>> Here's a patch with the proposed changes:
>>
>>
>> diff --git a/src/hotspot/os/linux/os_linux.cpp 
>> b/src/hotspot/os/linux/os_linux.cpp
>> --- a/src/hotspot/os/linux/os_linux.cpp
>> +++ b/src/hotspot/os/linux/os_linux.cpp
>> @@ -3007,7 +3007,7 @@
>>    return 0;
>>  }
>>
>> -int os::numa_get_address_id(void* address) {
>> +int os::numa_get_group_id(void* address) {
>>  #ifndef MPOL_F_NODE
>>  #define MPOL_F_NODE     (1<<0)  // Return next IL mode instead of 
>> node mask
>>  #endif
>> @@ -3016,11 +3016,10 @@
>>  #define MPOL_F_ADDR     (1<<1)  // Look up VMA using address
>>  #endif
>>
>> -  int id = InvalidNUMAId;
>> +  int id = 0;
>>
>>    if (syscall(SYS_get_mempolicy, &id, NULL, 0, address, MPOL_F_NODE | 
>> MPOL_F_ADDR) == -1) {
>> -    warning("Failed to get numa id at " PTR_FORMAT " with errno=%d", 
>> p2i(address), errno);
>> -    return InvalidNUMAId;
>> +    return -1;
>>    }
>>    return id;
>>  }
>> diff --git a/src/hotspot/share/gc/g1/g1NUMA.cpp 
>> b/src/hotspot/share/gc/g1/g1NUMA.cpp
>> --- a/src/hotspot/share/gc/g1/g1NUMA.cpp
>> +++ b/src/hotspot/share/gc/g1/g1NUMA.cpp
>> @@ -164,7 +164,7 @@
>>
>>  uint G1NUMA::index_of_address(HeapWord *address) const {
>>    int numa_id = os::numa_get_address_id((void*)address);
>> -  if (numa_id == os::InvalidNUMAId) {
>> +  if (numa_id == -1) {
>>      return UnknownNodeIndex;
>>    } else {
>>      return index_of_node_id(numa_id);
>> @@ -201,7 +201,7 @@
>>    if (!is_enabled()) {
>>      return;
>>    }
>> -
>> +
>>    if (size_in_bytes == 0) {
>>      return;
>>    }
>> diff --git a/src/hotspot/share/runtime/os.hpp 
>> b/src/hotspot/share/runtime/os.hpp
>> --- a/src/hotspot/share/runtime/os.hpp
>> +++ b/src/hotspot/share/runtime/os.hpp
>> @@ -374,10 +374,7 @@
>>    static size_t numa_get_leaf_groups(int *ids, size_t size);
>>    static bool   numa_topology_changed();
>>    static int    numa_get_group_id();
>> -
>> -  static const int InvalidNUMAId = -1;
>> -
>> -  static int numa_get_address_id(void* address);
>> +  static int    numa_get_group_id(void* address);
>>
>>    // Page manipulation
>>    struct page_info {
>>
>>
>> cheers,
>> Per
>>
>>
>> On 10/16/19 7:54 PM, sangheon.kim at oracle.com wrote:
>>> Hi Kim, Stefan and Thomas,
>>>
>>> Many thanks for the reviews and suggestions!
>>>
>>> Kim,
>>> I will move page_size() near page_start() before push as you suggested.
>>> As you know, all 3 patches will be pushed together though.
>>>
>>> Thanks,
>>> Sangheon
>>>
>>>
>>> On 10/16/19 7:00 AM, Kim Barrett wrote:
>>>>> On Oct 15, 2019, at 10:33 AM, sangheon.kim at oracle.com wrote:
>>>>>
>>>>> Hi all,
>>>>>
>>>>> Here's revised webrev which addresses:
>>>>> 1) G1RegionToSpaceMapper checks mtJavaHeap and then conditionally 
>>>>> calls G1NUMA::request_memory_on_node() (Kim)
>>>>> 2) The signature of G1NUMA::request_memory_on_node(void* address, 
>>>>> ,) is changed to have actual address instead of page index. (Stefan)
>>>>> 3) Some local variable name changes at G1RegionToSpaceMapper. i -> 
>>>>> region_idx, idx -> page_idx (for local style, used idx instead of 
>>>>> index)
>>>>>
>>>>> webrev:
>>>>> http://cr.openjdk.java.net/~sangheki/8220310/webrev.5/
>>>>> http://cr.openjdk.java.net/~sangheki/8220310/webrev.5.inc/
>>>>> Testing: hs-tier 1 ~ 5, with/without UseNUMA
>>>> Looks good.
>>>>
>>>> In g1PageBasedVirtualSpace.cpp, could the newly added definition of 
>>>> page_size()
>>>> be moved to be near the existing definition of page_start()? I don’t 
>>>> need a new
>>>> webrev if you move it.
>>>>
>>>
> 


More information about the hotspot-runtime-dev mailing list