1 /* 2 * Copyright (c) 2015, 2019, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 24 #include "precompiled.hpp" 25 #include "gc/z/zPage.inline.hpp" 26 #include "gc/z/zPhysicalMemory.inline.hpp" 27 #include "gc/z/zVirtualMemory.inline.hpp" 28 #include "utilities/align.hpp" 29 #include "utilities/debug.hpp" 30 31 ZPage::ZPage(const ZVirtualMemory& vmem, const ZPhysicalMemory& pmem) : 32 _type(type_from_size(vmem.size())), 33 _numa_id((uint8_t)-1), 34 _seqnum(0), 35 _virtual(vmem), 36 _top(start()), 37 _livemap(object_max_count()), 38 _last_used(0), 39 _physical(pmem) { 40 assert_initialized(); 41 } 42 43 ZPage::ZPage(uint8_t type, const ZVirtualMemory& vmem, const ZPhysicalMemory& pmem) : 44 _type(type), 45 _numa_id((uint8_t)-1), 46 _seqnum(0), 47 _virtual(vmem), 48 _top(start()), 49 _livemap(object_max_count()), 50 _last_used(0), 51 _physical(pmem) { 52 assert_initialized(); 53 } 54 55 void ZPage::assert_initialized() const { 56 assert(!_virtual.is_null(), "Should not be null"); 57 assert(!_physical.is_null(), "Should not be null"); 58 assert((_type == ZPageTypeSmall && size() == ZPageSizeSmall) || 59 (_type == ZPageTypeMedium && size() == ZPageSizeMedium) || 60 (_type == ZPageTypeLarge && is_aligned(size(), ZGranuleSize)), 61 "Page type/size mismatch"); 62 } 63 64 void ZPage::reset() { 65 _seqnum = ZGlobalSeqNum; 66 _top = start(); 67 _livemap.reset(); 68 _last_used = 0; 69 } 70 71 void ZPage::clear() { 72 const uintptr_t addr = ZAddress::good(start()); 73 ZUtils::zero(addr, size()); 74 } 75 76 ZPage* ZPage::retype(uint8_t type) { 77 assert(_type != type, "Invalid retype"); 78 _type = type; 79 _livemap.resize(object_max_count()); 80 return this; 81 } 82 83 ZPage* ZPage::split(size_t size) { 84 return split(type_from_size(size), size); 85 } 86 87 ZPage* ZPage::split(uint8_t type, size_t size) { 88 assert(_virtual.size() > size, "Invalid split"); 89 90 // Resize this page, keep _numa_id, _seqnum, and _last_used 91 const ZVirtualMemory vmem = _virtual.split(size); 92 const ZPhysicalMemory pmem = _physical.split(size); 93 _type = type_from_size(_virtual.size()); 94 _top = start(); 95 _livemap.resize(object_max_count()); 96 97 // Create new page, inherit _seqnum and _last_used 98 ZPage* const page = new ZPage(type, vmem, pmem); 99 page->_seqnum = _seqnum; 100 page->_last_used = _last_used; 101 return page; 102 } 103 104 void ZPage::print_on(outputStream* out) const { 105 out->print_cr(" %-6s " PTR_FORMAT " " PTR_FORMAT " " PTR_FORMAT " %s%s", 106 type_to_string(), start(), top(), end(), 107 is_allocating() ? " Allocating" : "", 108 is_relocatable() ? " Relocatable" : ""); 109 } 110 111 void ZPage::print() const { 112 print_on(tty); 113 }