[Mammoth] Naively free buddy allocated blocks.

We don't yet attempt to merge them with nearby blocks.
Currently this reduces the number of 2 page blocks we allocate down from
40 to 29.
This commit is contained in:
Drew Galbraith 2023-11-24 09:01:25 -08:00
parent 0915cf45dc
commit 7715a5898b
1 changed files with 14 additions and 3 deletions

View File

@ -90,11 +90,20 @@ class BuddyAllocator {
return ptr; return ptr;
} }
void Free(void* ptr) {
BuddySlot* slot = ((BuddySlot*)ptr) - 1;
// TODO: Merge.
free_front_->prev = slot;
slot->next = free_front_;
free_front_ = slot;
}
private: private:
BuddySlot* free_front_ = nullptr; BuddySlot* free_front_ = nullptr;
z_cap_t mutex_cap_ = 0; z_cap_t mutex_cap_ = 0;
void AddPage() { void AddPage() {
dbgln("PAGE");
uint64_t vaddr = PageAllocator::AllocatePagePair(); uint64_t vaddr = PageAllocator::AllocatePagePair();
BuddySlot* slot = reinterpret_cast<BuddySlot*>(vaddr); BuddySlot* slot = reinterpret_cast<BuddySlot*>(vaddr);
slot->prev = nullptr; slot->prev = nullptr;
@ -157,11 +166,13 @@ void* Allocate(uint64_t size) {
return ptr; return ptr;
} }
void Free(void* ptr) { gAllocator.Free(ptr); }
} // namespace } // namespace
[[nodiscard]] void* operator new(uint64_t size) { return Allocate(size); } [[nodiscard]] void* operator new(uint64_t size) { return Allocate(size); }
[[nodiscard]] void* operator new[](uint64_t size) { return Allocate(size); } [[nodiscard]] void* operator new[](uint64_t size) { return Allocate(size); }
void operator delete(void*, uint64_t) {} void operator delete(void* ptr, uint64_t) { Free(ptr); }
void operator delete[](void*) {} void operator delete[](void* ptr) { Free(ptr); }
void operator delete[](void*, uint64_t) {} void operator delete[](void* ptr, uint64_t) { Free(ptr); }