RFR(m): 8214271: Fast primitive to wake many threads

David Holmes david.holmes at oracle.com
Wed Nov 28 05:41:15 UTC 2018


Hi Robbin,

Part 3 (and final part)

This is looking at the futex implementation and the test.

Overall looks good!

Shouldn't you be using the FUTEX_*_PRIVATE variants as this is a 
process-local FUTEX?

Your main code would be simpler to read (and thus understand) if your 
futex helper function handled the unused arguments e.g. instead of:

static int futex(volatile int *uaddr, int futex_op, int val,
                  const struct timespec *timeout, int *uaddr2, int val3)
  {
    return syscall(SYS_futex, uaddr, futex_op, val, timeout, uaddr2, val3);
  }

use (with name changes):

static int futex(volatile int *addr, int futex_op, int op_arg) {
    return syscall(SYS_futex, addr, futex_op, op_arg, NULL, NULL, 0);
}

---

Minor suggestions on this comment block:

   88     // Return value 0, re-check in case of spurious wake-up.
   89     // EINTR and re-check and go back to waiting.
   90     // EAGAIN we already are disarmed, we should pass the check,
   91     // if not re-armed with same tag.

->

   // Return value 0: woken up, but re-check in case of spurious wakeup
   // Error EINTR: woken by signal, so re-check and re-wait if necessary.
   // Error EAGAIN: we are already disarmed and so will pass the check

As per initial review comments I think re-arming with same tag should be 
an error. I think the tag semantics should be that the tag is a strictly 
increasing value, and we can then store the previous tag and check that.

---

The test could do with at least an introductory comment block explaining 
the basic operation of the test. Further inline comments wouldn't hurt 
either.

Thanks,
David

On 24/11/2018 2:55 am, Robbin Ehn wrote:
> Forgot RFR in subject.
> 
> /Robbin
> 
> On 2018-11-23 17:51, Robbin Ehn wrote:
>> Hi all, please review.
>>
>> When a safepoint is ended we need a way to get back to 100% 
>> utilization as fast
>> as possible. 100% utilization means no idle cpu in the system if there 
>> is a
>> JavaThread that could be executed. The traditional ways to wake many, 
>> e.g.
>> semaphore, pthread_cond, is not implemented with a single syscall 
>> instead they
>> typical do one syscall per thread to wake.
>>
>> This change-set contains that primitive, the WaitBarrier, and a gtest 
>> for it.
>> No actual users, which is in coming patches.
>>
>> The WaitBarrier solves by doing a cooperative semaphore posting, 
>> threads woken
>> will also post. On Linux we can instead directly use a futex and with one
>> syscall wake all. Depending on how many threads and cpus the 
>> performance vary,
>> but a good utilization of the machine, just on the edge of saturated, 
>> the time to reach 100% utilization is around 3 times faster with the 
>> WaitBarrier (where futex is faster than semaphore).
>>
>> Webrev:
>> http://cr.openjdk.java.net/~rehn/8214271/webrev/
>>
>> CR:
>> https://bugs.openjdk.java.net/browse/JDK-8214271
>>
>> Passes 100 iterations of gtest on our platforms, both fastdebug and 
>> release.
>> And have been stable when used in safepoints (t1-8) (coming patches).
>>
>> Thanks, Robbin


More information about the hotspot-dev mailing list