Skip to content

Commit

Permalink
Kernel: Implement kmalloc_good_size for the new kmalloc
Browse files Browse the repository at this point in the history
This lets kmalloc-aware data structures like Vector and HashTable use
up the extra wasted space we allocate in the slab heaps & heap chunks.
  • Loading branch information
IdanHo committed Mar 7, 2022
1 parent c204885 commit 29eee39
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 1 deletion.
2 changes: 2 additions & 0 deletions Kernel/Heap/Heap.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,8 @@ class Heap {
}

public:
static constexpr size_t AllocationHeaderSize = sizeof(AllocationHeader);

Heap(u8* memory, size_t memory_size)
: m_total_chunks(calculate_chunks(memory_size))
, m_chunks(memory)
Expand Down
9 changes: 8 additions & 1 deletion Kernel/Heap/kmalloc.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ static constexpr size_t CHUNK_SIZE = 32;
#else
static constexpr size_t CHUNK_SIZE = 64;
#endif
static_assert(is_power_of_two(CHUNK_SIZE));

static constexpr size_t INITIAL_KMALLOC_MEMORY_SIZE = 2 * MiB;

Expand Down Expand Up @@ -435,7 +436,13 @@ void kfree_sized(void* ptr, size_t size)

size_t kmalloc_good_size(size_t size)
{
return size;
VERIFY(size > 0);
// NOTE: There's no need to take the kmalloc lock, as the kmalloc slab-heaps (and their sizes) are constant
for (auto const& slabheap : g_kmalloc_global->slabheaps) {
if (size <= slabheap.slab_size())
return slabheap.slab_size();
}
return round_up_to_power_of_two(size + Heap<CHUNK_SIZE>::AllocationHeaderSize, CHUNK_SIZE) - Heap<CHUNK_SIZE>::AllocationHeaderSize;
}

void* kmalloc_aligned(size_t size, size_t alignment)
Expand Down

0 comments on commit 29eee39

Please sign in to comment.