RFR (XS) 8016825 Large pages for the heap broken on Windows for compressed oops

Bengt Rutisson bengt.rutisson at oracle.com
Tue Jul 16 12:14:55 UTC 2013


Hi Thomas,

Thanks for fixing this.

According to the MSDN documentation for VirtualAlloc the address 
parameter can be rounded down if it is not properly aligned:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx

Does that mean that we in os::reserve_memory_special() should assert 
that addr is large page aligned? If it is not we will probably get a 
different return address than we asked for anyway. I had a quick look 
through the call chain. I am not sure it is always large page aligned. 
Do we need to align it in ReservedSpace::initialize() or should we just 
assert that it is aligned? Stefan's large page changes enforces much 
more alignment, so maybe it is worth waiting with this patch until he 
has pushed his changes?

Some minor comments:

The webrev looks a bit odd here. Is there a format issue in the patch or 
is it just the webrev?
http://cr.openjdk.java.net/~tschatzl/8016825/webrev/src/os/posix/vm/os_posix.cpp.frames.html

You use Verbose for logging in your test. I think that is fine. Stefan 
recently added a new flag in one of his webrevs called 
VerboseInternalVMTests:
http://cr.openjdk.java.net/~stefank/8007074/webrev.00/src/share/vm/runtime/globals.hpp.udiff.html
That has not been pushed yet, but maybe it is worth introducing this 
flag with your change instead?

Minor format thing in the test code. You have spaces between the type 
and the star. I think we normally don't have that. So for example:

char * result =

should probably be:

char* result =

BTW, maybe we can have a better name than result? Maybe base_address?


I don't understand the allocation sizes. Why do we pick 16 large pages?

Would it be possible to do it like this instead?

* First allocate 3 large pages at any address
* Remember the returned address (base)
* Release the memory
* Allocate 2 large pages at (base address + one large page size)

I think that will reduce the risk of entering this case:

5627     if (actual_location == NULL) {
5628       if (Verbose) {
5629         gclog_or_tty->print("Failed to allocate any memory at 
"PTR_FORMAT" size "SIZE_FORMAT". Skipping remainder of test.",
5630           expected_location, large_allocation_size);
5631       }
5632     }

I like the fact that you added a test, but as you said it does not test 
that much. It does help a bit, so I think we should keep it. But have 
you thought about trying to write a JTreg test that can be run with 
UseLargePages and then check with the OS that large pages are actually 
being used? I think it will be much more work to write such a test, but 
I think it would catch more issues.

Thanks,
Bengt


On 7/15/13 11:33 AM, Thomas Schatzl wrote:
> Hi all,
>
>    can I have reviews for the following change?
>
> The change fixes the allocation of memory using large pages on Windows
> when a particular address is requested under some circumstances.
>
> In particular, VirtualAlloc is always called with a NULL address,
> meaning there is no preferred allocation address, which is not the
> desired behavior.
>
> See src/os/windows/vm/os_windows.cpp line 3155 in the original code.
>
> The other part of the changes contain a test case for that.
>
> This test case is a bit convoluted, as it needs to handle a few edge
> cases which are valid behaviors (mostly not getting large pages in the
> first place) that should not cause a failed test.
>
> There is no check whether the returned memory consists of large pages; the call to VirtualAlloc() with MEM_LARGE_PAGES always returns large page memory on success.
>
> webrev:
> http://cr.openjdk.java.net/~tschatzl/8016825/webrev/
>
> jbs:
> https://jbs.oracle.com/bugs/browse/JDK-8016825
>
> bugs.sun
> http://bugs.sun.com/view_bug.do?bug_id=8016825
>
> testing:
> jprt running the test case, manual testing
>
> To reproduce the test case, you must give yourself permission to use
> large pages (http://msdn.microsoft.com/en-us/library/ms190730.aspx) and
> run the VM in an elevated shell with -XX:+UseLargePages and -XX:
> +ExecuteInternalVMTests .
>
> Thanks,
>    Thomas
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20130716/100a697e/attachment.htm>


More information about the hotspot-gc-dev mailing list