From 74ee491b842e1f1a4df75f81e980957ff194c5b0 Mon Sep 17 00:00:00 2001 From: Brian Gianforcaro Date: Mon, 29 Nov 2021 03:01:24 -0800 Subject: [PATCH] Kernel: Handle string format errors in SlabAllocator stats :^) Switch to KString::formatted and fix API so we can propagate errors. --- Kernel/GlobalProcessExposed.cpp | 16 ++++++++++------ Kernel/Heap/SlabAllocator.cpp | 24 ++++++++++++++---------- Kernel/Heap/SlabAllocator.h | 2 +- 3 files changed, 25 insertions(+), 17 deletions(-) diff --git a/Kernel/GlobalProcessExposed.cpp b/Kernel/GlobalProcessExposed.cpp index 2bed0a83ae..2733e9537c 100644 --- a/Kernel/GlobalProcessExposed.cpp +++ b/Kernel/GlobalProcessExposed.cpp @@ -412,11 +412,14 @@ 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); - slab_alloc_stats([&json](size_t slab_size, size_t num_allocated, size_t num_free) { - auto prefix = String::formatted("slab_{}", slab_size); - json.add(String::formatted("{}_num_allocated", prefix), num_allocated); - json.add(String::formatted("{}_num_free", prefix), num_free); - }); + 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 {}; } @@ -952,7 +955,8 @@ ErrorOr ProcFSRootDirectory::traverse_as_directory(FileSystemID fsid, Func VERIFY(!(process.pid() < 0)); u64 process_id = (u64)process.pid().value(); InodeIdentifier identifier = { fsid, static_cast(process_id << 36) }; - TRY(callback({ String::formatted("{:d}", process.pid().value()), identifier, 0 })); + auto process_id_string = TRY(KString::formatted("{:d}", process_id)); + TRY(callback({ process_id_string->view(), identifier, 0 })); } return {}; }); diff --git a/Kernel/Heap/SlabAllocator.cpp b/Kernel/Heap/SlabAllocator.cpp index 179cdcc0b8..ed9e83449b 100644 --- a/Kernel/Heap/SlabAllocator.cpp +++ b/Kernel/Heap/SlabAllocator.cpp @@ -116,13 +116,14 @@ static_assert(sizeof(Memory::Region) <= s_slab_allocator_128.slab_size()); #endif template -void for_each_allocator(Callback callback) +ErrorOr for_each_allocator(Callback callback) { - callback(s_slab_allocator_16); - callback(s_slab_allocator_32); - callback(s_slab_allocator_64); - callback(s_slab_allocator_128); - callback(s_slab_allocator_256); + 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() @@ -164,13 +165,16 @@ void slab_dealloc(void* ptr, size_t slab_size) VERIFY_NOT_REACHED(); } -void slab_alloc_stats(Function callback) +ErrorOr slab_alloc_stats(Function(size_t slab_size, size_t allocated, size_t free)> callback) { - for_each_allocator([&](auto& allocator) { + TRY(for_each_allocator([&](auto& allocator) -> ErrorOr { auto num_allocated = allocator.num_allocated(); auto num_free = allocator.slab_count() - num_allocated; - callback(allocator.slab_size(), num_allocated, num_free); - }); + TRY(callback(allocator.slab_size(), num_allocated, num_free)); + return {}; + })); + + return {}; } } diff --git a/Kernel/Heap/SlabAllocator.h b/Kernel/Heap/SlabAllocator.h index 5650d428c1..81d0612fb4 100644 --- a/Kernel/Heap/SlabAllocator.h +++ b/Kernel/Heap/SlabAllocator.h @@ -17,7 +17,7 @@ namespace Kernel { void* slab_alloc(size_t slab_size); void slab_dealloc(void*, size_t slab_size); void slab_alloc_init(); -void slab_alloc_stats(Function); +ErrorOr slab_alloc_stats(Function(size_t slab_size, size_t allocated, size_t free)>); #define MAKE_SLAB_ALLOCATED(type) \ public: \