diff --git a/Kernel/Heap/Heap.h b/Kernel/Heap/Heap.h index 5370560205..147e37ac4f 100644 --- a/Kernel/Heap/Heap.h +++ b/Kernel/Heap/Heap.h @@ -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) diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp index 654d288069..eeeb4c4bc0 100644 --- a/Kernel/Heap/kmalloc.cpp +++ b/Kernel/Heap/kmalloc.cpp @@ -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; @@ -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::AllocationHeaderSize, CHUNK_SIZE) - Heap::AllocationHeaderSize; } void* kmalloc_aligned(size_t size, size_t alignment)