Mercurial > hg > graal-jvmci-8
annotate src/share/vm/gc_implementation/g1/g1PageBasedVirtualSpace.cpp @ 22298:c28cb37b2e1d
Rename JVMCI to INCLUDE_JVMCI.
author | twisti |
---|---|
date | Wed, 22 Jul 2015 08:56:03 -0700 |
parents | ae52ee069062 |
children | 340ca8812af9 |
rev | line source |
---|---|
20337 | 1 /* |
2 * Copyright (c) 2014, 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 | |
25 #include "precompiled.hpp" | |
26 #include "gc_implementation/g1/g1PageBasedVirtualSpace.hpp" | |
27 #include "oops/markOop.hpp" | |
28 #include "oops/oop.inline.hpp" | |
29 #include "services/memTracker.hpp" | |
30 #ifdef TARGET_OS_FAMILY_linux | |
31 # include "os_linux.inline.hpp" | |
32 #endif | |
33 #ifdef TARGET_OS_FAMILY_solaris | |
34 # include "os_solaris.inline.hpp" | |
35 #endif | |
36 #ifdef TARGET_OS_FAMILY_windows | |
37 # include "os_windows.inline.hpp" | |
38 #endif | |
39 #ifdef TARGET_OS_FAMILY_aix | |
40 # include "os_aix.inline.hpp" | |
41 #endif | |
42 #ifdef TARGET_OS_FAMILY_bsd | |
43 # include "os_bsd.inline.hpp" | |
44 #endif | |
45 #include "utilities/bitMap.inline.hpp" | |
46 | |
47 G1PageBasedVirtualSpace::G1PageBasedVirtualSpace() : _low_boundary(NULL), | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
48 _high_boundary(NULL), _committed(), _page_size(0), _special(false), |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
49 _dirty(), _executable(false) { |
20337 | 50 } |
51 | |
52 bool G1PageBasedVirtualSpace::initialize_with_granularity(ReservedSpace rs, size_t page_size) { | |
53 if (!rs.is_reserved()) { | |
54 return false; // Allocation failed. | |
55 } | |
56 assert(_low_boundary == NULL, "VirtualSpace already initialized"); | |
57 assert(page_size > 0, "Granularity must be non-zero."); | |
58 | |
59 _low_boundary = rs.base(); | |
60 _high_boundary = _low_boundary + rs.size(); | |
61 | |
62 _special = rs.special(); | |
63 _executable = rs.executable(); | |
64 | |
65 _page_size = page_size; | |
66 | |
67 assert(_committed.size() == 0, "virtual space initialized more than once"); | |
68 uintx size_in_bits = rs.size() / page_size; | |
69 _committed.resize(size_in_bits, /* in_resource_area */ false); | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
70 if (_special) { |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
71 _dirty.resize(size_in_bits, /* in_resource_area */ false); |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
72 } |
20337 | 73 |
74 return true; | |
75 } | |
76 | |
77 | |
78 G1PageBasedVirtualSpace::~G1PageBasedVirtualSpace() { | |
79 release(); | |
80 } | |
81 | |
82 void G1PageBasedVirtualSpace::release() { | |
83 // This does not release memory it never reserved. | |
84 // Caller must release via rs.release(); | |
85 _low_boundary = NULL; | |
86 _high_boundary = NULL; | |
87 _special = false; | |
88 _executable = false; | |
89 _page_size = 0; | |
90 _committed.resize(0, false); | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
91 _dirty.resize(0, false); |
20337 | 92 } |
93 | |
94 size_t G1PageBasedVirtualSpace::committed_size() const { | |
95 return _committed.count_one_bits() * _page_size; | |
96 } | |
97 | |
98 size_t G1PageBasedVirtualSpace::reserved_size() const { | |
99 return pointer_delta(_high_boundary, _low_boundary, sizeof(char)); | |
100 } | |
101 | |
102 size_t G1PageBasedVirtualSpace::uncommitted_size() const { | |
103 return reserved_size() - committed_size(); | |
104 } | |
105 | |
106 uintptr_t G1PageBasedVirtualSpace::addr_to_page_index(char* addr) const { | |
107 return (addr - _low_boundary) / _page_size; | |
108 } | |
109 | |
110 bool G1PageBasedVirtualSpace::is_area_committed(uintptr_t start, size_t size_in_pages) const { | |
111 uintptr_t end = start + size_in_pages; | |
112 return _committed.get_next_zero_offset(start, end) >= end; | |
113 } | |
114 | |
115 bool G1PageBasedVirtualSpace::is_area_uncommitted(uintptr_t start, size_t size_in_pages) const { | |
116 uintptr_t end = start + size_in_pages; | |
117 return _committed.get_next_one_offset(start, end) >= end; | |
118 } | |
119 | |
120 char* G1PageBasedVirtualSpace::page_start(uintptr_t index) { | |
121 return _low_boundary + index * _page_size; | |
122 } | |
123 | |
124 size_t G1PageBasedVirtualSpace::byte_size_for_pages(size_t num) { | |
125 return num * _page_size; | |
126 } | |
127 | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
128 bool G1PageBasedVirtualSpace::commit(uintptr_t start, size_t size_in_pages) { |
20337 | 129 // We need to make sure to commit all pages covered by the given area. |
130 guarantee(is_area_uncommitted(start, size_in_pages), "Specified area is not uncommitted"); | |
131 | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
132 bool zero_filled = true; |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
133 uintptr_t end = start + size_in_pages; |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
134 |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
135 if (_special) { |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
136 // Check for dirty pages and update zero_filled if any found. |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
137 if (_dirty.get_next_one_offset(start,end) < end) { |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
138 zero_filled = false; |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
139 _dirty.clear_range(start, end); |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
140 } |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
141 } else { |
20337 | 142 os::commit_memory_or_exit(page_start(start), byte_size_for_pages(size_in_pages), _executable, |
143 err_msg("Failed to commit pages from "SIZE_FORMAT" of length "SIZE_FORMAT, start, size_in_pages)); | |
144 } | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
145 _committed.set_range(start, end); |
20337 | 146 |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
147 return zero_filled; |
20337 | 148 } |
149 | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
150 void G1PageBasedVirtualSpace::uncommit(uintptr_t start, size_t size_in_pages) { |
20337 | 151 guarantee(is_area_committed(start, size_in_pages), "checking"); |
152 | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
153 if (_special) { |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
154 // Mark that memory is dirty. If committed again the memory might |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
155 // need to be cleared explicitly. |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
156 _dirty.set_range(start, start + size_in_pages); |
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
157 } else { |
20337 | 158 os::uncommit_memory(page_start(start), byte_size_for_pages(size_in_pages)); |
159 } | |
160 | |
161 _committed.clear_range(start, start + size_in_pages); | |
162 } | |
163 | |
164 bool G1PageBasedVirtualSpace::contains(const void* p) const { | |
165 return _low_boundary <= (const char*) p && (const char*) p < _high_boundary; | |
166 } | |
167 | |
168 #ifndef PRODUCT | |
169 void G1PageBasedVirtualSpace::print_on(outputStream* out) { | |
170 out->print ("Virtual space:"); | |
20795
ae52ee069062
8062063: Usage of UseHugeTLBFS, UseLargePagesInMetaspace and huge SurvivorAlignmentInBytes cause crashes in CMBitMapClosure::do_bit
sjohanss
parents:
20338
diff
changeset
|
171 if (_special) out->print(" (pinned in memory)"); |
20337 | 172 out->cr(); |
173 out->print_cr(" - committed: " SIZE_FORMAT, committed_size()); | |
174 out->print_cr(" - reserved: " SIZE_FORMAT, reserved_size()); | |
175 out->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", p2i(_low_boundary), p2i(_high_boundary)); | |
176 } | |
177 | |
178 void G1PageBasedVirtualSpace::print() { | |
179 print_on(tty); | |
180 } | |
181 #endif |