176 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4 , true));
177 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, true));
178 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, true));
179 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , true));
180 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , true));
181 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , true));
182 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, true));
183 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, true));
184 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, true));
185 }
186 }
187
188 namespace {
189 enum TestLargePages {
190 Default,
191 Disable,
192 Reserve,
193 Commit
194 };
195
196 ReservedSpace reserve_memory(size_t reserve_size_aligned, TestLargePages mode) {
197 switch(mode) {
198 default:
199 case Default:
200 case Reserve:
201 return ReservedSpace(reserve_size_aligned);
202 case Disable:
203 case Commit:
204 return ReservedSpace(reserve_size_aligned,
205 os::vm_allocation_granularity(),
206 /* large */ false, /* exec */ false);
207 }
208 }
209
210 bool initialize_virtual_space(VirtualSpace& vs, ReservedSpace rs, TestLargePages mode) {
211 switch(mode) {
212 default:
213 case Default:
214 case Reserve:
215 return vs.initialize(rs, 0);
216 case Disable:
217 return vs.initialize_with_granularity(rs, 0, os::vm_page_size());
218 case Commit:
219 return vs.initialize_with_granularity(rs, 0, os::page_size_for_region_unaligned(rs.size(), 1));
220 }
221 }
222
223 void test_virtual_space_actual_committed_space(size_t reserve_size, size_t commit_size,
224 TestLargePages mode = Default) {
225 size_t granularity = os::vm_allocation_granularity();
226 size_t reserve_size_aligned = align_up(reserve_size, granularity);
227
228 ReservedSpace reserved = reserve_memory(reserve_size_aligned, mode);
229
230 ASSERT_TRUE(reserved.is_reserved());
231
232 VirtualSpace vs;
233 ASSERT_TRUE(initialize_virtual_space(vs, reserved, mode)) << "Failed to initialize VirtualSpace";
234 vs.expand_by(commit_size, false);
235
236 if (vs.special()) {
237 EXPECT_EQ(reserve_size_aligned, vs.actual_committed_size());
238 } else {
239 EXPECT_GE(vs.actual_committed_size(), commit_size);
240 // Approximate the commit granularity.
241 // Make sure that we don't commit using large pages
242 // if large pages has been disabled for this VirtualSpace.
243 size_t commit_granularity = (mode == Disable || !UseLargePages) ?
244 os::vm_page_size() : os::large_page_size();
245 EXPECT_LT(vs.actual_committed_size(), commit_size + commit_granularity);
246 }
247
248 reserved.release();
249 }
250 };
251
252 TEST_VM(VirtualSpace, actual_committed_space) {
253 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(4 * K, 0));
254 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(4 * K, 4 * K));
255 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(8 * K, 0));
256 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(8 * K, 4 * K));
257 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(8 * K, 8 * K));
258 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 0));
259 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 4 * K));
260 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 8 * K));
261 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 12 * K));
262 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(64 * K, 0));
263 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(64 * K, 32 * K));
264 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(64 * K, 64 * K));
265 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 0));
266 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 4 * K));
267 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 64 * K));
268 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 1 * M));
269 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 2 * M));
270 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 0));
271 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 4 * K));
272 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 8 * K));
273 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 1 * M));
274 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 2 * M));
275 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 5 * M));
276 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 10 * M));
277 }
278
279 TEST_VM(VirtualSpace, actual_committed_space_one_large_page) {
280 if (!UseLargePages) {
281 return;
282 }
283
284 size_t large_page_size = os::large_page_size();
285
286 ReservedSpace reserved(large_page_size, large_page_size, true, false);
287 ASSERT_TRUE(reserved.is_reserved());
288
289 VirtualSpace vs;
290 ASSERT_TRUE(vs.initialize(reserved, 0)) << "Failed to initialize VirtualSpace";
291 vs.expand_by(large_page_size, false);
292
293 EXPECT_EQ(large_page_size, vs.actual_committed_size());
294
295 reserved.release();
296 }
297
298 TEST_VM(VirtualSpace, disable_large_pages) {
299 if (!UseLargePages) {
300 return;
301 }
302 // These test cases verify that if we force VirtualSpace to disable large pages
303 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 0, Disable));
304 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 4 * K, Disable));
305 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 8 * K, Disable));
306 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 1 * M, Disable));
307 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 2 * M, Disable));
308 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 5 * M, Disable));
309 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 10 * M, Disable));
310
311 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 0, Reserve));
312 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 4 * K, Reserve));
313 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 8 * K, Reserve));
314 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 1 * M, Reserve));
315 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 2 * M, Reserve));
|
176 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4 , true));
177 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, true));
178 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, true));
179 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , true));
180 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , true));
181 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , true));
182 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, true));
183 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, true));
184 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, true));
185 }
186 }
187
188 namespace {
189 enum TestLargePages {
190 Default,
191 Disable,
192 Reserve,
193 Commit
194 };
195
196 class ReservedSpaceReleaser {
197 ReservedSpace* const _rs;
198 public:
199 ReservedSpaceReleaser(ReservedSpace* rs) : _rs(rs) { }
200 ~ReservedSpaceReleaser() {
201 _rs->release();
202 }
203 };
204
205 ReservedSpace reserve_memory(size_t reserve_size_aligned, TestLargePages mode) {
206 switch(mode) {
207 default:
208 case Default:
209 case Reserve:
210 return ReservedSpace(reserve_size_aligned);
211 case Disable:
212 case Commit:
213 return ReservedSpace(reserve_size_aligned,
214 os::vm_allocation_granularity(),
215 /* large */ false, /* exec */ false);
216 }
217 }
218
219 bool initialize_virtual_space(VirtualSpace& vs, ReservedSpace rs, TestLargePages mode) {
220 switch(mode) {
221 default:
222 case Default:
223 case Reserve:
224 return vs.initialize(rs, 0);
225 case Disable:
226 return vs.initialize_with_granularity(rs, 0, os::vm_page_size());
227 case Commit:
228 return vs.initialize_with_granularity(rs, 0, os::page_size_for_region_unaligned(rs.size(), 1));
229 }
230 }
231
232 void test_virtual_space_actual_committed_space(size_t reserve_size, size_t commit_size,
233 TestLargePages mode = Default) {
234 size_t granularity = os::vm_allocation_granularity();
235 size_t reserve_size_aligned = align_up(reserve_size, granularity);
236
237 ReservedSpace reserved = reserve_memory(reserve_size_aligned, mode);
238 ReservedSpaceReleaser releaser(&reserved);
239
240 ASSERT_TRUE(reserved.is_reserved());
241
242 VirtualSpace vs;
243 ASSERT_TRUE(initialize_virtual_space(vs, reserved, mode)) << "Failed to initialize VirtualSpace";
244 vs.expand_by(commit_size, false);
245
246 if (vs.special()) {
247 EXPECT_EQ(reserve_size_aligned, vs.actual_committed_size());
248 } else {
249 EXPECT_GE(vs.actual_committed_size(), commit_size);
250 // Approximate the commit granularity.
251 // Make sure that we don't commit using large pages
252 // if large pages has been disabled for this VirtualSpace.
253 size_t commit_granularity = (mode == Disable || !UseLargePages) ?
254 os::vm_page_size() : os::large_page_size();
255 EXPECT_LT(vs.actual_committed_size(), commit_size + commit_granularity);
256 }
257 }
258 };
259
260 TEST_VM(VirtualSpace, actual_committed_space) {
261 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(4 * K, 0));
262 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(4 * K, 4 * K));
263 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(8 * K, 0));
264 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(8 * K, 4 * K));
265 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(8 * K, 8 * K));
266 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 0));
267 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 4 * K));
268 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 8 * K));
269 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(12 * K, 12 * K));
270 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(64 * K, 0));
271 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(64 * K, 32 * K));
272 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(64 * K, 64 * K));
273 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 0));
274 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 4 * K));
275 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 64 * K));
276 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 1 * M));
277 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(2 * M, 2 * M));
278 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 0));
279 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 4 * K));
280 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 8 * K));
281 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 1 * M));
282 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 2 * M));
283 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 5 * M));
284 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 10 * M));
285 }
286
287 TEST_VM(VirtualSpace, actual_committed_space_one_large_page) {
288 if (!UseLargePages) {
289 return;
290 }
291
292 size_t large_page_size = os::large_page_size();
293
294 ReservedSpace reserved(large_page_size, large_page_size, true, false);
295 ReservedSpaceReleaser releaser(&reserved);
296 ASSERT_TRUE(reserved.is_reserved());
297
298 VirtualSpace vs;
299 ASSERT_TRUE(vs.initialize(reserved, 0)) << "Failed to initialize VirtualSpace";
300 vs.expand_by(large_page_size, false);
301
302 EXPECT_EQ(large_page_size, vs.actual_committed_size());
303 }
304
305 TEST_VM(VirtualSpace, disable_large_pages) {
306 if (!UseLargePages) {
307 return;
308 }
309 // These test cases verify that if we force VirtualSpace to disable large pages
310 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 0, Disable));
311 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 4 * K, Disable));
312 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 8 * K, Disable));
313 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 1 * M, Disable));
314 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 2 * M, Disable));
315 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 5 * M, Disable));
316 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 10 * M, Disable));
317
318 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 0, Reserve));
319 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 4 * K, Reserve));
320 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 8 * K, Reserve));
321 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 1 * M, Reserve));
322 EXPECT_NO_FATAL_FAILURE(test_virtual_space_actual_committed_space(10 * M, 2 * M, Reserve));
|