diff options
author | Gunnar Beutner <gbeutner@serenityos.org> | 2021-05-13 13:09:00 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-05-19 22:51:42 +0200 |
commit | 277f333b2bbf2ca24d0d4c7695edbaed21dc0ba3 (patch) | |
tree | 8b66ccf59698ae554250ccf9163f9d42ec0e4ae4 /Kernel/Heap | |
parent | 572bbf28ccd1cd5f8e4f17a38d0fbd989b1d56bf (diff) | |
download | serenity-277f333b2bbf2ca24d0d4c7695edbaed21dc0ba3.zip |
Kernel: Add support for profiling kmalloc()/kfree()
Diffstat (limited to 'Kernel/Heap')
-rw-r--r-- | Kernel/Heap/kmalloc.cpp | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/Kernel/Heap/kmalloc.cpp b/Kernel/Heap/kmalloc.cpp index c7759f4ad7..5c245fc7a7 100644 --- a/Kernel/Heap/kmalloc.cpp +++ b/Kernel/Heap/kmalloc.cpp @@ -18,6 +18,7 @@ #include <Kernel/Heap/kmalloc.h> #include <Kernel/KSyms.h> #include <Kernel/Panic.h> +#include <Kernel/PerformanceManager.h> #include <Kernel/Process.h> #include <Kernel/Scheduler.h> #include <Kernel/SpinLock.h> @@ -189,6 +190,7 @@ __attribute__((section(".heap"))) static u8 kmalloc_pool_heap[POOL_SIZE]; static size_t g_kmalloc_bytes_eternal = 0; static size_t g_kmalloc_call_count; static size_t g_kfree_call_count; +static size_t g_nested_kfree_calls; bool g_dump_kmalloc_stacks; static u8* s_next_eternal_ptr; @@ -255,6 +257,12 @@ void* kmalloc(size_t size) PANIC("kmalloc: Out of memory (requested size: {})", size); } + Process* current_process = Process::current(); + if (!current_process && Scheduler::colonel_initialized()) + current_process = Scheduler::colonel(); + if (current_process) + PerformanceManager::add_kmalloc_perf_event(*current_process, size, (FlatPtr)ptr); + return ptr; } @@ -266,8 +274,18 @@ void kfree(void* ptr) kmalloc_verify_nospinlock_held(); ScopedSpinLock lock(s_lock); ++g_kfree_call_count; + ++g_nested_kfree_calls; + + if (g_nested_kfree_calls == 1) { + Process* current_process = Process::current(); + if (!current_process && Scheduler::colonel_initialized()) + current_process = Scheduler::colonel(); + if (current_process) + PerformanceManager::add_kfree_perf_event(*current_process, 0, (FlatPtr)ptr); + } g_kmalloc_global->m_heap.deallocate(ptr); + --g_nested_kfree_calls; } void* krealloc(void* ptr, size_t new_size) |