diff --git a/Kernel/Arch/x86/common/Interrupts.cpp b/Kernel/Arch/x86/common/Interrupts.cpp index 5ad4f58bbd..a595c0d1a8 100644 --- a/Kernel/Arch/x86/common/Interrupts.cpp +++ b/Kernel/Arch/x86/common/Interrupts.cpp @@ -368,8 +368,6 @@ void page_fault_handler(TrapFrame* trap) constexpr FlatPtr free_scrub_pattern = explode_byte(FREE_SCRUB_BYTE); constexpr FlatPtr kmalloc_scrub_pattern = explode_byte(KMALLOC_SCRUB_BYTE); constexpr FlatPtr kfree_scrub_pattern = explode_byte(KFREE_SCRUB_BYTE); - constexpr FlatPtr slab_alloc_scrub_pattern = explode_byte(SLAB_ALLOC_SCRUB_BYTE); - constexpr FlatPtr slab_dealloc_scrub_pattern = explode_byte(SLAB_DEALLOC_SCRUB_BYTE); if ((fault_address & 0xffff0000) == (malloc_scrub_pattern & 0xffff0000)) { dbgln("Note: Address {} looks like it may be uninitialized malloc() memory", VirtualAddress(fault_address)); } else if ((fault_address & 0xffff0000) == (free_scrub_pattern & 0xffff0000)) { @@ -378,10 +376,6 @@ void page_fault_handler(TrapFrame* trap) dbgln("Note: Address {} looks like it may be uninitialized kmalloc() memory", VirtualAddress(fault_address)); } else if ((fault_address & 0xffff0000) == (kfree_scrub_pattern & 0xffff0000)) { dbgln("Note: Address {} looks like it may be recently kfree()'d memory", VirtualAddress(fault_address)); - } else if ((fault_address & 0xffff0000) == (slab_alloc_scrub_pattern & 0xffff0000)) { - dbgln("Note: Address {} looks like it may be uninitialized slab_alloc() memory", VirtualAddress(fault_address)); - } else if ((fault_address & 0xffff0000) == (slab_dealloc_scrub_pattern & 0xffff0000)) { - dbgln("Note: Address {} looks like it may be recently slab_dealloc()'d memory", VirtualAddress(fault_address)); } else if (fault_address < 4096) { dbgln("Note: Address {} looks like a possible nullptr dereference", VirtualAddress(fault_address)); } else if constexpr (SANITIZE_PTRS) { diff --git a/Kernel/CMakeLists.txt b/Kernel/CMakeLists.txt index 934ff94029..d436398be8 100644 --- a/Kernel/CMakeLists.txt +++ b/Kernel/CMakeLists.txt @@ -14,7 +14,6 @@ elseif("${SERENITY_ARCH}" STREQUAL "x86_64") endif() set(KERNEL_HEAP_SOURCES - Heap/SlabAllocator.cpp Heap/kmalloc.cpp ) @@ -446,7 +445,6 @@ if (ENABLE_KERNEL_COVERAGE_COLLECTION) ../Kernel/Devices/KCOVInstance.cpp ../Kernel/FileSystem/File.cpp ../Kernel/FileSystem/OpenFileDescription.cpp - ../Kernel/Heap/SlabAllocator.cpp ../Kernel/init.cpp ../Kernel/SanCov.cpp # GCC assumes that the caller saves registers for functions according diff --git a/Kernel/FileSystem/Custody.h b/Kernel/FileSystem/Custody.h index c64d865ea7..64a4c4dae1 100644 --- a/Kernel/FileSystem/Custody.h +++ b/Kernel/FileSystem/Custody.h @@ -12,7 +12,6 @@ #include #include #include -#include #include namespace Kernel { diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index 83517a49fe..284975ab28 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -412,14 +412,6 @@ private: json.add("super_physical_available", system_memory.super_physical_pages - system_memory.super_physical_pages_used); json.add("kmalloc_call_count", stats.kmalloc_call_count); json.add("kfree_call_count", stats.kfree_call_count); - TRY(slab_alloc_stats([&json](size_t slab_size, size_t num_allocated, size_t num_free) -> ErrorOr { - auto prefix = TRY(KString::formatted("slab_{}", slab_size)); - auto formatted_num_allocated = TRY(KString::formatted("{}_num_allocated", prefix)); - auto formatted_num_free = TRY(KString::formatted("{}_num_free", prefix)); - json.add(formatted_num_allocated->view(), num_allocated); - json.add(formatted_num_free->view(), num_free); - return {}; - })); json.finish(); return {}; } diff --git a/Kernel/Heap/SlabAllocator.cpp b/Kernel/Heap/SlabAllocator.cpp deleted file mode 100644 index ea36973303..0000000000 --- a/Kernel/Heap/SlabAllocator.cpp +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include -#include - -#define SANITIZE_SLABS - -namespace Kernel { - -template -class SlabAllocator { -public: - SlabAllocator() = default; - - void init(size_t size) - { - m_base = kmalloc_eternal(size); - m_end = (u8*)m_base + size; - FreeSlab* slabs = (FreeSlab*)m_base; - m_slab_count = size / templated_slab_size; - for (size_t i = 1; i < m_slab_count; ++i) { - slabs[i].next = &slabs[i - 1]; - } - slabs[0].next = nullptr; - m_freelist = &slabs[m_slab_count - 1]; - m_num_allocated = 0; - } - - constexpr size_t slab_size() const { return templated_slab_size; } - size_t slab_count() const { return m_slab_count; } - - void* alloc() - { - FreeSlab* free_slab; - { - // We want to avoid being swapped out in the middle of this - ScopedCritical critical; - FreeSlab* next_free; - free_slab = m_freelist.load(AK::memory_order_consume); - do { - if (!free_slab) - return kmalloc(slab_size()); - // It's possible another processor is doing the same thing at - // the same time, so next_free *can* be a bogus pointer. However, - // in that case compare_exchange_strong would fail and we would - // try again. - next_free = free_slab->next; - } while (!m_freelist.compare_exchange_strong(free_slab, next_free, AK::memory_order_acq_rel)); - - m_num_allocated++; - } - -#ifdef SANITIZE_SLABS - memset(free_slab, SLAB_ALLOC_SCRUB_BYTE, slab_size()); -#endif - return free_slab; - } - - void dealloc(void* ptr) - { - VERIFY(ptr); - if (ptr < m_base || ptr >= m_end) { - kfree_sized(ptr, slab_size()); - return; - } - FreeSlab* free_slab = (FreeSlab*)ptr; -#ifdef SANITIZE_SLABS - if (slab_size() > sizeof(FreeSlab*)) - memset(free_slab->padding, SLAB_DEALLOC_SCRUB_BYTE, sizeof(FreeSlab::padding)); -#endif - - // We want to avoid being swapped out in the middle of this - ScopedCritical critical; - FreeSlab* next_free = m_freelist.load(AK::memory_order_consume); - do { - free_slab->next = next_free; - } while (!m_freelist.compare_exchange_strong(next_free, free_slab, AK::memory_order_acq_rel)); - - m_num_allocated--; - } - - size_t num_allocated() const { return m_num_allocated; } - size_t num_free() const { return m_slab_count - m_num_allocated; } - -private: - struct FreeSlab { - FreeSlab* next; - char padding[templated_slab_size - sizeof(FreeSlab*)]; - }; - - Atomic m_freelist { nullptr }; - Atomic m_num_allocated { 0 }; - size_t m_slab_count { 0 }; - void* m_base { nullptr }; - void* m_end { nullptr }; - - static_assert(AssertSize()); -}; - -static SlabAllocator<16> s_slab_allocator_16; -static SlabAllocator<32> s_slab_allocator_32; -static SlabAllocator<64> s_slab_allocator_64; -static SlabAllocator<128> s_slab_allocator_128; -static SlabAllocator<256> s_slab_allocator_256; - -#if ARCH(I386) -static_assert(sizeof(Memory::Region) <= s_slab_allocator_128.slab_size()); -#endif - -template -ErrorOr for_each_allocator(Callback callback) -{ - TRY(callback(s_slab_allocator_16)); - TRY(callback(s_slab_allocator_32)); - TRY(callback(s_slab_allocator_64)); - TRY(callback(s_slab_allocator_128)); - TRY(callback(s_slab_allocator_256)); - return {}; -} - -UNMAP_AFTER_INIT void slab_alloc_init() -{ - s_slab_allocator_16.init(128 * KiB); - s_slab_allocator_32.init(128 * KiB); - s_slab_allocator_64.init(512 * KiB); - s_slab_allocator_128.init(512 * KiB); - s_slab_allocator_256.init(128 * KiB); -} - -void* slab_alloc(size_t slab_size) -{ - if (slab_size <= 16) - return s_slab_allocator_16.alloc(); - if (slab_size <= 32) - return s_slab_allocator_32.alloc(); - if (slab_size <= 64) - return s_slab_allocator_64.alloc(); - if (slab_size <= 128) - return s_slab_allocator_128.alloc(); - if (slab_size <= 256) - return s_slab_allocator_256.alloc(); - VERIFY_NOT_REACHED(); -} - -void slab_dealloc(void* ptr, size_t slab_size) -{ - if (slab_size <= 16) - return s_slab_allocator_16.dealloc(ptr); - if (slab_size <= 32) - return s_slab_allocator_32.dealloc(ptr); - if (slab_size <= 64) - return s_slab_allocator_64.dealloc(ptr); - if (slab_size <= 128) - return s_slab_allocator_128.dealloc(ptr); - if (slab_size <= 256) - return s_slab_allocator_256.dealloc(ptr); - VERIFY_NOT_REACHED(); -} - -ErrorOr slab_alloc_stats(Function(size_t slab_size, size_t allocated, size_t free)> callback) -{ - TRY(for_each_allocator([&](auto& allocator) -> ErrorOr { - auto num_allocated = allocator.num_allocated(); - auto num_free = allocator.slab_count() - num_allocated; - TRY(callback(allocator.slab_size(), num_allocated, num_free)); - return {}; - })); - - return {}; -} - -} diff --git a/Kernel/Heap/SlabAllocator.h b/Kernel/Heap/SlabAllocator.h deleted file mode 100644 index e2fc3a5e7f..0000000000 --- a/Kernel/Heap/SlabAllocator.h +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2018-2020, Andreas Kling - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#pragma once - -#include -#include -#include - -namespace Kernel { - -#define SLAB_ALLOC_SCRUB_BYTE 0xab -#define SLAB_DEALLOC_SCRUB_BYTE 0xbc - -void* slab_alloc(size_t slab_size); -void slab_dealloc(void*, size_t slab_size); -void slab_alloc_init(); -ErrorOr slab_alloc_stats(Function(size_t slab_size, size_t allocated, size_t free)>); - -#define MAKE_SLAB_ALLOCATED(type) \ -public: \ - [[nodiscard]] void* operator new(size_t) \ - { \ - void* ptr = slab_alloc(sizeof(type)); \ - VERIFY(ptr); \ - return ptr; \ - } \ - [[nodiscard]] void* operator new(size_t, const std::nothrow_t&) noexcept \ - { \ - return slab_alloc(sizeof(type)); \ - } \ - void operator delete(void* ptr) noexcept \ - { \ - if (!ptr) \ - return; \ - slab_dealloc(ptr, sizeof(type)); \ - } \ - \ -private: - -} diff --git a/Kernel/Memory/Region.h b/Kernel/Memory/Region.h index 1ad6e69e9b..7571456ca3 100644 --- a/Kernel/Memory/Region.h +++ b/Kernel/Memory/Region.h @@ -10,7 +10,6 @@ #include #include #include -#include #include #include #include diff --git a/Kernel/WorkQueue.h b/Kernel/WorkQueue.h index 1c86b04cf8..9f84424888 100644 --- a/Kernel/WorkQueue.h +++ b/Kernel/WorkQueue.h @@ -9,7 +9,6 @@ #include #include -#include #include namespace Kernel { diff --git a/Kernel/init.cpp b/Kernel/init.cpp index e3d6f99691..ae6c095392 100644 --- a/Kernel/init.cpp +++ b/Kernel/init.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -179,7 +178,6 @@ extern "C" [[noreturn]] UNMAP_AFTER_INIT void init(BootInfo const& boot_info) for (ctor_func_t* ctor = start_heap_ctors; ctor < end_heap_ctors; ctor++) (*ctor)(); kmalloc_init(); - slab_alloc_init(); load_kernel_symbol_table();