review request (S) - 8014611: reserve_and_align() assumptions
John Coomes
John.Coomes at oracle.com
Thu May 23 03:23:44 PDT 2013
Ron Durbin (ron.durbin at oracle.com) wrote:
> John
>
> What tests have you Run already or plan to before checkin?
> The change looks good but can you answer the above question?
> Thx for fixing this.
Hi Ron,
Thanks for the review. In addition to the tests mentioned in [1], I
also did some ad-hoc testing on windows, including GCOld and a simple
program I wrote that induces lots of GCs, with and without
compressed-oops. I wasn't able to run all the test suites on windows;
however, the code is exercised almost exclusively at startup so I'm
comfortable with it.
> This will be my only response to this review as I am leaving on vacation.
Enjoy :-).
-John
[1] http://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2013-May/007301.html
> > -----Original Message-----
> > From: Bengt Rutisson
> > Sent: Monday, May 20, 2013 5:33 AM
> > To: hotspot-runtime-dev at openjdk.java.net
> > Subject: Re: review request (S) - 8014611: reserve_and_align() assumptions
> >
> >
> > Hi again John,
> >
> > One more detail...
> >
> > If you want to have a test that verifies your change you could try to adapt the test that I wrote for
> > hs25 before I realized that this code is not used in hs25. The test,
> > VirtualSpace::test_reserve_aligned(), is available at the end of this page from my review request:
> >
> > http://cr.openjdk.java.net/~brutisso/8012915/webrev.00/src/share/vm/runtime/virtualspace.cpp.udiff.htm
> > l
> >
> > Bengt
> >
> > On 5/20/13 1:27 PM, Bengt Rutisson wrote:
> > >
> > > Hi John,
> > >
> > > Thanks for the extra explanation. It really helped!
> > >
> > > Some comments inline...
> > >
> > > On 5/18/13 1:30 AM, John Coomes wrote:
> > >> Bengt Rutisson (bengt.rutisson at oracle.com) wrote:
> > >>> Hi John,
> > >>>
> > >>> On 5/15/13 6:59 PM, John Coomes wrote:
> > >>>
> > >>> Please review this change for hs24:
> > >>>
> > >>> 8014611: reserve_and_align() assumptions are invalid on
> > >>> windows
> > >>>
> > >>> http://cr.openjdk.java.net/~jcoomes/8014611-reserve-and-align/
> > >>>
> > >>> The webrev has more info about the problem and the fix.
> > >>>
> > >>> -John
> > >>>
> > >>>
> > >>> I don't really understand how this fix helps the Windows issue. The
> > >>> problem on Windows is that if you try to release any part of a
> > >>> reserved region it will actually release the whole region instead of
> > >>> the part that you specified. Or did I miss understand the problem?
> > >> First, thanks for taking a look. And you understand the problem
> > >> correctly.
> > >>
> > >>> If that is the underlying issue then I would have expected this code
> > >>> in
> > >>> ReservedSpace::align_reserved_region():
> > >>>
> > >>> 83 if (beg_delta != 0) {
> > >>> 84 os::release_partial_region(addr, beg_delta);
> > >>> 85 }
> > >>> 86
> > >>> 87 if (end_delta != 0) {
> > >>> 88 char* release_addr = (char*) (s + beg_delta + required_size);
> > >>> 89 os::release_partial_region(release_addr, end_delta);
> > >>> 90 }
> > >>>
> > >>> to be:
> > >>>
> > >>> if (beg_delta != 0 && os::can_release_partial_region()) {
> > >>> ...
> > >>> }
> > >>>
> > >>> if (end_delta != 0 && os::can_release_partial_region()) {
> > >>> ...
> > >>> }
> > >>>
> > >>> And that os::release_partial_region() on Windows should be
> > >>> implemented as:
> > >>>
> > >>> bool os::release_partial_region(char* addr, size_t bytes) {
> > >>> ShouldNotReachHere();
> > >>> }
> > >>>
> > >>> I guess I am missing something. Can you explain in more detail why
> > >>> your approach solves the Windows uncommit problem?
> > >> The proposed fix allows os::release_partial_region() to be called on
> > >> windows (even though can_release_partial_region() returns false
> > >> there). That's because on windows, release_partial_region() calls
> > >> uncommit_memory() to return any pages that may have been committed to
> > >> back the partial region, which is allowed by the win api. As you
> > >> say, it can't return part of the virtual address range on windows, as
> > >> can be done on posix with mmap, but it can uncommit pages.
> > >
> > > Right. I missed that os::release_partial_region() on Windows only did
> > > uncommit.
> > >
> > >>
> > >> The currently implemented semantics of release_partial_region() are:
> > >>
> > >> If the o/s supports releasing part of a virtual address
> > >> reservation, do so using release_memory(). Otherwise (on
> > >> systems where the VA reservation must be released in its
> > >> entirety), uncommit any pages backing the partial region.
> > >>
> > >> I started out with a solution like you sketched above (with
> > >> release_partial_region() on windows essentially a no-op), but thought
> > >> that it would be more frugal to uncommit any memory that might back
> > >> the virtual addresses. The current code will not benefit from this,
> > >> but if another use of release_partial_region() is added, that code
> > >> might.
> > >>
> > >> Some options:
> > >>
> > >> I can add the description above as a comment if that would
> > >> help, and/or
> > >>
> > >> rename release_partial_region() to something that better
> > >> indicates the semantics (suggestions welcome), or
> > >>
> > >> make release_partial_region() a no-op on windows, with a small
> > >> loss in future-proofing
> > >
> > > I would like to suggest one more option:
> > >
> > > * Remove the os::release_partial_region() method
> > > * Always store raw_base and raw_size
> > > * Make ReservedSpace::release_memory() only use
> > > os::can_release_partial_region() to decide whether to use the raw_base
> > > or the "normal" base address for releasing
> > > * Let ReservedSpace::align_reserved_region() be implemented as:
> > >
> > >
> > > if (beg_delta != 0)
> > > if (os::can_release_partial_region()) {
> > > os::release_memory(addr, beg_delta);
> > > } else {
> > > os::uncommit_memory(addr, beg_delta);
> > > }
> > > }
> > >
> > > if (end_delta != 0) {
> > > if (os::can_release_partial_region()) {
> > > char* release_addr = (char*) (s + beg_delta + required_size);
> > > os::release_memory(release_addr, end_delta);
> > > } else {
> > > os::uncommit_memory(release_addr, end_delta);
> > > }
> > > }
> > >
> > >
> > > For me this is more intuitive than calling a method called
> > > os::release_partial_region() on platforms that answer false on
> > > os::can_release_partial_region().
> > >
> > > Thanks,
> > > Bengt
> > >
> > >>
> > >> -John
> > >
> >
More information about the hotspot-runtime-dev
mailing list