Skip to content

Commit 55427c1

Browse files
committed
Slab counting.
1 parent d3b98f9 commit 55427c1

File tree

4 files changed

+29
-16
lines changed

4 files changed

+29
-16
lines changed

src/snmalloc/mem/allocstats.h

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ namespace snmalloc
2828
{
2929
MonotoneStat objects_allocated{};
3030
MonotoneStat objects_deallocated{};
31-
// MonotoneStat slabs_allocated;
32-
// MonotoneStat slabs_deallocated;
31+
MonotoneStat slabs_allocated{};
32+
MonotoneStat slabs_deallocated{};
3333
};
3434

3535
class AllocStats
@@ -48,17 +48,15 @@ namespace snmalloc
4848
return sizeclass[sizeclass_t::from_small_class(index).raw()];
4949
}
5050

51-
AllocStat operator+=(const AllocStats& other)
51+
void operator+=(const AllocStats& other)
5252
{
53-
AllocStat result;
5453
for (size_t i = 0; i < SIZECLASS_REP_SIZE; i++)
5554
{
5655
sizeclass[i].objects_allocated += other.sizeclass[i].objects_allocated;
5756
sizeclass[i].objects_deallocated += other.sizeclass[i].objects_deallocated;
58-
// result.slabs_allocated += other.sizeclass[i].slabs_allocated;
59-
// result.slabs_deallocated += other.sizeclass[i].slabs_deallocated;
57+
sizeclass[i].slabs_allocated += other.sizeclass[i].slabs_allocated;
58+
sizeclass[i].slabs_deallocated += other.sizeclass[i].slabs_deallocated;
6059
}
61-
return result;
6260
}
6361
};
6462
} // namespace snmalloc

src/snmalloc/mem/corealloc.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -369,6 +369,8 @@ namespace snmalloc
369369
// don't touch the cache lines at this point in snmalloc_check_client.
370370
auto start = clear_slab(meta, sizeclass);
371371

372+
stats[sizeclass].slabs_deallocated++;
373+
372374
Config::Backend::dealloc_chunk(
373375
get_backend_local_state(),
374376
*meta,
@@ -405,6 +407,8 @@ namespace snmalloc
405407
// Remove from set of fully used slabs.
406408
meta->node.remove();
407409

410+
stats[entry.get_sizeclass()].slabs_deallocated++;
411+
408412
Config::Backend::dealloc_chunk(
409413
get_backend_local_state(), *meta, p, size);
410414

@@ -830,6 +834,7 @@ namespace snmalloc
830834
auto r = finish_alloc<zero_mem, Config>(p, sizeclass);
831835

832836
stats[sizeclass].objects_allocated++;
837+
stats[sizeclass].slabs_allocated++;
833838
return ticker.check_tick(r);
834839
}
835840

src/snmalloc/mem/globalalloc.h

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -158,26 +158,33 @@ namespace snmalloc
158158
auto l_dump = dump++;
159159
if (l_dump == 0)
160160
{
161-
message<1024>("snmalloc_allocs,dumpid,sizeclass,size,allocated,deallocated,in_use,bytes");
162-
message<1024>("snmalloc_totals,dumpid,backend bytes,peak backend bytes,requested");
161+
message<1024>("snmalloc_allocs,dumpid,sizeclass,size,allocated,deallocated,in_use,bytes,slabs allocated,slabs deallocated,slabs in_use,slabs bytes");
162+
message<1024>("snmalloc_totals,dumpid,backend bytes,peak backend bytes,requested,slabs requested bytes");
163163
}
164164

165165
auto stats = snmalloc::get_stats<Config>();
166-
size_t total_live{0};
166+
size_t total_live{0};
167+
size_t total_live_slabs{0};
167168
for (size_t i = 0; i < snmalloc::SIZECLASS_REP_SIZE; i++)
168169
{
169170
auto sc = snmalloc::sizeclass_t::from_raw(i);
170171
auto allocated = *stats[sc].objects_allocated;
171172
auto deallocated = *stats[sc].objects_deallocated;
173+
auto slabs_allocated = *stats[sc].slabs_allocated;
174+
auto slabs_deallocated = *stats[sc].slabs_deallocated;
172175
if (allocated == 0 && deallocated == 0)
173176
continue;
174-
auto size =
175-
snmalloc::sizeclass_full_to_size(snmalloc::sizeclass_t::from_raw(i));
177+
auto size = snmalloc::sizeclass_full_to_size(sc);
178+
auto slab_size = snmalloc::sizeclass_full_to_slab_size(sc);
176179
auto in_use = allocated - deallocated;
177180
auto amount = in_use * size;
178181
total_live += amount;
179-
snmalloc::message<1024>("snmalloc_allocs,{},{},{},{},{},{},{}", l_dump, i, size, allocated, deallocated, in_use,amount);
182+
auto in_use_slabs = slabs_allocated - slabs_deallocated;
183+
auto amount_slabs = in_use_slabs * slab_size;
184+
total_live_slabs += amount_slabs;
185+
186+
snmalloc::message<1024>("snmalloc_allocs,{},{},{},{},{},{},{},{},{},{},{}", l_dump, i, size, allocated, deallocated, in_use, amount, slabs_allocated, slabs_deallocated, in_use_slabs, amount_slabs);
180187
}
181-
snmalloc::message<1024>("snmalloc_totals,{},{},{},{}", l_dump, Config::Backend::get_current_usage(), Config::Backend::get_peak_usage(), total_live);
188+
snmalloc::message<1024>("snmalloc_totals,{},{},{},{},{}", l_dump, Config::Backend::get_current_usage(), Config::Backend::get_peak_usage(), total_live, total_live_slabs);
182189
}
183190
} // namespace snmalloc

src/snmalloc/mem/localalloc.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,11 @@ namespace snmalloc
212212
}
213213

214214
if (chunk.unsafe_ptr() != nullptr)
215-
core_alloc->stats[size_to_sizeclass_full(size)].objects_allocated++;
216-
215+
{
216+
auto sc = size_to_sizeclass_full(size);
217+
core_alloc->stats[sc].objects_allocated++;
218+
core_alloc->stats[sc].slabs_allocated++;
219+
}
217220
return capptr_chunk_is_alloc(capptr_to_user_address_control(chunk));
218221
});
219222
}

0 commit comments

Comments
 (0)