@@ -97,21 +97,21 @@ void ZPhysicalMemoryManager::try_enable_uncommit(size_t min_capacity, size_t max
9797void ZPhysicalMemoryManager::alloc (zoffset* pmem, size_t size, int numa_id) {
9898 assert (is_aligned (size, ZGranuleSize), " Invalid size" );
9999
100+ size_t to_alloc = size;
100101 size_t current_granule = 0 ;
101102
102- while (size > 0 ) {
103- const ZMemoryRange range = _managers.get (numa_id).alloc_low_address_at_most (size );
103+ while (to_alloc > 0 ) {
104+ const ZMemoryRange range = _managers.get (numa_id).alloc_low_address_at_most (to_alloc );
104105 assert (!range.is_null (), " Allocation should never fail" );
105- size -= range.size ();
106+ to_alloc -= range.size ();
106107
107- size_t num_granules = range.size_in_granules ();
108+ const size_t num_granules = range.size_in_granules ();
108109 for (size_t i = 0 ; i < num_granules; i++) {
109110 pmem[current_granule + i] = range.start () + (ZGranuleSize * i);
110111 }
111112
112113 current_granule += num_granules;
113114 }
114-
115115}
116116
117117template <typename ReturnType>
@@ -132,32 +132,38 @@ struct IterateInvoker<void> {
132132};
133133
134134template <typename Function>
135- bool for_each_segment_apply (const zoffset* pmem, size_t num_granules , Function function) {
135+ bool for_each_segment_apply (const zoffset* pmem, size_t size , Function function) {
136136 IterateInvoker<decltype (function (zoffset{}, size_t {}))> invoker;
137+ const size_t num_granules = size >> ZGranuleSizeShift;
138+
137139 for (size_t i = 0 ; i < num_granules; i++) {
138140 const size_t start_i = i;
139141 const zoffset start = pmem[i];
142+
140143 while (i + 1 < num_granules && pmem[i] + ZGranuleSize == pmem[i + 1 ]) {
141144 i++;
142145 }
143- if (!invoker (function, start, (i - start_i + 1 ) * ZGranuleSize)) {
146+
147+ const size_t segment_size = (i - start_i + 1 ) * ZGranuleSize;
148+ if (!invoker (function, start, segment_size)) {
144149 return false ;
145150 }
146151 }
152+
147153 return true ;
148154}
149155
150156void ZPhysicalMemoryManager::free (const zoffset* pmem, size_t size, int numa_id) {
151157 // Free segments
152- for_each_segment_apply (pmem, size >> ZGranuleSizeShift , [&](zoffset segment_start, size_t segment_size) {
158+ for_each_segment_apply (pmem, size, [&](zoffset segment_start, size_t segment_size) {
153159 _managers.get (numa_id).free (segment_start, segment_size);
154160 });
155161}
156162
157163size_t ZPhysicalMemoryManager::commit (const zoffset* pmem, size_t size, int numa_id) {
158164 size_t total_committed = 0 ;
159165 // Commit segments
160- for_each_segment_apply (pmem, size >> ZGranuleSizeShift , [&](zoffset segment_start, size_t segment_size) {
166+ for_each_segment_apply (pmem, size, [&](zoffset segment_start, size_t segment_size) {
161167 // Commit segment
162168#ifdef LINUX
163169 const size_t committed = _backing.commit (segment_start, segment_size, numa_id);
@@ -181,7 +187,7 @@ size_t ZPhysicalMemoryManager::commit(const zoffset* pmem, size_t size, int numa
181187size_t ZPhysicalMemoryManager::uncommit (const zoffset* pmem, size_t size) {
182188 size_t total_uncommitted = 0 ;
183189 // Uncommit segments
184- for_each_segment_apply (pmem, size >> ZGranuleSizeShift , [&](zoffset segment_start, size_t segment_size) {
190+ for_each_segment_apply (pmem, size, [&](zoffset segment_start, size_t segment_size) {
185191 // Uncommit segment
186192 const size_t uncommitted = _backing.uncommit (segment_start, segment_size);
187193 total_uncommitted += uncommitted;
@@ -202,7 +208,7 @@ void ZPhysicalMemoryManager::map(zoffset offset, const zoffset* pmem, size_t siz
202208 const zaddress_unsafe addr = ZOffset::address_unsafe (offset);
203209
204210 size_t mapped = 0 ;
205- for_each_segment_apply (pmem, size >> ZGranuleSizeShift , [&](zoffset segment_start, size_t segment_size) {
211+ for_each_segment_apply (pmem, size, [&](zoffset segment_start, size_t segment_size) {
206212 _backing.map (addr + mapped, segment_size, segment_start);
207213 mapped += segment_size;
208214 });
@@ -222,8 +228,9 @@ void ZPhysicalMemoryManager::unmap(zoffset offset, const zoffset* /* ignored unt
222228
223229size_t ZPhysicalMemoryManager::count_segments (const zoffset* pmem, size_t size) {
224230 size_t count = 0 ;
225- for_each_segment_apply (pmem, size >> ZGranuleSizeShift , [&](zoffset, size_t ) {
231+ for_each_segment_apply (pmem, size, [&](zoffset, size_t ) {
226232 count++;
227233 });
234+
228235 return count;
229236}
0 commit comments