summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIdan Horowitz <idan.horowitz@gmail.com>2022-01-23 18:28:32 +0200
committerIdan Horowitz <idan.horowitz@gmail.com>2022-01-24 14:09:55 +0200
commit16d69376d829410184342f95b2df363bea6bbcb2 (patch)
tree7d1d721af1ecc5c02b0dcbf2d5d78dfe0b0649df
parentf39e9b19c6b694b53239bbdf17001ce89ff7f63e (diff)
Kernel: Include slabheaps in kmalloc statistics
-rw-r--r--Kernel/Heap/kmalloc.cpp41
1 files changed, 39 insertions, 2 deletions
diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp
index 43b3ecabd7..07be704328 100644
--- a/Kernel/Heap/kmalloc.cpp
+++ b/Kernel/Heap/kmalloc.cpp
@@ -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;
}