Mercurial > hg > graal-jvmci-8
annotate src/share/vm/runtime/virtualspace.cpp @ 12173:27ffd1c4537b
Merge
author | rbackman |
---|---|
date | Mon, 02 Sep 2013 13:13:45 +0200 |
parents | 4c84d351cca9 |
children | c4c768305a8f e2722a66aba7 |
rev | line source |
---|---|
0 | 1 /* |
7623
203f64878aab
7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents:
7433
diff
changeset
|
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. |
0 | 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 * | |
1552
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
20 * or visit www.oracle.com if you need additional information or have any |
c18cbe5936b8
6941466: Oracle rebranding changes for Hotspot repositories
trims
parents:
844
diff
changeset
|
21 * questions. |
0 | 22 * |
23 */ | |
24 | |
1972 | 25 #include "precompiled.hpp" |
26 #include "oops/markOop.hpp" | |
27 #include "oops/oop.inline.hpp" | |
28 #include "runtime/virtualspace.hpp" | |
6197 | 29 #include "services/memTracker.hpp" |
1972 | 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 | |
3960 | 39 #ifdef TARGET_OS_FAMILY_bsd |
40 # include "os_bsd.inline.hpp" | |
41 #endif | |
0 | 42 |
43 | |
44 // ReservedSpace | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
45 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
46 // Dummy constructor |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
47 ReservedSpace::ReservedSpace() : _base(NULL), _size(0), _noaccess_prefix(0), |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
48 _alignment(0), _special(false), _executable(false) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
49 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
50 |
0 | 51 ReservedSpace::ReservedSpace(size_t size) { |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
52 size_t page_size = os::page_size_for_region(size, size, 1); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
53 bool large_pages = page_size != (size_t)os::vm_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
54 // Don't force the alignment to be large page aligned, |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
55 // since that will waste memory. |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
56 size_t alignment = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
57 initialize(size, alignment, large_pages, NULL, 0, false); |
0 | 58 } |
59 | |
60 ReservedSpace::ReservedSpace(size_t size, size_t alignment, | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
61 bool large, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
62 char* requested_address, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
63 const size_t noaccess_prefix) { |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
64 initialize(size+noaccess_prefix, alignment, large, requested_address, |
656 | 65 noaccess_prefix, false); |
66 } | |
67 | |
68 ReservedSpace::ReservedSpace(size_t size, size_t alignment, | |
69 bool large, | |
70 bool executable) { | |
71 initialize(size, alignment, large, NULL, 0, executable); | |
0 | 72 } |
73 | |
1618 | 74 // Helper method. |
75 static bool failed_to_reserve_as_requested(char* base, char* requested_address, | |
76 const size_t size, bool special) | |
77 { | |
78 if (base == requested_address || requested_address == NULL) | |
79 return false; // did not fail | |
80 | |
81 if (base != NULL) { | |
82 // Different reserve address may be acceptable in other cases | |
83 // but for compressed oops heap should be at requested address. | |
84 assert(UseCompressedOops, "currently requested address used only for compressed oops"); | |
85 if (PrintCompressedOopsMode) { | |
86 tty->cr(); | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
87 tty->print_cr("Reserved memory not at requested address: " PTR_FORMAT " vs " PTR_FORMAT, base, requested_address); |
1618 | 88 } |
89 // OS ignored requested address. Try different address. | |
90 if (special) { | |
91 if (!os::release_memory_special(base, size)) { | |
92 fatal("os::release_memory_special failed"); | |
93 } | |
94 } else { | |
95 if (!os::release_memory(base, size)) { | |
96 fatal("os::release_memory failed"); | |
97 } | |
98 } | |
99 } | |
100 return true; | |
101 } | |
102 | |
0 | 103 void ReservedSpace::initialize(size_t size, size_t alignment, bool large, |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
104 char* requested_address, |
656 | 105 const size_t noaccess_prefix, |
106 bool executable) { | |
0 | 107 const size_t granularity = os::vm_allocation_granularity(); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
108 assert((size & (granularity - 1)) == 0, |
0 | 109 "size not aligned to os::vm_allocation_granularity()"); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
110 assert((alignment & (granularity - 1)) == 0, |
0 | 111 "alignment not aligned to os::vm_allocation_granularity()"); |
112 assert(alignment == 0 || is_power_of_2((intptr_t)alignment), | |
113 "not a power of 2"); | |
114 | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
115 alignment = MAX2(alignment, (size_t)os::vm_page_size()); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
116 |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
117 // Assert that if noaccess_prefix is used, it is the same as alignment. |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
118 assert(noaccess_prefix == 0 || |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
119 noaccess_prefix == alignment, "noaccess prefix wrong"); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
120 |
0 | 121 _base = NULL; |
122 _size = 0; | |
123 _special = false; | |
656 | 124 _executable = executable; |
0 | 125 _alignment = 0; |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
126 _noaccess_prefix = 0; |
0 | 127 if (size == 0) { |
128 return; | |
129 } | |
130 | |
131 // If OS doesn't support demand paging for large page memory, we need | |
132 // to use reserve_memory_special() to reserve and pin the entire region. | |
133 bool special = large && !os::can_commit_large_page_memory(); | |
134 char* base = NULL; | |
135 | |
1618 | 136 if (requested_address != 0) { |
137 requested_address -= noaccess_prefix; // adjust requested address | |
138 assert(requested_address != NULL, "huge noaccess prefix?"); | |
139 } | |
140 | |
0 | 141 if (special) { |
142 | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
143 base = os::reserve_memory_special(size, alignment, requested_address, executable); |
0 | 144 |
145 if (base != NULL) { | |
1618 | 146 if (failed_to_reserve_as_requested(base, requested_address, size, true)) { |
147 // OS ignored requested address. Try different address. | |
148 return; | |
149 } | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
150 // Check alignment constraints. |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
151 assert((uintptr_t) base % alignment == 0, |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
152 err_msg("Large pages returned a non-aligned address, base: " |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
153 PTR_FORMAT " alignment: " PTR_FORMAT, |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
154 base, (void*)(uintptr_t)alignment)); |
0 | 155 _special = true; |
156 } else { | |
157 // failed; try to reserve regular memory below | |
1618 | 158 if (UseLargePages && (!FLAG_IS_DEFAULT(UseLargePages) || |
159 !FLAG_IS_DEFAULT(LargePageSizeInBytes))) { | |
160 if (PrintCompressedOopsMode) { | |
161 tty->cr(); | |
162 tty->print_cr("Reserve regular memory without large pages."); | |
163 } | |
164 } | |
0 | 165 } |
166 } | |
167 | |
168 if (base == NULL) { | |
169 // Optimistically assume that the OSes returns an aligned base pointer. | |
170 // When reserving a large address range, most OSes seem to align to at | |
171 // least 64K. | |
172 | |
173 // If the memory was requested at a particular address, use | |
174 // os::attempt_reserve_memory_at() to avoid over mapping something | |
175 // important. If available space is not detected, return NULL. | |
176 | |
177 if (requested_address != 0) { | |
1618 | 178 base = os::attempt_reserve_memory_at(size, requested_address); |
179 if (failed_to_reserve_as_requested(base, requested_address, size, false)) { | |
180 // OS ignored requested address. Try different address. | |
181 base = NULL; | |
182 } | |
0 | 183 } else { |
184 base = os::reserve_memory(size, NULL, alignment); | |
185 } | |
186 | |
187 if (base == NULL) return; | |
188 | |
189 // Check alignment constraints | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
190 if ((((size_t)base + noaccess_prefix) & (alignment - 1)) != 0) { |
0 | 191 // Base not aligned, retry |
192 if (!os::release_memory(base, size)) fatal("os::release_memory failed"); | |
7433
730cc4ddd550
7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents:
6725
diff
changeset
|
193 // Make sure that size is aligned |
0 | 194 size = align_size_up(size, alignment); |
7433
730cc4ddd550
7173959: Jvm crashed during coherence exabus (tmb) testing
brutisso
parents:
6725
diff
changeset
|
195 base = os::reserve_memory_aligned(size, alignment); |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
196 |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
197 if (requested_address != 0 && |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
198 failed_to_reserve_as_requested(base, requested_address, size, false)) { |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
199 // As a result of the alignment constraints, the allocated base differs |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
200 // from the requested address. Return back to the caller who can |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
201 // take remedial action (like try again without a requested address). |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
202 assert(_base == NULL, "should be"); |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
203 return; |
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
204 } |
0 | 205 } |
206 } | |
207 // Done | |
208 _base = base; | |
209 _size = size; | |
3824
6aa4feb8a366
7069863: G1: SIGSEGV running SPECjbb2011 and -UseBiasedLocking
johnc
parents:
1972
diff
changeset
|
210 _alignment = alignment; |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
211 _noaccess_prefix = noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
212 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
213 // Assert that if noaccess_prefix is used, it is the same as alignment. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
214 assert(noaccess_prefix == 0 || |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
215 noaccess_prefix == _alignment, "noaccess prefix wrong"); |
0 | 216 |
217 assert(markOopDesc::encode_pointer_as_mark(_base)->decode_pointer() == _base, | |
218 "area must be distinguisable from marks for mark-sweep"); | |
219 assert(markOopDesc::encode_pointer_as_mark(&_base[size])->decode_pointer() == &_base[size], | |
220 "area must be distinguisable from marks for mark-sweep"); | |
221 } | |
222 | |
223 | |
224 ReservedSpace::ReservedSpace(char* base, size_t size, size_t alignment, | |
656 | 225 bool special, bool executable) { |
0 | 226 assert((size % os::vm_allocation_granularity()) == 0, |
227 "size not allocation aligned"); | |
228 _base = base; | |
229 _size = size; | |
230 _alignment = alignment; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
231 _noaccess_prefix = 0; |
0 | 232 _special = special; |
656 | 233 _executable = executable; |
0 | 234 } |
235 | |
236 | |
237 ReservedSpace ReservedSpace::first_part(size_t partition_size, size_t alignment, | |
238 bool split, bool realloc) { | |
239 assert(partition_size <= size(), "partition failed"); | |
240 if (split) { | |
656 | 241 os::split_reserved_memory(base(), size(), partition_size, realloc); |
0 | 242 } |
656 | 243 ReservedSpace result(base(), partition_size, alignment, special(), |
244 executable()); | |
0 | 245 return result; |
246 } | |
247 | |
248 | |
249 ReservedSpace | |
250 ReservedSpace::last_part(size_t partition_size, size_t alignment) { | |
251 assert(partition_size <= size(), "partition failed"); | |
252 ReservedSpace result(base() + partition_size, size() - partition_size, | |
656 | 253 alignment, special(), executable()); |
0 | 254 return result; |
255 } | |
256 | |
257 | |
258 size_t ReservedSpace::page_align_size_up(size_t size) { | |
259 return align_size_up(size, os::vm_page_size()); | |
260 } | |
261 | |
262 | |
263 size_t ReservedSpace::page_align_size_down(size_t size) { | |
264 return align_size_down(size, os::vm_page_size()); | |
265 } | |
266 | |
267 | |
268 size_t ReservedSpace::allocation_align_size_up(size_t size) { | |
269 return align_size_up(size, os::vm_allocation_granularity()); | |
270 } | |
271 | |
272 | |
273 size_t ReservedSpace::allocation_align_size_down(size_t size) { | |
274 return align_size_down(size, os::vm_allocation_granularity()); | |
275 } | |
276 | |
277 | |
278 void ReservedSpace::release() { | |
279 if (is_reserved()) { | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
280 char *real_base = _base - _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
281 const size_t real_size = _size + _noaccess_prefix; |
0 | 282 if (special()) { |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
283 os::release_memory_special(real_base, real_size); |
0 | 284 } else{ |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
285 os::release_memory(real_base, real_size); |
0 | 286 } |
287 _base = NULL; | |
288 _size = 0; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
289 _noaccess_prefix = 0; |
0 | 290 _special = false; |
656 | 291 _executable = false; |
0 | 292 } |
293 } | |
294 | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
295 void ReservedSpace::protect_noaccess_prefix(const size_t size) { |
1618 | 296 assert( (_noaccess_prefix != 0) == (UseCompressedOops && _base != NULL && |
4934
7df3125953cb
7146354: Re-enable Compressed OOPs after 7118647 is resolved
coleenp
parents:
3960
diff
changeset
|
297 (Universe::narrow_oop_base() != NULL) && |
1618 | 298 Universe::narrow_oop_use_implicit_null_checks()), |
299 "noaccess_prefix should be used only with non zero based compressed oops"); | |
300 | |
301 // If there is no noaccess prefix, return. | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
302 if (_noaccess_prefix == 0) return; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
303 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
304 assert(_noaccess_prefix >= (size_t)os::vm_page_size(), |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
305 "must be at least page size big"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
306 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
307 // Protect memory at the base of the allocated region. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
308 // If special, the page was committed (only matters on windows) |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
309 if (!os::protect_memory(_base, _noaccess_prefix, os::MEM_PROT_NONE, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
310 _special)) { |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
311 fatal("cannot protect protection page"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
312 } |
1618 | 313 if (PrintCompressedOopsMode) { |
314 tty->cr(); | |
315 tty->print_cr("Protected page at the reserved heap base: " PTR_FORMAT " / " INTX_FORMAT " bytes", _base, _noaccess_prefix); | |
316 } | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
317 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
318 _base += _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
319 _size -= _noaccess_prefix; |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
320 assert((size == _size) && ((uintptr_t)_base % _alignment == 0), |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
321 "must be exactly of required size and alignment"); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
322 } |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
323 |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
324 ReservedHeapSpace::ReservedHeapSpace(size_t size, size_t alignment, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
325 bool large, char* requested_address) : |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
326 ReservedSpace(size, alignment, large, |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
327 requested_address, |
642
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
380
diff
changeset
|
328 (UseCompressedOops && (Universe::narrow_oop_base() != NULL) && |
660978a2a31a
6791178: Specialize for zero as the compressed oop vm heap base
kvn
parents:
380
diff
changeset
|
329 Universe::narrow_oop_use_implicit_null_checks()) ? |
325
93befa083681
6741004: UseLargePages + UseCompressedOops breaks implicit null checking guard page
coleenp
parents:
237
diff
changeset
|
330 lcm(os::vm_page_size(), alignment) : 0) { |
6197 | 331 if (base() > 0) { |
332 MemTracker::record_virtual_memory_type((address)base(), mtJavaHeap); | |
333 } | |
334 | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
335 // Only reserved space for the java heap should have a noaccess_prefix |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
336 // if using compressed oops. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
337 protect_noaccess_prefix(size); |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
338 } |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
339 |
656 | 340 // Reserve space for code segment. Same as Java heap only we mark this as |
341 // executable. | |
342 ReservedCodeSpace::ReservedCodeSpace(size_t r_size, | |
343 size_t rs_align, | |
344 bool large) : | |
345 ReservedSpace(r_size, rs_align, large, /*executable*/ true) { | |
6197 | 346 MemTracker::record_virtual_memory_type((address)base(), mtCode); |
656 | 347 } |
348 | |
0 | 349 // VirtualSpace |
350 | |
351 VirtualSpace::VirtualSpace() { | |
352 _low_boundary = NULL; | |
353 _high_boundary = NULL; | |
354 _low = NULL; | |
355 _high = NULL; | |
356 _lower_high = NULL; | |
357 _middle_high = NULL; | |
358 _upper_high = NULL; | |
359 _lower_high_boundary = NULL; | |
360 _middle_high_boundary = NULL; | |
361 _upper_high_boundary = NULL; | |
362 _lower_alignment = 0; | |
363 _middle_alignment = 0; | |
364 _upper_alignment = 0; | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
365 _special = false; |
656 | 366 _executable = false; |
0 | 367 } |
368 | |
369 | |
370 bool VirtualSpace::initialize(ReservedSpace rs, size_t committed_size) { | |
371 if(!rs.is_reserved()) return false; // allocation failed. | |
372 assert(_low_boundary == NULL, "VirtualSpace already initialized"); | |
373 _low_boundary = rs.base(); | |
374 _high_boundary = low_boundary() + rs.size(); | |
375 | |
376 _low = low_boundary(); | |
377 _high = low(); | |
378 | |
379 _special = rs.special(); | |
656 | 380 _executable = rs.executable(); |
0 | 381 |
382 // When a VirtualSpace begins life at a large size, make all future expansion | |
383 // and shrinking occur aligned to a granularity of large pages. This avoids | |
384 // fragmentation of physical addresses that inhibits the use of large pages | |
385 // by the OS virtual memory system. Empirically, we see that with a 4MB | |
386 // page size, the only spaces that get handled this way are codecache and | |
387 // the heap itself, both of which provide a substantial performance | |
388 // boost in many benchmarks when covered by large pages. | |
389 // | |
390 // No attempt is made to force large page alignment at the very top and | |
391 // bottom of the space if they are not aligned so already. | |
392 _lower_alignment = os::vm_page_size(); | |
393 _middle_alignment = os::page_size_for_region(rs.size(), rs.size(), 1); | |
394 _upper_alignment = os::vm_page_size(); | |
395 | |
396 // End of each region | |
397 _lower_high_boundary = (char*) round_to((intptr_t) low_boundary(), middle_alignment()); | |
398 _middle_high_boundary = (char*) round_down((intptr_t) high_boundary(), middle_alignment()); | |
399 _upper_high_boundary = high_boundary(); | |
400 | |
401 // High address of each region | |
402 _lower_high = low_boundary(); | |
403 _middle_high = lower_high_boundary(); | |
404 _upper_high = middle_high_boundary(); | |
405 | |
406 // commit to initial size | |
407 if (committed_size > 0) { | |
408 if (!expand_by(committed_size)) { | |
409 return false; | |
410 } | |
411 } | |
412 return true; | |
413 } | |
414 | |
415 | |
416 VirtualSpace::~VirtualSpace() { | |
417 release(); | |
418 } | |
419 | |
420 | |
421 void VirtualSpace::release() { | |
237
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
422 // This does not release memory it never reserved. |
1fdb98a17101
6716785: implicit null checks not triggering with CompressedOops
coleenp
parents:
0
diff
changeset
|
423 // Caller must release via rs.release(); |
0 | 424 _low_boundary = NULL; |
425 _high_boundary = NULL; | |
426 _low = NULL; | |
427 _high = NULL; | |
428 _lower_high = NULL; | |
429 _middle_high = NULL; | |
430 _upper_high = NULL; | |
431 _lower_high_boundary = NULL; | |
432 _middle_high_boundary = NULL; | |
433 _upper_high_boundary = NULL; | |
434 _lower_alignment = 0; | |
435 _middle_alignment = 0; | |
436 _upper_alignment = 0; | |
437 _special = false; | |
656 | 438 _executable = false; |
0 | 439 } |
440 | |
441 | |
442 size_t VirtualSpace::committed_size() const { | |
443 return pointer_delta(high(), low(), sizeof(char)); | |
444 } | |
445 | |
446 | |
447 size_t VirtualSpace::reserved_size() const { | |
448 return pointer_delta(high_boundary(), low_boundary(), sizeof(char)); | |
449 } | |
450 | |
451 | |
452 size_t VirtualSpace::uncommitted_size() const { | |
453 return reserved_size() - committed_size(); | |
454 } | |
455 | |
456 | |
457 bool VirtualSpace::contains(const void* p) const { | |
458 return low() <= (const char*) p && (const char*) p < high(); | |
459 } | |
460 | |
461 /* | |
462 First we need to determine if a particular virtual space is using large | |
463 pages. This is done at the initialize function and only virtual spaces | |
464 that are larger than LargePageSizeInBytes use large pages. Once we | |
465 have determined this, all expand_by and shrink_by calls must grow and | |
466 shrink by large page size chunks. If a particular request | |
467 is within the current large page, the call to commit and uncommit memory | |
468 can be ignored. In the case that the low and high boundaries of this | |
469 space is not large page aligned, the pages leading to the first large | |
470 page address and the pages after the last large page address must be | |
471 allocated with default pages. | |
472 */ | |
473 bool VirtualSpace::expand_by(size_t bytes, bool pre_touch) { | |
474 if (uncommitted_size() < bytes) return false; | |
475 | |
476 if (special()) { | |
477 // don't commit memory if the entire space is pinned in memory | |
478 _high += bytes; | |
479 return true; | |
480 } | |
481 | |
482 char* previous_high = high(); | |
483 char* unaligned_new_high = high() + bytes; | |
484 assert(unaligned_new_high <= high_boundary(), | |
485 "cannot expand by more than upper boundary"); | |
486 | |
487 // Calculate where the new high for each of the regions should be. If | |
488 // the low_boundary() and high_boundary() are LargePageSizeInBytes aligned | |
489 // then the unaligned lower and upper new highs would be the | |
490 // lower_high() and upper_high() respectively. | |
491 char* unaligned_lower_new_high = | |
492 MIN2(unaligned_new_high, lower_high_boundary()); | |
493 char* unaligned_middle_new_high = | |
494 MIN2(unaligned_new_high, middle_high_boundary()); | |
495 char* unaligned_upper_new_high = | |
496 MIN2(unaligned_new_high, upper_high_boundary()); | |
497 | |
498 // Align the new highs based on the regions alignment. lower and upper | |
499 // alignment will always be default page size. middle alignment will be | |
500 // LargePageSizeInBytes if the actual size of the virtual space is in | |
501 // fact larger than LargePageSizeInBytes. | |
502 char* aligned_lower_new_high = | |
503 (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment()); | |
504 char* aligned_middle_new_high = | |
505 (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment()); | |
506 char* aligned_upper_new_high = | |
507 (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment()); | |
508 | |
509 // Determine which regions need to grow in this expand_by call. | |
510 // If you are growing in the lower region, high() must be in that | |
511 // region so calcuate the size based on high(). For the middle and | |
512 // upper regions, determine the starting point of growth based on the | |
513 // location of high(). By getting the MAX of the region's low address | |
514 // (or the prevoius region's high address) and high(), we can tell if it | |
515 // is an intra or inter region growth. | |
516 size_t lower_needs = 0; | |
517 if (aligned_lower_new_high > lower_high()) { | |
518 lower_needs = | |
519 pointer_delta(aligned_lower_new_high, lower_high(), sizeof(char)); | |
520 } | |
521 size_t middle_needs = 0; | |
522 if (aligned_middle_new_high > middle_high()) { | |
523 middle_needs = | |
524 pointer_delta(aligned_middle_new_high, middle_high(), sizeof(char)); | |
525 } | |
526 size_t upper_needs = 0; | |
527 if (aligned_upper_new_high > upper_high()) { | |
528 upper_needs = | |
529 pointer_delta(aligned_upper_new_high, upper_high(), sizeof(char)); | |
530 } | |
531 | |
532 // Check contiguity. | |
533 assert(low_boundary() <= lower_high() && | |
534 lower_high() <= lower_high_boundary(), | |
535 "high address must be contained within the region"); | |
536 assert(lower_high_boundary() <= middle_high() && | |
537 middle_high() <= middle_high_boundary(), | |
538 "high address must be contained within the region"); | |
539 assert(middle_high_boundary() <= upper_high() && | |
540 upper_high() <= upper_high_boundary(), | |
541 "high address must be contained within the region"); | |
542 | |
543 // Commit regions | |
544 if (lower_needs > 0) { | |
545 assert(low_boundary() <= lower_high() && | |
546 lower_high() + lower_needs <= lower_high_boundary(), | |
547 "must not expand beyond region"); | |
656 | 548 if (!os::commit_memory(lower_high(), lower_needs, _executable)) { |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
549 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
550 ", lower_needs=" SIZE_FORMAT ", %d) failed", |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
551 lower_high(), lower_needs, _executable);) |
0 | 552 return false; |
553 } else { | |
554 _lower_high += lower_needs; | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
555 } |
0 | 556 } |
557 if (middle_needs > 0) { | |
558 assert(lower_high_boundary() <= middle_high() && | |
559 middle_high() + middle_needs <= middle_high_boundary(), | |
560 "must not expand beyond region"); | |
656 | 561 if (!os::commit_memory(middle_high(), middle_needs, middle_alignment(), |
562 _executable)) { | |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
563 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
564 ", middle_needs=" SIZE_FORMAT ", " SIZE_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
565 ", %d) failed", middle_high(), middle_needs, |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
566 middle_alignment(), _executable);) |
0 | 567 return false; |
568 } | |
569 _middle_high += middle_needs; | |
570 } | |
571 if (upper_needs > 0) { | |
572 assert(middle_high_boundary() <= upper_high() && | |
573 upper_high() + upper_needs <= upper_high_boundary(), | |
574 "must not expand beyond region"); | |
656 | 575 if (!os::commit_memory(upper_high(), upper_needs, _executable)) { |
10969
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
576 debug_only(warning("INFO: os::commit_memory(" PTR_FORMAT |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
577 ", upper_needs=" SIZE_FORMAT ", %d) failed", |
a837fa3d3f86
8013057: assert(_needs_gc || SafepointSynchronize::is_at_safepoint()) failed: only read at safepoint
dcubed
parents:
10187
diff
changeset
|
578 upper_high(), upper_needs, _executable);) |
0 | 579 return false; |
580 } else { | |
581 _upper_high += upper_needs; | |
582 } | |
583 } | |
584 | |
585 if (pre_touch || AlwaysPreTouch) { | |
586 int vm_ps = os::vm_page_size(); | |
587 for (char* curr = previous_high; | |
588 curr < unaligned_new_high; | |
589 curr += vm_ps) { | |
590 // Note the use of a write here; originally we tried just a read, but | |
591 // since the value read was unused, the optimizer removed the read. | |
592 // If we ever have a concurrent touchahead thread, we'll want to use | |
593 // a read, to avoid the potential of overwriting data (if a mutator | |
594 // thread beats the touchahead thread to a page). There are various | |
595 // ways of making sure this read is not optimized away: for example, | |
596 // generating the code for a read procedure at runtime. | |
597 *curr = 0; | |
598 } | |
599 } | |
600 | |
601 _high += bytes; | |
602 return true; | |
603 } | |
604 | |
605 // A page is uncommitted if the contents of the entire page is deemed unusable. | |
606 // Continue to decrement the high() pointer until it reaches a page boundary | |
607 // in which case that particular page can now be uncommitted. | |
608 void VirtualSpace::shrink_by(size_t size) { | |
609 if (committed_size() < size) | |
610 fatal("Cannot shrink virtual space to negative size"); | |
611 | |
612 if (special()) { | |
613 // don't uncommit if the entire space is pinned in memory | |
614 _high -= size; | |
615 return; | |
616 } | |
617 | |
618 char* unaligned_new_high = high() - size; | |
619 assert(unaligned_new_high >= low_boundary(), "cannot shrink past lower boundary"); | |
620 | |
621 // Calculate new unaligned address | |
622 char* unaligned_upper_new_high = | |
623 MAX2(unaligned_new_high, middle_high_boundary()); | |
624 char* unaligned_middle_new_high = | |
625 MAX2(unaligned_new_high, lower_high_boundary()); | |
626 char* unaligned_lower_new_high = | |
627 MAX2(unaligned_new_high, low_boundary()); | |
628 | |
629 // Align address to region's alignment | |
630 char* aligned_upper_new_high = | |
631 (char*) round_to((intptr_t) unaligned_upper_new_high, upper_alignment()); | |
632 char* aligned_middle_new_high = | |
633 (char*) round_to((intptr_t) unaligned_middle_new_high, middle_alignment()); | |
634 char* aligned_lower_new_high = | |
635 (char*) round_to((intptr_t) unaligned_lower_new_high, lower_alignment()); | |
636 | |
637 // Determine which regions need to shrink | |
638 size_t upper_needs = 0; | |
639 if (aligned_upper_new_high < upper_high()) { | |
640 upper_needs = | |
641 pointer_delta(upper_high(), aligned_upper_new_high, sizeof(char)); | |
642 } | |
643 size_t middle_needs = 0; | |
644 if (aligned_middle_new_high < middle_high()) { | |
645 middle_needs = | |
646 pointer_delta(middle_high(), aligned_middle_new_high, sizeof(char)); | |
647 } | |
648 size_t lower_needs = 0; | |
649 if (aligned_lower_new_high < lower_high()) { | |
650 lower_needs = | |
651 pointer_delta(lower_high(), aligned_lower_new_high, sizeof(char)); | |
652 } | |
653 | |
654 // Check contiguity. | |
655 assert(middle_high_boundary() <= upper_high() && | |
656 upper_high() <= upper_high_boundary(), | |
657 "high address must be contained within the region"); | |
658 assert(lower_high_boundary() <= middle_high() && | |
659 middle_high() <= middle_high_boundary(), | |
660 "high address must be contained within the region"); | |
661 assert(low_boundary() <= lower_high() && | |
662 lower_high() <= lower_high_boundary(), | |
663 "high address must be contained within the region"); | |
664 | |
665 // Uncommit | |
666 if (upper_needs > 0) { | |
667 assert(middle_high_boundary() <= aligned_upper_new_high && | |
668 aligned_upper_new_high + upper_needs <= upper_high_boundary(), | |
669 "must not shrink beyond region"); | |
670 if (!os::uncommit_memory(aligned_upper_new_high, upper_needs)) { | |
671 debug_only(warning("os::uncommit_memory failed")); | |
672 return; | |
673 } else { | |
674 _upper_high -= upper_needs; | |
675 } | |
676 } | |
677 if (middle_needs > 0) { | |
678 assert(lower_high_boundary() <= aligned_middle_new_high && | |
679 aligned_middle_new_high + middle_needs <= middle_high_boundary(), | |
680 "must not shrink beyond region"); | |
681 if (!os::uncommit_memory(aligned_middle_new_high, middle_needs)) { | |
682 debug_only(warning("os::uncommit_memory failed")); | |
683 return; | |
684 } else { | |
685 _middle_high -= middle_needs; | |
686 } | |
687 } | |
688 if (lower_needs > 0) { | |
689 assert(low_boundary() <= aligned_lower_new_high && | |
690 aligned_lower_new_high + lower_needs <= lower_high_boundary(), | |
691 "must not shrink beyond region"); | |
692 if (!os::uncommit_memory(aligned_lower_new_high, lower_needs)) { | |
693 debug_only(warning("os::uncommit_memory failed")); | |
694 return; | |
695 } else { | |
696 _lower_high -= lower_needs; | |
697 } | |
698 } | |
699 | |
700 _high -= size; | |
701 } | |
702 | |
703 #ifndef PRODUCT | |
704 void VirtualSpace::check_for_contiguity() { | |
705 // Check contiguity. | |
706 assert(low_boundary() <= lower_high() && | |
707 lower_high() <= lower_high_boundary(), | |
708 "high address must be contained within the region"); | |
709 assert(lower_high_boundary() <= middle_high() && | |
710 middle_high() <= middle_high_boundary(), | |
711 "high address must be contained within the region"); | |
712 assert(middle_high_boundary() <= upper_high() && | |
713 upper_high() <= upper_high_boundary(), | |
714 "high address must be contained within the region"); | |
715 assert(low() >= low_boundary(), "low"); | |
716 assert(low_boundary() <= lower_high_boundary(), "lower high boundary"); | |
717 assert(upper_high_boundary() <= high_boundary(), "upper high boundary"); | |
718 assert(high() <= upper_high(), "upper high"); | |
719 } | |
720 | |
721 void VirtualSpace::print() { | |
722 tty->print ("Virtual space:"); | |
723 if (special()) tty->print(" (pinned in memory)"); | |
724 tty->cr(); | |
7623
203f64878aab
7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents:
7433
diff
changeset
|
725 tty->print_cr(" - committed: " SIZE_FORMAT, committed_size()); |
203f64878aab
7102489: RFE: cleanup jlong typedef on __APPLE__and _LLP64 systems.
hseigel
parents:
7433
diff
changeset
|
726 tty->print_cr(" - reserved: " SIZE_FORMAT, reserved_size()); |
0 | 727 tty->print_cr(" - [low, high]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low(), high()); |
728 tty->print_cr(" - [low_b, high_b]: [" INTPTR_FORMAT ", " INTPTR_FORMAT "]", low_boundary(), high_boundary()); | |
729 } | |
730 | |
12110
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
731 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
732 /////////////// Unit tests /////////////// |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
733 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
734 #ifndef PRODUCT |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
735 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
736 #define test_log(...) \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
737 do {\ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
738 if (VerboseInternalVMTests) { \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
739 tty->print_cr(__VA_ARGS__); \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
740 tty->flush(); \ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
741 }\ |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
742 } while (false) |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
743 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
744 class TestReservedSpace : AllStatic { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
745 public: |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
746 static void small_page_write(void* addr, size_t size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
747 size_t page_size = os::vm_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
748 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
749 char* end = (char*)addr + size; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
750 for (char* p = (char*)addr; p < end; p += page_size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
751 *p = 1; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
752 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
753 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
754 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
755 static void release_memory_for_test(ReservedSpace rs) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
756 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
757 guarantee(os::release_memory_special(rs.base(), rs.size()), "Shouldn't fail"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
758 } else { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
759 guarantee(os::release_memory(rs.base(), rs.size()), "Shouldn't fail"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
760 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
761 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
762 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
763 static void test_reserved_space1(size_t size, size_t alignment) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
764 test_log("test_reserved_space1(%p)", (void*) (uintptr_t) size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
765 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
766 assert(is_size_aligned(size, alignment), "Incorrect input parameters"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
767 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
768 ReservedSpace rs(size, // size |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
769 alignment, // alignment |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
770 UseLargePages, // large |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
771 NULL, // requested_address |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
772 0); // noacces_prefix |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
773 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
774 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
775 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
776 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
777 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
778 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
779 assert(is_ptr_aligned(rs.base(), alignment), "aligned sizes should always give aligned addresses"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
780 assert(is_size_aligned(rs.size(), alignment), "aligned sizes should always give aligned addresses"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
781 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
782 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
783 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
784 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
785 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
786 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
787 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
788 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
789 static void test_reserved_space2(size_t size) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
790 test_log("test_reserved_space2(%p)", (void*)(uintptr_t)size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
791 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
792 assert(is_size_aligned(size, os::vm_allocation_granularity()), "Must be at least AG aligned"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
793 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
794 ReservedSpace rs(size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
795 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
796 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
797 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
798 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
799 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
800 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
801 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
802 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
803 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
804 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
805 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
806 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
807 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
808 static void test_reserved_space3(size_t size, size_t alignment, bool maybe_large) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
809 test_log("test_reserved_space3(%p, %p, %d)", |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
810 (void*)(uintptr_t)size, (void*)(uintptr_t)alignment, maybe_large); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
811 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
812 assert(is_size_aligned(size, os::vm_allocation_granularity()), "Must be at least AG aligned"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
813 assert(is_size_aligned(size, alignment), "Must be at least aligned against alignment"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
814 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
815 bool large = maybe_large && UseLargePages && size >= os::large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
816 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
817 ReservedSpace rs(size, alignment, large, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
818 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
819 test_log(" rs.special() == %d", rs.special()); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
820 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
821 assert(rs.base() != NULL, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
822 assert(rs.size() == size, "Must be"); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
823 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
824 if (rs.special()) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
825 small_page_write(rs.base(), size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
826 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
827 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
828 release_memory_for_test(rs); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
829 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
830 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
831 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
832 static void test_reserved_space1() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
833 size_t size = 2 * 1024 * 1024; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
834 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
835 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
836 test_reserved_space1(size, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
837 test_reserved_space1(size * 2, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
838 test_reserved_space1(size * 10, ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
839 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
840 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
841 static void test_reserved_space2() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
842 size_t size = 2 * 1024 * 1024; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
843 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
844 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
845 test_reserved_space2(size * 1); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
846 test_reserved_space2(size * 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
847 test_reserved_space2(size * 10); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
848 test_reserved_space2(ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
849 test_reserved_space2(size - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
850 test_reserved_space2(size); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
851 test_reserved_space2(size + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
852 test_reserved_space2(size * 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
853 test_reserved_space2(size * 2 - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
854 test_reserved_space2(size * 2 + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
855 test_reserved_space2(size * 3); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
856 test_reserved_space2(size * 3 - ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
857 test_reserved_space2(size * 3 + ag); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
858 test_reserved_space2(size * 10); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
859 test_reserved_space2(size * 10 + size / 2); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
860 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
861 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
862 static void test_reserved_space3() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
863 size_t ag = os::vm_allocation_granularity(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
864 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
865 test_reserved_space3(ag, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
866 test_reserved_space3(ag * 2, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
867 test_reserved_space3(ag * 3, ag , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
868 test_reserved_space3(ag * 2, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
869 test_reserved_space3(ag * 4, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
870 test_reserved_space3(ag * 8, ag * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
871 test_reserved_space3(ag * 4, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
872 test_reserved_space3(ag * 8, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
873 test_reserved_space3(ag * 16, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
874 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
875 if (UseLargePages) { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
876 size_t lp = os::large_page_size(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
877 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
878 // Without large pages |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
879 test_reserved_space3(lp, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
880 test_reserved_space3(lp * 2, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
881 test_reserved_space3(lp * 4, ag * 4, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
882 test_reserved_space3(lp, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
883 test_reserved_space3(lp * 2, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
884 test_reserved_space3(lp * 3, lp , false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
885 test_reserved_space3(lp * 2, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
886 test_reserved_space3(lp * 4, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
887 test_reserved_space3(lp * 8, lp * 2, false); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
888 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
889 // With large pages |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
890 test_reserved_space3(lp, ag * 4 , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
891 test_reserved_space3(lp * 2, ag * 4, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
892 test_reserved_space3(lp * 4, ag * 4, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
893 test_reserved_space3(lp, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
894 test_reserved_space3(lp * 2, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
895 test_reserved_space3(lp * 3, lp , true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
896 test_reserved_space3(lp * 2, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
897 test_reserved_space3(lp * 4, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
898 test_reserved_space3(lp * 8, lp * 2, true); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
899 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
900 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
901 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
902 static void test_reserved_space() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
903 test_reserved_space1(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
904 test_reserved_space2(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
905 test_reserved_space3(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
906 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
907 }; |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
908 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
909 void TestReservedSpace_test() { |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
910 TestReservedSpace::test_reserved_space(); |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
911 } |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
912 |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
913 #endif // PRODUCT |
4c84d351cca9
8007074: SIGSEGV at ParMarkBitMap::verify_clear()
stefank
parents:
10969
diff
changeset
|
914 |
0 | 915 #endif |