Request for review (S): 7103665 HeapWord*ParallelScavengeHeap::failed_mem_allocate(unsigned long,bool)+0x97

Bengt Rutisson bengt.rutisson at oracle.com
Fri Mar 23 14:39:10 UTC 2012


OK. Thanks for showing interest!

Bengt

On 2012-03-23 15:37, Vitaly Davidovich wrote:
>
> I'm not a reviewer, just a curious bystander. :)
>
> Sent from my phone
>
> On Mar 23, 2012 10:32 AM, "Bengt Rutisson" <bengt.rutisson at oracle.com 
> <mailto:bengt.rutisson at oracle.com>> wrote:
>
>
>     Hi Vitaly,
>
>     On 2012-03-23 14:45, Vitaly Davidovich wrote:
>>
>>     Hi Bengt,
>>
>>     mutableNUMASpace line 99 has a small typo in the assert message:
>>     "Remaining siz" should be "Remaining size".
>>
>
>     Thanks for seeing it. Fixed.
>
>     BTW, you don't have an OpenJDK username, right? If you consider
>     this a review I can list you as "Also-reviewed-by", when I push.
>
>     Thanks,
>     Bengt
>
>>     Vitaly
>>
>>     Sent from my phone
>>
>>     On Mar 23, 2012 9:06 AM, "Bengt Rutisson"
>>     <bengt.rutisson at oracle.com <mailto:bengt.rutisson at oracle.com>> wrote:
>>
>>
>>         Hi all,
>>
>>         Could I have a couple of reviews for this change? This is on
>>         the critical-watch list for hs23, so it would be great if I
>>         could get some reviews already today.
>>
>>         http://cr.openjdk.java.net/~brutisso/7103665/webrev.00/
>>         <http://cr.openjdk.java.net/%7Ebrutisso/7103665/webrev.00/>
>>
>>         Some background:
>>
>>         There are two problems that this fix solves:
>>
>>         (1) When we run with -XX:+UseNUMA we have to make the heap
>>         parsable since we leave some holes in the heap. We do this by
>>         faking Integer arrays in those places. However, on a large
>>         heap those holes can be larger than what can be covered by a
>>         single Integer array. The fix is to allocate several arrays
>>         in those cases.
>>
>>         The easy fix would have been to call
>>         CollectedHeap::fill_with_objects() instead of
>>         CollectedHeap::fill_with_object(). Note the extra "s" in the
>>         method name. But MutableNUMASpace::ensure_parsability(),
>>         where the change is needed, need to know about all the
>>         objects that are allocated so I saw no better solution than
>>         to implement my own loop. Any ideas on how I could re-use
>>         fill_with_objects() instead are welcome.
>>
>>         (2) CollectedHeap::_filler_array_max_size should be the
>>         maximum size that can be covered by a fake Integer array.
>>         This value is in words, but since the word size is different
>>         on different platforms but the Integer size is always the
>>         same we need to convert between word and sizeof(jint) at some
>>         point. Unfortunately we do the conversion in the wrong
>>         direction, which means that on 64 bit platforms we end up
>>         with a max size that is 4 times larger than intended. This in
>>         turn makes us overflow an int when we convert from a word
>>         size to the length of the array that we are setting up.
>>
>>         Here is the code that overflows:
>>
>>          328 void
>>          329 CollectedHeap::fill_with_array(HeapWord* start, size_t
>>         words, bool zap)
>>          330 {
>>          331   assert(words >= filler_array_min_size(), "too small
>>         for an array");
>>          332   assert(words <= filler_array_max_size(), "too big for
>>         a single object");
>>          333
>>          334   const size_t payload_size = words -
>>         filler_array_hdr_size();
>>          335   const size_t len = payload_size * HeapWordSize /
>>         sizeof(jint);
>>          336
>>          337   // Set the length first for concurrent GC.
>>          338   ((arrayOop)start)->set_length((int)len);
>>          339  
>>         post_allocation_setup_common(Universe::intArrayKlassObj(),
>>         start, words);
>>          340   DEBUG_ONLY(zap_filler_array(start, words, zap);)
>>          341 }
>>
>>         If filler_array_max_size() on line 332, which returns
>>         CollectedHeap::_filler_array_max_size, has a too large value
>>         we will overflow the int conversation on line 338.
>>
>>         Testing:
>>         This fix solves the issue that was found in the reproducer
>>         that I could set up on a Linux x64 machine. I have asked the
>>         one who initially reported the issue to run on their Solaris
>>         amd64 setup. I will also try to set up a reproducer on a
>>         Solaris machine.
>>
>>         I also ran the fix through JPRT. It did not fail, but there
>>         are no NUMA tests in there as far as I know. But the change
>>         for issue (2) was hopefully tested.
>>
>>         Thanks,
>>         Bengt
>>
>

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


More information about the hotspot-gc-dev mailing list