RFR(S/M): 7132678: G1: verify that the marking bitmaps have no marks for objects over TAMS
Jon Masamitsu
jon.masamitsu at oracle.com
Mon Apr 28 16:07:37 UTC 2014
On 04/28/2014 04:09 AM, Bengt Rutisson wrote:
>
> Hi Jon,
>
> Thanks for looking at this!
>
>
> On 2014-04-25 19:28, Jon Masamitsu wrote:
>> There are two new flags introduced.
>>
>>> 334 develop(bool, G1VerifyBitmaps,
>>> false, \
>>> 335 "Verifies the consistency of the marking
>>> bitmaps") \
>>> 336 \
>>> 337 develop(bool, G1VerifyPrevBitmap,
>>> false, \
>>> 338 "Verifies the consistency of the prev marking bitmap")
>>
>> When would we want to verify the next bitmap but not the prev bitmap?
>>
>> I see that G1VerifyPrevBitmap guards
>>
>>> 1515 // Clear the previous marking bitmap, if needed for
>>> bitmap verification.
>>> 1516 // Note we cannot do this when we clear the next marking
>>> bitmap in
>>> 1517 // ConcurrentMark::abort() above since VerifyDuringGC
>>> verifies the
>>> 1518 // objects marked during a full GC against the previous
>>> bitmap.
>>> 1519 // But we need to clear it before calling check_bitmaps
>>> below since
>>> 1520 // the full GC has compacted objects and updated TAMS but
>>> not updated
>>> 1521 // the prev bitmap.
>>> 1522 if (G1VerifyPrevBitmap) {
>>> 1523 ((CMBitMap*)
>>> concurrent_mark()->prevMarkBitMap())->clearAll();
>>> 1524 }
>>
>> Is it worth the extra flag for that?
>
> I think that is the reason, but I doubt that it is worth it. I do
> agree that it is questionable if we need two flags and if we do we
> should name them differently and make sure that they behave consistently.
>
> Rather than making things more complicated I removed
> G1VerifyPrevBitmap and only use G1VerifyBitmaps now.
Sounds good.
>
>>
>> How about changing verify_bitmaps() to verify_both_bitmaps()? To make it
>> easier on the eyes to distinguish from verify_bitmap().
>
> I renamed verify_bitmap() to verify_no_bits_over_tams() since it
> actually does not verify the whole bitmap, just that there are not
> bits set over TAMS.
Even better.
>
> New webrev:
> http://cr.openjdk.java.net/~brutisso/7132678/webrev.3/
>
> Diff compared to last one:
> http://cr.openjdk.java.net/~brutisso/7132678/webrev.2-3.diff/
Changes look good.
Reviewed.
Jon
> Thanks,
> Bengt
>
>
>>
>> Rest looks good.
>>
>> Jon
>>
>>
>> On 4/25/2014 7:30 AM, Bengt Rutisson wrote:
>>>
>>> Hi Erik,
>>>
>>> Thanks for looking at this!
>>>
>>> On 2014-04-25 15:55, Erik Helin wrote:
>>>> Hi Bengt,
>>>>
>>>> On 2014-04-23 10:20, Bengt Rutisson wrote:
>>>>>
>>>>> Hi all,
>>>>>
>>>>> Picking up an over 1 year old task...
>>>>>
>>>>> Tony created this patch at some point and passed it on to John
>>>>> Cuthbertson. John sent out a review request and there were some
>>>>> comments
>>>>> (http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2013-May/thread.html#7202
>>>>>
>>>>> and
>>>>> http://mail.openjdk.java.net/pipermail/hotspot-gc-dev/2013-May/007279.html),
>>>>>
>>>>> but the patch never got finalized or pushed. I thought I'd try to get
>>>>> this pushed now.
>>>>>
>>>>> Just like John suggested I would like to do the push as
>>>>> contributed-by
>>>>> Tony unless there are major changes due to comments.
>>>>>
>>>>> Here is a new webrev:
>>>>> http://cr.openjdk.java.net/~brutisso/7132678/webrev.1/
>>>>
>>>> I had a look at the patch and noticed:
>>>>
>>>> bool G1CollectedHeap::verify_bitmaps:
>>>> ...
>>>> if (mark_in_progress() || !_cmThread->in_progress()) {
>>>> res_n = verify_bitmap("next", next_bitmap, ntams, end);
>>>> }
>>>> ...
>>>>
>>>> what does the condition mark_in_process() ||
>>>> !_cmThread->in_progress() mean here?
>>>>
>>>> What do you think about adding a comment (or extracting this check
>>>> into a method) to make it more obvious why we are doing this check?
>>>
>>> Good point!
>>>
>>> Updated webrev:
>>> http://cr.openjdk.java.net/~brutisso/7132678/webrev.2/
>>>
>>> And the diff with only the comment added:
>>> http://cr.openjdk.java.net/~brutisso/7132678/webrev.1-2.diff/
>>>
>>> Thanks,
>>> Bengt
>>>
>>>>
>>>> Thanks,
>>>> Erik
>>>>
>>>>> Here is the diff compared to the one John sent out 15 months ago:
>>>>> http://cr.openjdk.java.net/~brutisso/7132678/webrev.0-1.diff/
>>>>>
>>>>> In the original patch there is a bug in the full GC case. We
>>>>> verify the
>>>>> "prev" bitmap after doing a full GC. But the full GC has compacted
>>>>> objects and reset tams without updating the prev bitmap. I think
>>>>> this is
>>>>> normally safe since the prev bitmap will be cleared once it
>>>>> becomes the
>>>>> next bitmap later on. However, the new verification code looks at
>>>>> stale
>>>>> data in the prev bitmap. There was already code added to clear the
>>>>> prev
>>>>> bitmap if verification was enabled. I moved that code to just
>>>>> before the
>>>>> verification. It might seem unnecessary to verify a bitmap that we
>>>>> just
>>>>> cleared, but that seemed easier than to propagate the state down
>>>>> to the
>>>>> verification code that it should not verify the prev bitmap for this
>>>>> particular call.
>>>>>
>>>>> There is one more change that I made. I removed one guarantee that I
>>>>> think was unnecessary.
>>>>>
>>>>> Thanks,
>>>>> Bengt
>>>>>
>>>>> On 2013-01-15 21:10, John Cuthbertson wrote:
>>>>>> Hi Everyone,
>>>>>>
>>>>>> Can I have a couple of volunteers review the changes for this CR?
>>>>>> The
>>>>>> webrev can be found at:
>>>>>> http://cr.openjdk.java.net/~johnc/7132678/webrev.0/
>>>>>>
>>>>>> Most of the changes come from a patch that Tony gave me before he
>>>>>> left
>>>>>> and I had to tweak them slightly to remove a spurious failure. The
>>>>>> changes verify that the heap regions don't have any marks between
>>>>>> [TAMS, top) at strategic places: start and end of each GC, start and
>>>>>> end of remark and cleanup, and when allocating a region. Tony
>>>>>> deserves
>>>>>> the bulk of the credit so, if possible and there are no
>>>>>> objections, I
>>>>>> intend to list him as author of the change and include myself as a
>>>>>> reviewer.
>>>>>>
>>>>>> Testing:
>>>>>> GC test suite with the both the new flags (separately and together)
>>>>>> and a low IHOP value.
>>>>>> jprt with the new flags (+IgnoreUnrecognizedVMOptions so that
>>>>>> product
>>>>>> test runs did not fail).
>>>>>>
>>>>>> Thanks,
>>>>>>
>>>>>> JohnC
>>>>>
>>>
>>
>
More information about the hotspot-gc-dev
mailing list