RFR JDK-8141491: Unaligned memory access in Bits.c
Mikael Vidstedt
mikael.vidstedt at oracle.com
Tue Feb 2 19:25:33 UTC 2016
Please review this change which introduces a Copy::conjoint_swap and an
Unsafe.copySwapMemory method to call it from Java, along with the
necessary changes to have java.nio.Bits call it instead of the Bits.c code.
http://cr.openjdk.java.net/~mikael/webrevs/8141491/webrev.03/hotspot/webrev/
http://cr.openjdk.java.net/~mikael/webrevs/8141491/webrev.03/jdk/webrev/
On the jdk/ side I don't think there should be a lot of surprises.
Bits.c is gone and that required a mapfile-vers to be changed
accordingly. I also added a relatively extensive
jdk/internal/misc/Unsafe/CopySwap.java test which exercises all the
various copySwap configurations and verifies that the resulting data is
correct. There are also a handful of negative tests in there.
On the hotspot/ side:
* the copy logic in copy.cpp is leveraging templates to help the C++
compiler produce tight copy loops for the various configurations
{element type, copy direction, src aligned, dst aligned}.
* Unsafe_CopySwapMemory is a leaf to not stall safe points more than
necessary. Only if needed (THROW, copy involves heap objects) will it
enter VM using a new JVM_ENTRY_FROM_LEAF macro.
* JVM_ENTRY_FROM_LEAF calls a new VM_ENTRY_BASE_FROM_LEAF helper macro,
which mimics what VM_ENTRY_BASE does, but also does a
debug_only(ResetNoHandleMark __rnhm;) - this is because
JVM_LEAF/VM_LEAF_BASE does debug_only(NoHandleMark __hm;).
I'm in the process of getting the last performance numbers, but from
what I've seen so far this will outperform the earlier implementation.
Cheers,
Mikeal
On 2016-01-27 17:13, Mikael Vidstedt wrote:
>
> Just an FYI:
>
> I'm working on moving all of this to the Hotspot Copy class and
> bridging to it via jdk.internal.misc.Unsafe, removing Bits.c
> altogether. The implementation is working, and the preliminary
> performance numbers beat the pants off of any of the suggested Bits.c
> implementations (yay!).
>
> I'm currently in the progress of getting some unit tests in place for
> it all to make sure it covers all the corner cases and then I'll run
> some real benchmarks to see if it actually lives up to the expectations.
>
> Cheers,
> Mikael
>
> On 2016-01-26 11:13, John Rose wrote:
>> On Jan 26, 2016, at 11:08 AM, Andrew Haley <aph at redhat.com> wrote:
>>> On 01/26/2016 07:04 PM, John Rose wrote:
>>>> Unsafe.copyMemory bottoms out to Copy::conjoint_memory_atomic.
>>>> IMO that's a better starting point than memcpy. Perhaps it can be
>>>> given an additional parameter (or overloading) to specify a swap size.
>>> OK, but conjoint_memory_atomic doesn't guarantee that destination
>>> words won't be torn if their source is misaligned: in fact it
>>> guarantees that they will will be.
>> That's a good point, and argues for a new function with the
>> stronger guarantee. Actually, it would be perfectly reasonable
>> to strengthen the guarantee on the existing function. I don't
>> think anyone will care about the slight performance change,
>> especially since it is probably favorable. Since it's Unsafe,
>> they are not supposed to care, either.
>>
>> — John
>
More information about the nio-dev
mailing list