RFR: 8272807: Permit use of memory concurrent with pretouch [v2]

Kim Barrett kbarrett at openjdk.java.net
Tue Sep 21 23:01:08 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

Kim Barrett has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains four additional commits since the last revision:

 - Merge branch 'master' into touch_memory
 - simplify touch_impl, using conditional on bool arg rather than template specialization
 - touch task
 - add touch_memory

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

Changes:
  - all: https://git.openjdk.java.net/jdk/pull/5353/files
  - new: https://git.openjdk.java.net/jdk/pull/5353/files/d33934f3..3c8db1dc

Webrevs:
 - full: https://webrevs.openjdk.java.net/?repo=jdk&pr=5353&range=01
 - incr: https://webrevs.openjdk.java.net/?repo=jdk&pr=5353&range=00-01

  Stats: 25850 lines in 930 files changed: 18027 ins; 4839 del; 2984 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