<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">[This should be on hotspot-runtime-dev.  BCC’ing hotspot-compiler-dev.]<div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Apr 8, 2016, at 12:53 AM, Hiroshi H Horii <<a href="mailto:HORII@jp.ibm.com" class="">HORII@jp.ibm.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><font size="2" face="sans-serif" class="">Dear all:</font><br class=""><br class=""><font size="2" face="sans-serif" class="">Can I please request reviews for the
following change?</font><br class=""><font size="2" face="sans-serif" class="">This change was created for JDK 9 and
ppc64.</font><br class=""><br class=""><font size="2" face="sans-serif" class="">Description:</font><br class=""><font size="2" face="sans-serif" class="">This change adds options of compare-and-exchange
for POWER architecture.</font><br class=""><font size="2" face="sans-serif" class="">As described in atomic_linux_ppc.inline.hpp,
the current implementation of</font><br class=""><font size="2" face="sans-serif" class="">cmpxchg is fence_cmpxchg_acquire. This
implementation is useful for</font><br class=""><font size="2" face="sans-serif" class="">general purposes because twice calls
of sync before and after cmpxchg will</font><br class=""><font size="2" face="sans-serif" class="">keep consistency. However, they sometimes
cause overheads because</font><br class=""><font size="2" face="sans-serif" class="">sync instructions are very expensive
in the current POWER chip design.</font><br class=""><font size="2" face="sans-serif" class="">With this change, callers can explicitly
specify to run fence and acquire with</font><br class=""><font size="2" face="sans-serif" class="">two additional bool parameters. Because
their default values are "true",</font><br class=""><font size="2" face="sans-serif" class="">it is not necessary to modify existing
cmpxchg calls. </font><br class=""><br class=""><font size="2" face="sans-serif" class="">In addition, with the new parameters
of cmpxchg, this change improves</font><br class=""><font size="2" face="sans-serif" class="">performance of copy_to_survivor in the
parallel GC. </font><br class=""><font size="2" face="sans-serif" class="">copy_to_survivor changes forward pointers
by using cmpxchg. This </font><br class=""><font size="2" face="sans-serif" class="">operation doesn't require any sync instructions,
in my understanding. </font><br class=""><font size="2" face="sans-serif" class="">A pointer is changed at most once in
a GC and when cmpxchg fails, </font><br class=""><font size="2" face="sans-serif" class="">the latest pointer is available for
the caller.</font><br class=""><br class=""><font size="2" face="sans-serif" class="">When I evaluated SPECjbb2013 (slightly
customized because obsolete grizzly</font><br class=""><font size="2" face="sans-serif" class="">doesn't support new version format of
Java 9), pause time of young GC was</font><br class=""><font size="2" face="sans-serif" class="">reduced from 10% to 20%.</font><br class=""><br class=""><font size="2" face="sans-serif" class="">Summary of source code changes:</font><br class=""><br class=""><font size="2" face="sans-serif" class="">* src/share/vm/runtime/atomic.hpp</font><br class=""><font size="2" face="sans-serif" class="">* src/share/vm/runtime/atomic.cpp</font><br class=""><font size="2" face="sans-serif" class="">* src/os_cpu/linux_ppc/vm/atomic_linux_ppc.inline.hpp</font><br class=""><font size="2" face="sans-serif" class="">       - Add two
arguments of fence and acquire to cmpxchg only for PPC64.</font><br class=""><font size="2" face="sans-serif" class="">         Though
cmpxchg in atomic_linux_ppc.inline.hpp has some branches,</font><br class=""><font size="2" face="sans-serif" class="">         they
are reduced while inlining to callers.</font><br class=""><br class=""><font size="2" face="sans-serif" class="">* src/share/vm/oops/oop.inline.hpp</font><br class=""><font size="2" face="sans-serif" class="">      - Changed cas_set_mark
to call cmpxchg without fence and acquire.</font><br class=""><font size="2" face="sans-serif" class="">         cas_set_mark
is called only by cas_forward_to that is called only by</font><br class=""><font size="2" face="sans-serif" class="">         copy_to_survivor_space
and oop_promotion_failed in </font><br class=""><font size="2" face="sans-serif" class="">         psPromotionManager.</font><br class=""><br class=""><font size="2" face="sans-serif" class="">Code change:</font><br class=""><br class=""><font size="2" face="sans-serif" class="">   Please see an attached
diff file that was generated with "hg diff -g" </font><br class=""><font size="2" face="sans-serif" class="">   under the latest hotspot
directory.</font><br class=""><br class=""><font size="2" face="sans-serif" class="">Passed test:</font><br class=""><font size="2" face="sans-serif" class="">    SPECjbb2013 (customized)</font><br class=""><br class=""><font size="2" face="sans-serif" class="">* I believe some other cmpxchg will
be optimized by reducing fence </font><br class=""><font size="2" face="sans-serif" class="">  or acquire because twice calls
of sync are too conservative to implement</font><br class=""><font size="2" face="sans-serif" class="">  Java memory model.</font><br class=""><br class=""><br class=""><br class=""><font size="2" face="sans-serif" class="">Regards,<br class="">Hiroshi<br class="">-----------------------<br class="">Hiroshi Horii, Ph.D.<br class="">IBM Research - Tokyo<br class=""></font><br class=""></div></blockquote></div></div></body></html>