From e830a3d37b77225232b048077f00842c46a77993 Mon Sep 17 00:00:00 2001 From: "Justin C. Miller" Date: Tue, 11 Oct 2022 18:52:19 -0700 Subject: [PATCH] [kernel] Move slab_allocated items to the heap Allocate the slabs for slab-allocated items to the heap, now that heap regions are aligned. This also lets the slab sizes be non-page-sized. --- definitions/memory_layout.yaml | 3 --- src/kernel/memory_bootstrap.cpp | 8 -------- src/kernel/objects/mailbox.h | 3 ++- src/kernel/slab_allocated.h | 15 +++++---------- 4 files changed, 7 insertions(+), 22 deletions(-) diff --git a/definitions/memory_layout.yaml b/definitions/memory_layout.yaml index ddf8fe3..dd42627 100644 --- a/definitions/memory_layout.yaml +++ b/definitions/memory_layout.yaml @@ -24,6 +24,3 @@ - name: buffers size: 64G - -- name: slabs - size: 64G diff --git a/src/kernel/memory_bootstrap.cpp b/src/kernel/memory_bootstrap.cpp index b81783c..24aa4b5 100644 --- a/src/kernel/memory_bootstrap.cpp +++ b/src/kernel/memory_bootstrap.cpp @@ -24,8 +24,6 @@ using bootproto::allocation_register; using obj::vm_flags; -uintptr_t g_slabs_bump_pointer; - // These objects are initialized _before_ global constructors are called, // so we don't want them to have global constructors at all, lest they // overwrite the previous initialization. @@ -56,10 +54,6 @@ obj::vm_area_guarded g_kernel_buffers { mem::buffers_size, vm_flags::write}; -obj::vm_area_open g_kernel_slabs { - mem::slabs_size, - vm_flags::write}; - void * operator new(size_t size) { return g_kernel_heap.allocate(size); } void * operator new [] (size_t size) { return g_kernel_heap.allocate(size); } void operator delete (void *p) noexcept { return g_kernel_heap.free(p); } @@ -135,8 +129,6 @@ memory_initialize_post_ctors(bootproto::args &kargs) { vm_space &vm = vm_space::kernel_space(); vm.add(mem::buffers_offset, &g_kernel_buffers); - vm.add(mem::slabs_offset, &g_kernel_slabs); - g_slabs_bump_pointer = mem::slabs_offset; g_frame_allocator.free( get_physical_page(kargs.page_tables.pointer), diff --git a/src/kernel/objects/mailbox.h b/src/kernel/objects/mailbox.h index f913446..5c23525 100644 --- a/src/kernel/objects/mailbox.h +++ b/src/kernel/objects/mailbox.h @@ -7,6 +7,7 @@ #include #include +#include "memory.h" #include "objects/kobject.h" #include "slab_allocated.h" #include "wait_queue.h" @@ -79,7 +80,7 @@ private: struct mailbox::message : - public slab_allocated + public slab_allocated { uint64_t tag; uint64_t subtag; diff --git a/src/kernel/slab_allocated.h b/src/kernel/slab_allocated.h index b703095..942d54a 100644 --- a/src/kernel/slab_allocated.h +++ b/src/kernel/slab_allocated.h @@ -8,14 +8,11 @@ #include "memory.h" -extern uintptr_t g_slabs_bump_pointer; - -template +template class slab_allocated { public: - constexpr static unsigned slab_pages = N; - constexpr static unsigned slab_size = N * mem::frame_size; + static constexpr size_t slab_size = N; void * operator new(size_t size) { @@ -37,9 +34,7 @@ private: { s_free.ensure_capacity(per_block); - uintptr_t start = __atomic_fetch_add( - &g_slabs_bump_pointer, slab_size, - __ATOMIC_SEQ_CST); + uint8_t *start = new uint8_t [slab_size]; T *current = reinterpret_cast(start); T *end = util::offset_pointer(current, slab_size); @@ -50,8 +45,8 @@ private: static util::vector s_free; }; -template +template util::vector slab_allocated::s_free; #define DEFINE_SLAB_ALLOCATOR(type) \ - template<> util::vector slab_allocated::s_free {}; + template<> util::vector slab_allocated::s_free {};