Переглянути джерело

Kernel: Include slabheaps in kmalloc statistics

Idan Horowitz 3 роки тому
батько
коміт
16d69376d8
1 змінених файлів з 39 додано та 2 видалено
  1. 39 2
      Kernel/Heap/kmalloc.cpp

+ 39 - 2
Kernel/Heap/kmalloc.cpp

@@ -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 < slab_count; ++i) {
+        for (size_t i = 0; i < m_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;
     }
     }