RFR: 8272807: Permit use of memory concurrent with pretouch

Kim Barrett kbarrett at openjdk.java.net
Thu Sep 2 18:39:38 UTC 2021


Note that this PR replaces the withdrawn https://github.com/openjdk/jdk/pull/5215.

Please review this change which adds os::touch_memory, which is similar to
os::pretouch_memory but allows concurrent access to the memory while it is
being touched.  This is accomplished by using an atomic add of zero as the
operation for touching the memory, ensuring the virtual location is backed
by physical memory while not changing any values being read or written by
other threads.

While I was there, fixed some other lurking issues in os::pretouch_memory.
There was a potential overflow in the iteration that has been fixed.  And if
the range arguments weren't page aligned then the last page might not get
touched.  The latter was even mentioned in the function's description.  Both
of those have been fixed by careful alignment and some extra checks.  The
resulting code is a little more complicated, but more robust and complete.

Similarly added TouchTask, which is similar to PretouchTask.  Again here,
there is some cleaning up to avoid potential overflows and such.

- The chunk size is computed using the page size after possible adjustment
for UseTransparentHugePages.  We want a chunk size that reflects the actual
number of touches that will be performed.

- The chunk claim is now done using a CAS that won't exceed the range end.
The old atomic-fetch-and-add and check the result, which is performed by
each worker thread, could lead to overflow.  The old code has a test for
overflow, but since pointer-arithmetic overflow is UB that's not reliable.

- The old calculation of num_chunks for parallel touching could also
potentially overflow.

Testing:
mach5 tier1-3

-------------

Commit messages:
 - touch task
 - add touch_memory

Changes: https://git.openjdk.java.net/jdk/pull/5353/files
 Webrev: https://webrevs.openjdk.java.net/?repo=jdk&pr=5353&range=00
  Issue: https://bugs.openjdk.java.net/browse/JDK-8272807
  Stats: 194 lines in 4 files changed: 122 ins; 8 del; 64 mod
  Patch: https://git.openjdk.java.net/jdk/pull/5353.diff
  Fetch: git fetch https://git.openjdk.java.net/jdk pull/5353/head:pull/5353

PR: https://git.openjdk.java.net/jdk/pull/5353


More information about the hotspot-dev mailing list