Navigation Menu

Skip to content

Commit

Permalink
8257073: ZGC: Try forward object before retaining page
Browse files Browse the repository at this point in the history
Reviewed-by: ayang, eosterlund, stefank
  • Loading branch information
pliden committed Nov 26, 2020
1 parent 1b3aa3a commit bf66d73
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 15 deletions.
4 changes: 3 additions & 1 deletion src/hotspot/share/gc/z/zForwarding.inline.hpp
Expand Up @@ -94,7 +94,9 @@ inline ZForwardingEntry* ZForwarding::entries() const {
}

inline ZForwardingEntry ZForwarding::at(ZForwardingCursor* cursor) const {
return Atomic::load(entries() + *cursor);
// Load acquire for correctness with regards to
// accesses to the contents of the forwarded object.
return Atomic::load_acquire(entries() + *cursor);
}

inline ZForwardingEntry ZForwarding::first(uintptr_t from_index, ZForwardingCursor* cursor) const {
Expand Down
26 changes: 13 additions & 13 deletions src/hotspot/share/gc/z/zRelocate.cpp
Expand Up @@ -58,21 +58,12 @@ static uintptr_t forwarding_insert(ZForwarding* forwarding, uintptr_t from_addr,
return ZAddress::good(to_offset_final);
}

uintptr_t ZRelocate::relocate_object_inner(ZForwarding* forwarding, uintptr_t from_addr) const {
ZForwardingCursor cursor;

// Lookup forwarding
uintptr_t to_addr = forwarding_find(forwarding, from_addr, &cursor);
if (to_addr != 0) {
// Already relocated
return to_addr;
}

static uintptr_t relocate_object_inner(ZForwarding* forwarding, uintptr_t from_addr, ZForwardingCursor* cursor) {
assert(ZHeap::heap()->is_object_live(from_addr), "Should be live");

// Allocate object
const size_t size = ZUtils::object_size(from_addr);
to_addr = ZHeap::heap()->alloc_object_non_blocking(size);
const uintptr_t to_addr = ZHeap::heap()->alloc_object_non_blocking(size);
if (to_addr == 0) {
// Allocation failed
return 0;
Expand All @@ -82,7 +73,7 @@ uintptr_t ZRelocate::relocate_object_inner(ZForwarding* forwarding, uintptr_t fr
ZUtils::object_copy_disjoint(from_addr, to_addr, size);

// Insert forwarding
const uintptr_t to_addr_final = forwarding_insert(forwarding, from_addr, to_addr, &cursor);
const uintptr_t to_addr_final = forwarding_insert(forwarding, from_addr, to_addr, cursor);
if (to_addr_final != to_addr) {
// Already relocated, try undo allocation
ZHeap::heap()->undo_alloc_object(to_addr, size);
Expand All @@ -92,9 +83,18 @@ uintptr_t ZRelocate::relocate_object_inner(ZForwarding* forwarding, uintptr_t fr
}

uintptr_t ZRelocate::relocate_object(ZForwarding* forwarding, uintptr_t from_addr) const {
ZForwardingCursor cursor;

// Lookup forwarding
uintptr_t to_addr = forwarding_find(forwarding, from_addr, &cursor);
if (to_addr != 0) {
// Already relocated
return to_addr;
}

// Relocate object
if (forwarding->retain_page()) {
const uintptr_t to_addr = relocate_object_inner(forwarding, from_addr);
to_addr = relocate_object_inner(forwarding, from_addr, &cursor);
forwarding->release_page();

if (to_addr != 0) {
Expand Down
1 change: 0 additions & 1 deletion src/hotspot/share/gc/z/zRelocate.hpp
Expand Up @@ -35,7 +35,6 @@ class ZRelocate {
private:
ZWorkers* const _workers;

uintptr_t relocate_object_inner(ZForwarding* forwarding, uintptr_t from_addr) const;
void work(ZRelocationSetParallelIterator* iter);

public:
Expand Down

1 comment on commit bf66d73

@openjdk-notifier
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.