|
@@ -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;
|
|
}
|
|
}
|
|
|
|
|