diff options
author | Idan Horowitz <idan.horowitz@gmail.com> | 2022-01-23 18:28:32 +0200 |
---|---|---|
committer | Idan Horowitz <idan.horowitz@gmail.com> | 2022-01-24 14:09:55 +0200 |
commit | 16d69376d829410184342f95b2df363bea6bbcb2 (patch) | |
tree | 7d1d721af1ecc5c02b0dcbf2d5d78dfe0b0649df | |
parent | f39e9b19c6b694b53239bbdf17001ce89ff7f63e (diff) |
Kernel: Include slabheaps in kmalloc statistics
-rw-r--r-- | Kernel/Heap/kmalloc.cpp | 41 |
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; } |