RFR: Update thread local bad mask during root scanning
Per Liden
per.liden at oracle.com
Thu Feb 22 12:09:17 UTC 2018
Thanks for reviewing. I'll push this for now, but let's keep this in
mind. This issues will be highlighted and revisited if/when we start to
do even more stuff in the thread closure.
cheers,
Per
On 02/22/2018 11:26 AM, Stefan Karlsson wrote:
>
> On 2018-02-22 08:37, Per Liden wrote:
>> Patch to update the thread local address bad mask during root scanning
>> while we're anyway walking the thread list (in parallel), instead of
>> doing a separate single threaded walk over that list.
>>
>> This patch also removes some platform dependent code, and updates the
>> thread local bad mask on all platforms, even if it's strictly not
>> needed on e.g. Solaris/SPARC. However, it doesn't hurt performance
>> wise, and keeps the model nicely homogeneous across platforms.
>>
>> Webrev:
>> http://cr.openjdk.java.net/~pliden/zgc/update_thread_local_address_bad_mask/webrev.0
>
>
> I'm OK with this patch, but Per and I discussed this briefly:
>
> This patch has an optimization to reduce the number of times we iterate
> over the threads, by combining the thread mask setting and the root
> scanning. This is good for performance, but it breaks the abstraction of
> ZRootsIterator by letting it perform a task it's not intended to do.
>
> The two tasks (root scanning and mask updating) are hard-coded in
> ZRootsIterator::do_threads and ZRootsIteratorThreadClosure, but we could
> at least decouple this, by extracting the mask updating in a closure
> that gets injected into ZRootsIterator. If more things were to be added
> to be done during the threads iteration, only the injected closure would
> have to be changed, but not the ZRootsIterator.
>
> The decoupling has the unfortunate property that we would have to
> propagate the closure through a couple of layers, so for now we are
> leaving the code as proposed in the patch.
>
> The layering would be something like this:
>
> void ZHeap::mark_start() {
> ...
> ZAddressMasks::flip_to_marked(); // Original mask flipping location
> ...
> _mark.start(flip_to_marked_thread_closure()); // New closure
> }
>
> void ZMark::start(ThreadClosure* flipped_to_marked_cl) {
> ...
> ZMarkRootsTask task(this, flipped_to_marked_cl);
> _workers->run_parallel(&task);
> }
>
> ZMarkRootsTask(ZMark* mark, ThreadClosure* flipped_to_marked_cl) :
> ZTask("ZMarkRootsTask"),
> _mark(mark),
> _roots(flipped_to_marked_cl) {}
>
> ZRootsIterator::ZRootsIterator(ThreadClosure* extra_thread_cl) :
>
> and then ZRootsIterator::do_threads could apply the closure.
>
> StefanK
>
>>
>>
>> cheers,
>> Per
>>
More information about the zgc-dev
mailing list