RFR(s): 8145000: TestOptionsWithRanges.java failure for XX:+UseNUMA -XX:+UseNUMAInterleaving -XX:NUMAInterleaveGranularity=65536

Tom Benson tom.benson at oracle.com
Thu Dec 17 21:28:46 UTC 2015

Hi Sangheon,
I like the new approach, but just have a couple of comments.

I think you should check the VirtualQuery return status and return false 
from protect_pages_individually if zero.

I don't *think* you need to have the "!UseLargePages" restriction 
anymore with this approach, do you?

Actually, I think you could just always use protect_pages_individually 
regardless of whether UseNUMAInterleaving was enabled or not, and the 
right thing would happen.  But this way, you save an unnecessary system 
call plus some overhead.

On 12/17/2015 12:34 AM, sangheon wrote:
> Hi Jesper,
> Thank you for looking at this!
> On 12/16/2015 06:46 AM, Jesper Wilhelmsson wrote:
>> Hi Sangheon,
>> * It seems to me that protect_pages_individually() can only be called 
>> if UseLargePages is false. Still it looks at UseLargePages to decide 
>> page_size. I would prefer if there was an assert(!UseLargePages) at 
>> the start of protect_pages_individually() to emphasize that this code 
>> has not been used or tested with large pages.
>> * I'm not sure if this matters, but it seems to me that if the size 
>> of the area is not an even multiple of pages, you will start 
>> protecting the smaller part, and then continue with page sized areas. 
>> E.g. If page size is 4k and we want to protect a 10k area, we will 
>> start with a 2k block and then take two 4k blocks. This has the 
>> effect that if we pass in a page aligned address, the areas we 
>> protect will not cover one page at a time. This may be a non-issue 
>> though. It depends on if we usually get page aligned addresses and if 
>> it matters if we protect one page at a time or not.
> Your second comment made me to change the function which maybe doesn't 
> need an assert now and  removed potential alignment problem.
> Currently protect_pages_individually() is only called when 
> "UseNUMAInterleaving && !UseLargePages" and 
> protect_pages_indivisually() will always have aligned size as 
> allocate_pages_individually() allocate aligned size. This means, as 
> you pointed, we need an assert to prevent wrong use and would have 
> alignment issue.
> So I changed the function to read currently allocated chunk size(via 
> Windows API) rather than calculating chunk size and then try to 
> protect the chunk.
> With this change, we don't need to care about the flags neither align 
> matter.
>> * You use UINT32_FORMAT to print an uint. %u is the recommended way 
>> to print an uint.
> Fixed.
>> * if (!ret) return false;  We should always use { }
> Fixed.
> Here's a next webrev.
> http://cr.openjdk.java.net/~sangheki/8145000/webrev.01/
> http://cr.openjdk.java.net/~sangheki/8145000/webrev.01_to_00/
> Testing: JPRT (TestOptionsWithRanges.java), RBT 
> (hotspot_all,testlist,noncolo.testlist for Windows only)
> * Added more tests.
> Thanks,
> Sangheon
>> Thanks,
>> /Jesper
>> Den 16/12/15 kl. 01:53, skrev sangheon:
>>> Hi all,
>>> Could I get a couple of reviews for Windows 
>>> NUMAInterleaveGranularity change?
>>> Current Windows implementation can't handle correctly when we 
>>> reserve a heap
>>> with disjoint heap base mode with NUMAInterleaveGranularity.
>>> Windows, os::protect_memory fails in above case, as we are trying to 
>>> protect the
>>> whole reserved heap at one time. But we reserved that area with
>>> separate/contiguous chunks based on NUMAInterleaveGranularity size. 
>>> MSDN
>>> describes to call the API separately.
>>> I changed protect API to be called multiple times if needed.
>>> Skipped adding a test as TestOptionsWithRanges.java is enough.
>>> 'java -XX:+UseNUMA -XX:+UseNUMAInterleaving' is enough to reproduce 
>>> on large
>>> memory Windows machine. However we need to specify heap size if the 
>>> machine
>>> doesn't have large memory. e.g. -Xms30g -Xmx30g
>>> This patch is based on the patch for JDK-8144949 which includes the 
>>> change of
>>> the max range of NUMAInterleaveGranularity to 2G(32bit), 8192G(64bit).
>>> CR: https://bugs.openjdk.java.net/browse/JDK-8145000
>>> Webrev: http://cr.openjdk.java.net/~sangheki/8145000/webrev.00
>>> Testing: JPRT (with TestOptionsWithRanges.java enabled), manual 
>>> tests on Windows
>>> machine(to test on large memory).
>>> Thanks,
>>> Sangheon

More information about the hotspot-gc-dev mailing list