Problems with compiler/unsafe/JdkInternalMiscUnsafeAccessTest on PowerPC

Doerr, Martin martin.doerr at sap.com
Fri Apr 29 14:46:18 UTC 2016


Hi Aleksey,

I have used the following test block on ppc64le. More than 2 attempts in the single-threaded test were never observed.
So it would be interesting to report it somehow if that happens.

        {
            int attempts = 0;
            boolean r;
            do {
              attempts++;
              r = UNSAFE.weakCompareAndSwapInt(base, offset, 1, 2);
            } while (!r && attempts < 10);
            if (attempts > 2) {
              reportMessage(attempts, "weakCompareAndSwap int 1 -> 2");
            }
            int x = UNSAFE.getInt(base, offset);
            assertEquals(x, 2, "weakCompareAndSwap int value 1 -> 2");
        }

Is this what you mean by simple weakCAS test prototype?

Best regards,
Martin


-----Original Message-----
From: Aleksey Shipilev [mailto:aleksey.shipilev at oracle.com] 
Sent: Freitag, 29. April 2016 16:05
To: Volker Simonis <volker.simonis at gmail.com>; hotspot compiler <hotspot-compiler-dev at openjdk.java.net>
Cc: Doerr, Martin <martin.doerr at sap.com>
Subject: Re: Problems with compiler/unsafe/JdkInternalMiscUnsafeAccessTest on PowerPC

* PGP Signature not checked

Hi Volker,

On 04/29/2016 04:53 PM, Volker Simonis wrote:
> The problem is that a weakComapreAndSwap may spuriously fail, but the
> tests assume that it will always succeed. On Power we saw for example
> the following kind of failures:
> 
> test JdkInternalMiscUnsafeAccessTestInt.testArray(): failure
> java.lang.AssertionError: weakCompareAndSwapRelease int expected
> [true] but found [false]
>         at org.testng.Assert.fail(Assert.java:94)
>         at org.testng.Assert.failNotEquals(Assert.java:494)
>         at org.testng.Assert.assertEquals(Assert.java:123)
>         at org.testng.Assert.assertEquals(Assert.java:286)
>         at JdkInternalMiscUnsafeAccessTestInt.testAccess(JdkInternalMiscUnsafeAccessTestInt.java:269)
>         at JdkInternalMiscUnsafeAccessTestInt.testArray(JdkInternalMiscUnsafeAccessTestInt.java:109)
> 
> From our understanding of the weakComapreAndSwap semantics it is
> however perfectly legal that the weakComapreAndSwap fails and the old
> values remain in place.

Ah, oops, indeed! The test is too strong, and it just happens to work on
x86. AArch64 should fail the same, once intrinsics are there.
jdk/test/java/lang/invoke/VarHandles should fail too, so it deserves a
global testbug fix.

Can you prototype and test a simple weakCAS/CAE test on the POWER? We
can then propagate the test shape to other tests with:
  https://bugs.openjdk.java.net/browse/JDK-8155739


> We would propose to run the weakComapreAndSwap in a loop in the test
> until it succeeds and only check for the correct value in memory
> afterwards. We could also log the number of retry attempts until the
> weakComapreAndSwap succeeds into the .jtr file.

Yes, looping is better for the tests.


> As far as we saw, all the regression tests are single threaded. Are
> there any multi-threaded tests available which stress the new Unsafe
> intrinsics (i.e. in the way this was previously done by the Java
> Concurrency Torture tests which verified that only valid combinations
> of reads were observed).

Yes, we have the jcstress tests pending for VarHandles, but they are not
yet committed to jcstress.

Thanks,
-Aleksey



* Signature checking is off by policy


More information about the hotspot-compiler-dev mailing list