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 }