RFR: JDK-8061259: ParNew promotion failed is serialized on a lock
Bengt Rutisson
bengt.rutisson at oracle.com
Fri Nov 7 11:32:25 UTC 2014
Hi Kim and Jungwoo,
On 2014-11-07 02:36, Jungwoo Ha wrote:
>
>
> ------------------------------------------------------------------------------
>
> src/share/vm/gc_implementation/concurrentMarkSweep/concurrentMarkSweepGeneration.cpp
> 271 // Support for CMSFastPromotionFailure
> 272 reset_promotion_failed();
>
> Why this and not just initialize the data member in the constructor
> initializer list?
>
>
> Okay. I will fix that.
>
> ------------------------------------------------------------------------------
>
> [All of code discussed here is in par_promote().]
>
> The tests of CMSFastPromotionFailure && has_promotion_failed() that
> are outside the lock have a sort of DCLP (double checked locking
> pattern) feel to them. The goal here is to avoid the locked region
> and go do something else, instead of waiting for the current lock
> holder to complete the work the checker would be doing if only they
> could get the lock.
>
> I think I would like it better if the outside the lock tests were
> moved closer to the lock entries, to emphasize that relationship, and
> to reduce the code affected by the introduction of this set of
> changes. That might result in the thread that gives up doing a little
> more work before giving up. I'm particularly thinking of
>
> 1358 if (CMSFastPromotionFailure && has_promotion_failed()) {
> 1359 return NULL;
> 1360 }
>
> removal of which would let execution proceed to
>
> 1373 if (!expand_and_ensure_spooling_space(promoInfo)) {
> 1374 return NULL;
>
> and give up because the moved test caused expand_xxx to return false.
> I don't know if the placement of the test at line 1358 rather than
> inside expand_and_ensure_spooling_space() would be significant. I
> suspect not, but without measurements I don't have a lot of confidence
> in that supposition. But I think that change would improve the
> understandability of the code.
>
> In the other case,
>
> 1381 if (CMSFastPromotionFailure && has_promotion_failed()) {
> 1382 return NULL;
> 1383 }
> 1384 obj_ptr = expand_and_par_lab_allocate(ps, alloc_sz);
>
> I would definitely prefer that test be moved into
> expand_and_par_lab_allocate(). This is the only call to that
> function, and the first thing it does is lock the mutex and re-perform
> the test.
>
>
> These are really important for performance. If we remove line 1358,
> the pause time with the given example goes up by 2x.
> I'll move 1381 to inside expand_and_par_lab_allocate().
>
>
> ------------------------------------------------------------------------------
>
> I'm suspicious of the during-review change to make
> _has_promotion_failed non-atomic.
>
> I see the argument for the interaction between set and test; the set
> occurs in lock context so gets released on the way out of the lock,
> while the first time each core gets a stale false value it will
> acquire the lock and acquire the updated set value, so that future
> tests on the same core will avoid the code in question, until the
> reset finally happens.
>
> However, I think the present interaction between reset and test is not
> safe. A test seeing a stale true value leads to an inappropriate skip
> of the protected code, with nothing obvious to prevent that from
> occurring "forever".
>
> ------------------------------------------------------------------------------
>
>
> I am sure the code is correct under x86 as is, but please let me know
> how to fix it for other architecture.
>
> I'll post the update after the discussion is settled.
I don't think a thread can ever see a stale true value. We only reset
after a GC and there is a lot of things happening, including several
locks being taken and released, before we start a new GC. So, as far as
I can tell this does not require any more barriers. I may be missing
something though. If I am, can you give a more specific example, Kim?
Thanks,
Bengt
>
> --Jungwoo
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/hotspot-gc-dev/attachments/20141107/95fec12c/attachment.htm>
More information about the hotspot-gc-dev
mailing list