8220590: ZGC: Remove ZPages from ZPageTable when freed
Reviewed-by: stefank, eosterlund
This commit is contained in:
parent
b29bc9f1da
commit
e7cfe60a32
@ -221,7 +221,7 @@ void ZHeap::out_of_memory() {
|
|||||||
ZPage* ZHeap::alloc_page(uint8_t type, size_t size, ZAllocationFlags flags) {
|
ZPage* ZHeap::alloc_page(uint8_t type, size_t size, ZAllocationFlags flags) {
|
||||||
ZPage* const page = _page_allocator.alloc_page(type, size, flags);
|
ZPage* const page = _page_allocator.alloc_page(type, size, flags);
|
||||||
if (page != NULL) {
|
if (page != NULL) {
|
||||||
// Update page table
|
// Insert page table entry
|
||||||
_page_table.insert(page);
|
_page_table.insert(page);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,6 +239,10 @@ void ZHeap::undo_alloc_page(ZPage* page) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void ZHeap::free_page(ZPage* page, bool reclaimed) {
|
void ZHeap::free_page(ZPage* page, bool reclaimed) {
|
||||||
|
// Remove page table entry
|
||||||
|
_page_table.remove(page);
|
||||||
|
|
||||||
|
// Free page
|
||||||
_page_allocator.free_page(page, reclaimed);
|
_page_allocator.free_page(page, reclaimed);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -406,9 +410,6 @@ void ZHeap::destroy_detached_pages() {
|
|||||||
_page_allocator.flush_detached_pages(&list);
|
_page_allocator.flush_detached_pages(&list);
|
||||||
|
|
||||||
for (ZPage* page = list.remove_first(); page != NULL; page = list.remove_first()) {
|
for (ZPage* page = list.remove_first(); page != NULL; page = list.remove_first()) {
|
||||||
// Remove page table entry
|
|
||||||
_page_table.remove(page);
|
|
||||||
|
|
||||||
// Delete the page
|
// Delete the page
|
||||||
_page_allocator.destroy_page(page);
|
_page_allocator.destroy_page(page);
|
||||||
}
|
}
|
||||||
|
@ -36,16 +36,12 @@ void ZPageTable::insert(ZPage* page) {
|
|||||||
const uintptr_t addr = ZAddress::good(page->start());
|
const uintptr_t addr = ZAddress::good(page->start());
|
||||||
const size_t size = page->size();
|
const size_t size = page->size();
|
||||||
|
|
||||||
// Cached pages stays in the page table.
|
// Make sure a newly created page is
|
||||||
// Don't re-insert if it's already present.
|
// visible before updating the page table.
|
||||||
if (get(addr) == NULL) {
|
OrderAccess::storestore();
|
||||||
// Make sure a newly created page is
|
|
||||||
// visible before updating the page table.
|
|
||||||
OrderAccess::storestore();
|
|
||||||
_map.put(addr, size, page);
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(get(addr) == page, "Invalid entry");
|
assert(get(addr) == NULL, "Invalid entry");
|
||||||
|
_map.put(addr, size, page);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ZPageTable::remove(ZPage* page) {
|
void ZPageTable::remove(ZPage* page) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user