8342610: ZGC: Cleanup pre-touching code

Reviewed-by: aboldtch, mli, jsikstro, eosterlund
This commit is contained in:
Stefan Karlsson 2024-10-22 13:15:17 +00:00
parent f70ecc27a7
commit 264d7014a1
3 changed files with 25 additions and 26 deletions

@ -30,6 +30,7 @@
#include "gc/z/zGeneration.inline.hpp"
#include "gc/z/zGenerationId.hpp"
#include "gc/z/zGlobals.hpp"
#include "gc/z/zLargePages.inline.hpp"
#include "gc/z/zLock.inline.hpp"
#include "gc/z/zPage.inline.hpp"
#include "gc/z/zPageAge.hpp"
@ -46,6 +47,7 @@
#include "runtime/globals.hpp"
#include "runtime/init.hpp"
#include "runtime/java.hpp"
#include "runtime/os.hpp"
#include "utilities/debug.hpp"
#include "utilities/globalDefinitions.hpp"
@ -232,29 +234,38 @@ bool ZPageAllocator::is_initialized() const {
class ZPreTouchTask : public ZTask {
private:
const ZPhysicalMemoryManager* const _physical;
volatile zoffset _start;
const zoffset_end _end;
volatile uintptr_t _current;
const uintptr_t _end;
static void pretouch(zaddress zaddr, size_t size) {
const uintptr_t addr = untype(zaddr);
const size_t page_size = ZLargePages::is_explicit() ? ZGranuleSize : os::vm_page_size();
os::pretouch_memory((void*)addr, (void*)(addr + size), page_size);
}
public:
ZPreTouchTask(const ZPhysicalMemoryManager* physical, zoffset start, zoffset_end end)
ZPreTouchTask(zoffset start, zoffset_end end)
: ZTask("ZPreTouchTask"),
_physical(physical),
_start(start),
_end(end) {}
_current(untype(start)),
_end(untype(end)) {}
virtual void work() {
const size_t size = ZGranuleSize;
for (;;) {
// Get granule offset
const size_t size = ZGranuleSize;
const zoffset offset = to_zoffset(Atomic::fetch_then_add((uintptr_t*)&_start, size));
if (offset >= _end) {
// Claim an offset for this thread
const uintptr_t claimed = Atomic::fetch_then_add(&_current, size);
if (claimed >= _end) {
// Done
break;
}
// Pre-touch granule
_physical->pretouch(offset, size);
// At this point we know that we have a valid zoffset / zaddress.
const zoffset offset = to_zoffset(claimed);
const zaddress addr = ZOffset::address(offset);
// Pre-touch the granule
pretouch(addr, size);
}
}
};
@ -271,7 +282,7 @@ bool ZPageAllocator::prime_cache(ZWorkers* workers, size_t size) {
if (AlwaysPreTouch) {
// Pre-touch page
ZPreTouchTask task(&_physical, page->start(), page->end());
ZPreTouchTask task(page->start(), page->end());
workers->run_all(&task);
}

@ -357,12 +357,6 @@ bool ZPhysicalMemoryManager::uncommit(ZPhysicalMemory& pmem) {
return true;
}
void ZPhysicalMemoryManager::pretouch(zoffset offset, size_t size) const {
const uintptr_t addr = untype(ZOffset::address(offset));
const size_t page_size = ZLargePages::is_explicit() ? ZGranuleSize : os::vm_page_size();
os::pretouch_memory((void*)addr, (void*)(addr + size), page_size);
}
// Map virtual memory to physcial memory
void ZPhysicalMemoryManager::map(zoffset offset, const ZPhysicalMemory& pmem) const {
const zaddress_unsafe addr = ZOffset::address_unsafe(offset);

@ -84,10 +84,6 @@ private:
ZPhysicalMemoryBacking _backing;
ZMemoryManager _manager;
void pretouch_view(zaddress addr, size_t size) const;
void map_view(zaddress_unsafe addr, const ZPhysicalMemory& pmem) const;
void unmap_view(zaddress_unsafe addr, size_t size) const;
public:
ZPhysicalMemoryManager(size_t max_capacity);
@ -102,8 +98,6 @@ public:
bool commit(ZPhysicalMemory& pmem);
bool uncommit(ZPhysicalMemory& pmem);
void pretouch(zoffset offset, size_t size) const;
void map(zoffset offset, const ZPhysicalMemory& pmem) const;
void unmap(zoffset offset, size_t size) const;
};