RFR: 8214338: Move IC stub refilling out of IC cache transitions
dean.long at oracle.com
dean.long at oracle.com
Fri Nov 30 18:41:32 UTC 2018
On 11/30/18 3:19 AM, Erik Österlund wrote:
> Hi Dean,
>
> Thanks for reviewing this!
>
> On 2018-11-27 23:55, dean.long at oracle.com wrote:
>> There's a typo in the new guarantee message: "tranisition".
>
> Fixed in-place.
>
>> Regarding the infinite loops, can we detect if progress isn't being
>> made and assert/panic, rather than hanging?
>
> I'm afraid not. It's a similar analogy to the problem of progress
> guarantees of a lock-free algorithm. They have a global progress
> guarantee for the system, but no local guarantee of progress for each
> operation, that can in theory be starved indefinitely due to other
> operations winning every race. The situation is similar here, at least
> in theory, that the thread refilling the IC stubs didn't get a single
> stub back, because another thread started depleted the IC stubs again.
> Naturally, if this was ever to happen, we would get time outs in our
> tests though, to indicate that there is a problem.
>
Is it correct to say that the loop was there before (in new_ic_stub),
but now you've moved it into the callers?
dl
> Thanks,
> /Erik
>
>> dl
>>
>> On 11/27/18 1:29 PM, Erik Österlund wrote:
>>> Hi Dean,
>>>
>>> Thank you for reviewing this.
>>>
>>> Full webrev:
>>> http://cr.openjdk.java.net/~eosterlund/8214338/webrev.01/
>>>
>>> Incremental webrev:
>>> http://cr.openjdk.java.net/~eosterlund/8214338/webrev.00_01/
>>>
>>> On 2018-11-27 19:07, dean.long at oracle.com wrote:
>>>> Hi Erik. Can you explain why you removed the pre-allocated "next
>>>> stub"? I guess it was no longer necessary? If so, then you should
>>>> update the "always has sentinel" comment in is_empty.
>>>
>>> Updated. Indeed, the sentinel no longer serves a purpose so I
>>> removed it. Found some more traces of the sentinel that I removed in
>>> the last webrev.
>>>
>>>> In your guarantee messages, some use "should not fail" and some use
>>>> "should never fail". It's not a big deal but maybe they should be
>>>> the same.
>>>
>>> Sure. Updated.
>>>
>>>> You introduced a couple of infinite loops. Are we guaranteed to
>>>> exit these loops eventually? Is there an upper bound on how many
>>>> iterations are needed?
>>>
>>> In my latest webrev I removed some unnecessary set_to_clean() where
>>> IC caches are already is_clean(). With that in place, there should
>>> be global progress guarantees and a single IC stub in the buffer
>>> should be all you really "need". Although, you might want more. In
>>> fact, I'm questioning if the 10K size buffer is big enough today,
>>> but I'll leave that for another day.
>>>
>>> Thanks,
>>> /Erik
>>>
>>>> The rest looks good.
>>>>
>>>> dl
>>>>
>>>> On 11/27/18 5:00 AM, Erik Österlund wrote:
>>>>> Hi,
>>>>>
>>>>> IC stub refilling currently requires a safepoint operation. When
>>>>> done right at the point where an CompiledIC is about to get
>>>>> patched to a transitional state using an IC stub, locks may
>>>>> already be held, causing a bunch of locking issues - especially
>>>>> for concurrent class unloading. Therefore, the IC stub refilling
>>>>> ought to be moved out so that IC cache cleaning and transitioning
>>>>> may be done without any safepoints, and the locks in the path
>>>>> ought to not perform safepoint checking.
>>>>>
>>>>> This is implemented by allowing IC transitions to fail when they
>>>>> require IC stubs, and we run out of them. This propages back to a
>>>>> higher level where IC stubs are refilled after having released the
>>>>> IC locker.
>>>>>
>>>>> Webrev:
>>>>> http://cr.openjdk.java.net/~eosterlund/8214338/webrev.00/
>>>>>
>>>>> Bug:
>>>>> https://bugs.openjdk.java.net/browse/JDK-8214338
>>>>>
>>>>> Thanks,
>>>>> /Erik
>>>>
>>
More information about the hotspot-dev
mailing list