12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 #include "precompiled.hpp"
25 #include "memory/virtualspace.hpp"
26 #include "runtime/os.hpp"
27 #include "oops/oop.hpp"
28 #include "utilities/align.hpp"
29 #include "unittest.hpp"
30
31 namespace {
32 static void small_page_write(void* addr, size_t size) {
33 size_t page_size = os::vm_page_size();
34
35 char* end = (char*) addr + size;
36 for (char* p = (char*) addr; p < end; p += page_size) {
37 *p = 1;
38 }
39 }
40
41 static void release_memory_for_test(ReservedSpace rs) {
42 if (rs.special()) {
43 ASSERT_TRUE(os::release_memory_special(rs.base(), rs.size()));
44 } else {
45 ASSERT_TRUE(os::release_memory(rs.base(), rs.size()));
46 }
47 }
48
49 // have to use these functions, as gtest's _PRED macros don't like is_aligned
50 // nor (is_aligned<size_t, size_t>)
51 static bool is_size_alignment(size_t size, size_t alignment) {
52 return is_aligned(size, alignment);
53 }
54 static bool is_ptr_alignment(void* ptr, size_t alignment) {
55 return is_aligned(ptr, alignment);
56 }
57
58 static void test_reserved_size(size_t size) {
59 ASSERT_PRED2(is_size_alignment, size, os::vm_allocation_granularity());
60
61 ReservedSpace rs(size);
62
63 EXPECT_TRUE(rs.base() != NULL) << "rs.special: " << rs.special();
64 EXPECT_EQ(size, rs.size()) << "rs.special: " << rs.special();
65
66 if (rs.special()) {
67 small_page_write(rs.base(), size);
68 }
69
70 release_memory_for_test(rs);
71 }
72
73 static void test_reserved_size_alignment(size_t size, size_t alignment) {
74 ASSERT_PRED2(is_size_alignment, size, alignment) << "Incorrect input parameters";
75
76 ReservedSpace rs(size, alignment, UseLargePages, (char *) NULL);
77
78 ASSERT_TRUE(rs.base() != NULL) << "rs.special = " << rs.special();
79 ASSERT_EQ(size, rs.size()) << "rs.special = " << rs.special();
80
81 EXPECT_PRED2(is_ptr_alignment, rs.base(), alignment)
82 << "aligned sizes should always give aligned addresses";
83 EXPECT_PRED2(is_ptr_alignment, (void*) rs.size(), alignment)
84 << "aligned sizes should always give aligned addresses";
85
86 if (rs.special()) {
87 small_page_write(rs.base(), size);
88 }
89
90 release_memory_for_test(rs);
91 }
92
93 static void test_reserved_size_alignment_page_type(size_t size, size_t alignment, bool maybe_large) {
94 if (size < alignment) {
95 // Tests might set -XX:LargePageSizeInBytes=<small pages> and cause unexpected input arguments for this test.
96 ASSERT_EQ((size_t) os::vm_page_size(), os::large_page_size()) << "Test needs further refinement";
97 return;
98 }
99
100 ASSERT_PRED2(is_size_alignment, size, os::vm_allocation_granularity()) << "Must be at least AG aligned";
101 ASSERT_PRED2(is_size_alignment, size, alignment) << "Must be at least AG aligned";
102
103 bool large = maybe_large && UseLargePages && size >= os::large_page_size();
104
105 ReservedSpace rs(size, alignment, large, false);
106
107 EXPECT_TRUE(rs.base() != NULL) << "rs.special: " << rs.special();
108 EXPECT_EQ(size, rs.size()) << "rs.special: " << rs.special();
109
110 if (rs.special()) {
111 small_page_write(rs.base(), size);
112 }
113
114 release_memory_for_test(rs);
115 }
116 }
117
118 TEST_VM(ReservedSpace, size_alignment) {
119 size_t size = 2 * 1024 * 1024;
120 size_t ag = os::vm_allocation_granularity();
121
122 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment(size, ag));
123 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment(size * 2, ag));
124 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment(size * 10, ag));
125 }
126
127 TEST_VM(ReservedSpace, size) {
128 size_t size = 2 * 1024 * 1024;
129 size_t ag = os::vm_allocation_granularity();
130
131 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 1));
132 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 2));
133 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 10));
134 EXPECT_NO_FATAL_FAILURE(test_reserved_size(ag));
140 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 2 + ag));
141 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 3));
142 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 3 - ag));
143 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 3 + ag));
144 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 10));
145 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 10 + size / 2));
146 }
147
148 TEST_VM(ReservedSpace, size_alignment_page_type) {
149 size_t ag = os::vm_allocation_granularity();
150
151 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag, ag , false));
152 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 2, ag , false));
153 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 3, ag , false));
154 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 2, ag * 2, false));
155 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 4, ag * 2, false));
156 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 8, ag * 2, false));
157 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 4, ag * 4, false));
158 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 8, ag * 4, false));
159 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 16, ag * 4, false));
160
161 if (UseLargePages) {
162 size_t lp = os::large_page_size();
163
164 // Without large pages
165 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4, false));
166 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, false));
167 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, false));
168 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , false));
169 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , false));
170 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , false));
171 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, false));
172 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, false));
173 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, false));
174
175 // With large pages
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) {
|
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23
24 #include "precompiled.hpp"
25 #include "memory/virtualspace.hpp"
26 #include "runtime/os.hpp"
27 #include "oops/oop.hpp"
28 #include "utilities/align.hpp"
29 #include "unittest.hpp"
30
31 namespace {
32 class MemoryReleaser {
33 ReservedSpace* const _rs;
34 public:
35 MemoryReleaser(ReservedSpace* rs) : _rs(rs) { }
36 ~MemoryReleaser() {
37 if (_rs->special()) {
38 EXPECT_TRUE(os::release_memory_special(_rs->base(), _rs->size()));
39 } else {
40 EXPECT_TRUE(os::release_memory(_rs->base(), _rs->size()));
41 }
42 }
43 };
44
45 static void small_page_write(void* addr, size_t size) {
46 size_t page_size = os::vm_page_size();
47
48 char* end = (char*) addr + size;
49 for (char* p = (char*) addr; p < end; p += page_size) {
50 *p = 1;
51 }
52 }
53
54 // have to use these functions, as gtest's _PRED macros don't like is_aligned
55 // nor (is_aligned<size_t, size_t>)
56 static bool is_size_alignment(size_t size, size_t alignment) {
57 return is_aligned(size, alignment);
58 }
59 static bool is_ptr_alignment(void* ptr, size_t alignment) {
60 return is_aligned(ptr, alignment);
61 }
62
63 static void test_reserved_size(size_t size) {
64 ASSERT_PRED2(is_size_alignment, size, os::vm_allocation_granularity());
65
66 ReservedSpace rs(size);
67 MemoryReleaser releaser(&rs);
68
69 EXPECT_TRUE(rs.base() != NULL) << "rs.special: " << rs.special();
70 EXPECT_EQ(size, rs.size()) << "rs.special: " << rs.special();
71
72 if (rs.special()) {
73 small_page_write(rs.base(), size);
74 }
75 }
76
77 static void test_reserved_size_alignment(size_t size, size_t alignment) {
78 ASSERT_PRED2(is_size_alignment, size, alignment) << "Incorrect input parameters";
79
80 ReservedSpace rs(size, alignment, UseLargePages, (char *) NULL);
81 MemoryReleaser releaser(&rs);
82
83 ASSERT_TRUE(rs.base() != NULL) << "rs.special = " << rs.special();
84 ASSERT_EQ(size, rs.size()) << "rs.special = " << rs.special();
85
86 EXPECT_PRED2(is_ptr_alignment, rs.base(), alignment)
87 << "aligned sizes should always give aligned addresses";
88 EXPECT_PRED2(is_ptr_alignment, (void*) rs.size(), alignment)
89 << "aligned sizes should always give aligned addresses";
90
91 if (rs.special()) {
92 small_page_write(rs.base(), size);
93 }
94 }
95
96 static void test_reserved_size_alignment_page_type(size_t size, size_t alignment, bool maybe_large) {
97 if (size < alignment) {
98 // Tests might set -XX:LargePageSizeInBytes=<small pages> and cause unexpected input arguments for this test.
99 ASSERT_EQ((size_t) os::vm_page_size(), os::large_page_size()) << "Test needs further refinement";
100 return;
101 }
102
103 ASSERT_PRED2(is_size_alignment, size, os::vm_allocation_granularity()) << "Must be at least AG aligned";
104 ASSERT_PRED2(is_size_alignment, size, alignment) << "Must be at least AG aligned";
105
106 bool large = maybe_large && UseLargePages && size >= os::large_page_size();
107
108 ReservedSpace rs(size, alignment, large, false);
109 MemoryReleaser releaser(&rs);
110
111 EXPECT_TRUE(rs.base() != NULL) << "rs.special: " << rs.special();
112 EXPECT_EQ(size, rs.size()) << "rs.special: " << rs.special();
113
114 if (rs.special()) {
115 small_page_write(rs.base(), size);
116 }
117 }
118 }
119
120 TEST_VM(ReservedSpace, size_alignment) {
121 size_t size = 2 * 1024 * 1024;
122 size_t ag = os::vm_allocation_granularity();
123
124 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment(size, ag));
125 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment(size * 2, ag));
126 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment(size * 10, ag));
127 }
128
129 TEST_VM(ReservedSpace, size) {
130 size_t size = 2 * 1024 * 1024;
131 size_t ag = os::vm_allocation_granularity();
132
133 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 1));
134 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 2));
135 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 10));
136 EXPECT_NO_FATAL_FAILURE(test_reserved_size(ag));
142 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 2 + ag));
143 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 3));
144 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 3 - ag));
145 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 3 + ag));
146 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 10));
147 EXPECT_NO_FATAL_FAILURE(test_reserved_size(size * 10 + size / 2));
148 }
149
150 TEST_VM(ReservedSpace, size_alignment_page_type) {
151 size_t ag = os::vm_allocation_granularity();
152
153 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag, ag , false));
154 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 2, ag , false));
155 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 3, ag , false));
156 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 2, ag * 2, false));
157 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 4, ag * 2, false));
158 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 8, ag * 2, false));
159 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 4, ag * 4, false));
160 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 8, ag * 4, false));
161 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(ag * 16, ag * 4, false));
162 }
163
164 TEST_VM(ReservedSpace, size_alignment_page_type_large_page) {
165 if (!UseLargePages) {
166 return;
167 }
168
169 size_t ag = os::vm_allocation_granularity();
170 size_t lp = os::large_page_size();
171
172 // Without large pages
173 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4, false));
174 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, false));
175 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, false));
176 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , false));
177 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , false));
178 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , false));
179 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, false));
180 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, false));
181 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, false));
182
183 // With large pages
184 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, ag * 4 , true));
185 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, ag * 4, true));
186 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, ag * 4, true));
187 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp, lp , true));
188 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp , true));
189 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 3, lp , true));
190 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 2, lp * 2, true));
191 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 4, lp * 2, true));
192 EXPECT_NO_FATAL_FAILURE(test_reserved_size_alignment_page_type(lp * 8, lp * 2, true));
193 }
194
195 namespace {
196 enum TestLargePages {
197 Default,
198 Disable,
199 Reserve,
200 Commit
201 };
202
203 class ReservedSpaceReleaser {
204 ReservedSpace* const _rs;
205 public:
206 ReservedSpaceReleaser(ReservedSpace* rs) : _rs(rs) { }
207 ~ReservedSpaceReleaser() {
208 _rs->release();
209 }
210 };
211
212 ReservedSpace reserve_memory(size_t reserve_size_aligned, TestLargePages mode) {
|