1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 07:58:11 +00:00

Kernel: Include slabheaps in kmalloc statistics

This commit is contained in:
Idan Horowitz 2022-01-23 18:28:32 +02:00
parent f39e9b19c6
commit 16d69376d8

View file

@ -51,9 +51,10 @@ public:
static constexpr FlatPtr block_mask = ~(block_size - 1);
KmallocSlabBlock(size_t slab_size)
: m_slab_size(slab_size)
, m_slab_count((block_size - sizeof(KmallocSlabBlock)) / slab_size)
{
size_t slab_count = (block_size - sizeof(KmallocSlabBlock)) / slab_size;
for (size_t i = 0; i < slab_count; ++i) {
for (size_t i = 0; i < m_slab_count; ++i) {
auto* freelist_entry = (FreelistEntry*)(void*)(&m_data[i * slab_size]);
freelist_entry->next = m_freelist;
m_freelist = freelist_entry;
@ -63,12 +64,14 @@ public:
void* allocate()
{
VERIFY(m_freelist);
++m_allocated_slabs;
return exchange(m_freelist, m_freelist->next);
}
void deallocate(void* ptr)
{
VERIFY(ptr >= &m_data && ptr < ((u8*)this + block_size));
--m_allocated_slabs;
auto* freelist_entry = (FreelistEntry*)ptr;
freelist_entry->next = m_freelist;
m_freelist = freelist_entry;
@ -79,6 +82,16 @@ public:
return m_freelist == nullptr;
}
size_t allocated_bytes() const
{
return m_allocated_slabs * m_slab_size;
}
size_t free_bytes() const
{
return (m_slab_count - m_allocated_slabs) * m_slab_size;
}
IntrusiveListNode<KmallocSlabBlock> list_node;
using List = IntrusiveList<&KmallocSlabBlock::list_node>;
@ -89,6 +102,10 @@ private:
FreelistEntry* m_freelist { nullptr };
size_t m_slab_size { 0 };
size_t m_slab_count { 0 };
size_t m_allocated_slabs { 0 };
[[gnu::aligned(16)]] u8 m_data[];
};
@ -134,6 +151,22 @@ public:
m_usable_blocks.append(*block);
}
size_t allocated_bytes() const
{
size_t total = m_full_blocks.size_slow() * KmallocSlabBlock::block_size;
for (auto const& slab_block : m_usable_blocks)
total += slab_block.allocated_bytes();
return total;
}
size_t free_bytes() const
{
size_t total = 0;
for (auto const& slab_block : m_usable_blocks)
total += slab_block.free_bytes();
return total;
}
private:
size_t m_slab_size { 0 };
@ -203,6 +236,8 @@ struct KmallocGlobalData {
size_t total = 0;
for (auto const& subheap : subheaps)
total += subheap.allocator.allocated_bytes();
for (auto const& slabheap : slabheaps)
total += slabheap.allocated_bytes();
return total;
}
@ -211,6 +246,8 @@ struct KmallocGlobalData {
size_t total = 0;
for (auto const& subheap : subheaps)
total += subheap.allocator.free_bytes();
for (auto const& slabheap : slabheaps)
total += slabheap.free_bytes();
return total;
}