mirror of
https://github.com/RGBCube/serenity
synced 2025-07-23 13:17:36 +00:00
Kernel: Include slabheaps in kmalloc statistics
This commit is contained in:
parent
f39e9b19c6
commit
16d69376d8
1 changed files with 39 additions and 2 deletions
|
@ -51,9 +51,10 @@ public:
|
||||||
static constexpr FlatPtr block_mask = ~(block_size - 1);
|
static constexpr FlatPtr block_mask = ~(block_size - 1);
|
||||||
|
|
||||||
KmallocSlabBlock(size_t slab_size)
|
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 < m_slab_count; ++i) {
|
||||||
for (size_t i = 0; i < slab_count; ++i) {
|
|
||||||
auto* freelist_entry = (FreelistEntry*)(void*)(&m_data[i * slab_size]);
|
auto* freelist_entry = (FreelistEntry*)(void*)(&m_data[i * slab_size]);
|
||||||
freelist_entry->next = m_freelist;
|
freelist_entry->next = m_freelist;
|
||||||
m_freelist = freelist_entry;
|
m_freelist = freelist_entry;
|
||||||
|
@ -63,12 +64,14 @@ public:
|
||||||
void* allocate()
|
void* allocate()
|
||||||
{
|
{
|
||||||
VERIFY(m_freelist);
|
VERIFY(m_freelist);
|
||||||
|
++m_allocated_slabs;
|
||||||
return exchange(m_freelist, m_freelist->next);
|
return exchange(m_freelist, m_freelist->next);
|
||||||
}
|
}
|
||||||
|
|
||||||
void deallocate(void* ptr)
|
void deallocate(void* ptr)
|
||||||
{
|
{
|
||||||
VERIFY(ptr >= &m_data && ptr < ((u8*)this + block_size));
|
VERIFY(ptr >= &m_data && ptr < ((u8*)this + block_size));
|
||||||
|
--m_allocated_slabs;
|
||||||
auto* freelist_entry = (FreelistEntry*)ptr;
|
auto* freelist_entry = (FreelistEntry*)ptr;
|
||||||
freelist_entry->next = m_freelist;
|
freelist_entry->next = m_freelist;
|
||||||
m_freelist = freelist_entry;
|
m_freelist = freelist_entry;
|
||||||
|
@ -79,6 +82,16 @@ public:
|
||||||
return m_freelist == nullptr;
|
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;
|
IntrusiveListNode<KmallocSlabBlock> list_node;
|
||||||
using List = IntrusiveList<&KmallocSlabBlock::list_node>;
|
using List = IntrusiveList<&KmallocSlabBlock::list_node>;
|
||||||
|
|
||||||
|
@ -89,6 +102,10 @@ private:
|
||||||
|
|
||||||
FreelistEntry* m_freelist { nullptr };
|
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[];
|
[[gnu::aligned(16)]] u8 m_data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -134,6 +151,22 @@ public:
|
||||||
m_usable_blocks.append(*block);
|
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:
|
private:
|
||||||
size_t m_slab_size { 0 };
|
size_t m_slab_size { 0 };
|
||||||
|
|
||||||
|
@ -203,6 +236,8 @@ struct KmallocGlobalData {
|
||||||
size_t total = 0;
|
size_t total = 0;
|
||||||
for (auto const& subheap : subheaps)
|
for (auto const& subheap : subheaps)
|
||||||
total += subheap.allocator.allocated_bytes();
|
total += subheap.allocator.allocated_bytes();
|
||||||
|
for (auto const& slabheap : slabheaps)
|
||||||
|
total += slabheap.allocated_bytes();
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -211,6 +246,8 @@ struct KmallocGlobalData {
|
||||||
size_t total = 0;
|
size_t total = 0;
|
||||||
for (auto const& subheap : subheaps)
|
for (auto const& subheap : subheaps)
|
||||||
total += subheap.allocator.free_bytes();
|
total += subheap.allocator.free_bytes();
|
||||||
|
for (auto const& slabheap : slabheaps)
|
||||||
|
total += slabheap.free_bytes();
|
||||||
return total;
|
return total;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue