瀏覽代碼

Kernel: Move process creation perf events to PerformanceManager

Brian Gianforcaro 4 年之前
父節點
當前提交
8bf4201f50
共有 4 個文件被更改,包括 23 次插入13 次删除
  1. 15 1
      Kernel/PerformanceManager.h
  2. 2 4
      Kernel/Syscalls/execve.cpp
  3. 2 5
      Kernel/Syscalls/fork.cpp
  4. 4 3
      Kernel/Syscalls/profiling.cpp

+ 15 - 1
Kernel/PerformanceManager.h

@@ -13,8 +13,22 @@
 namespace Kernel {
 namespace Kernel {
 
 
 class PerformanceManager {
 class PerformanceManager {
-
 public:
 public:
+    inline static void add_process_created_event(Process& process)
+    {
+        if (g_profiling_all_threads) {
+            VERIFY(g_global_perf_events);
+            g_global_perf_events->add_process(process, ProcessEventType::Create);
+        }
+    }
+
+    inline static void add_process_exec_event(Process& process)
+    {
+        if (auto* event_buffer = process.current_perf_events_buffer()) {
+            event_buffer->add_process(process, ProcessEventType::Exec);
+        }
+    }
+
     inline static void add_thread_created_event(Thread& thread)
     inline static void add_thread_created_event(Thread& thread)
     {
     {
         if (auto* event_buffer = thread.process().current_perf_events_buffer()) {
         if (auto* event_buffer = thread.process().current_perf_events_buffer()) {

+ 2 - 4
Kernel/Syscalls/execve.cpp

@@ -11,7 +11,7 @@
 #include <Kernel/Debug.h>
 #include <Kernel/Debug.h>
 #include <Kernel/FileSystem/Custody.h>
 #include <Kernel/FileSystem/Custody.h>
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/FileSystem/FileDescription.h>
-#include <Kernel/PerformanceEventBuffer.h>
+#include <Kernel/PerformanceManager.h>
 #include <Kernel/Process.h>
 #include <Kernel/Process.h>
 #include <Kernel/Random.h>
 #include <Kernel/Random.h>
 #include <Kernel/Time/TimeManagement.h>
 #include <Kernel/Time/TimeManagement.h>
@@ -636,9 +636,7 @@ KResult Process::do_exec(NonnullRefPtr<FileDescription> main_program_description
     tss.cr3 = space().page_directory().cr3();
     tss.cr3 = space().page_directory().cr3();
     tss.ss2 = pid().value();
     tss.ss2 = pid().value();
 
 
-    if (auto* event_buffer = current_perf_events_buffer()) {
-        event_buffer->add_process(*this, ProcessEventType::Exec);
-    }
+    PerformanceManager::add_process_exec_event(*this);
 
 
     {
     {
         ScopedSpinLock lock(g_scheduler_lock);
         ScopedSpinLock lock(g_scheduler_lock);

+ 2 - 5
Kernel/Syscalls/fork.cpp

@@ -7,7 +7,7 @@
 #include <Kernel/Debug.h>
 #include <Kernel/Debug.h>
 #include <Kernel/FileSystem/Custody.h>
 #include <Kernel/FileSystem/Custody.h>
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/FileSystem/FileDescription.h>
-#include <Kernel/PerformanceEventBuffer.h>
+#include <Kernel/PerformanceManager.h>
 #include <Kernel/Process.h>
 #include <Kernel/Process.h>
 #include <Kernel/VM/Region.h>
 #include <Kernel/VM/Region.h>
 
 
@@ -85,10 +85,7 @@ KResultOr<pid_t> Process::sys$fork(RegisterState& regs)
         g_processes->prepend(child);
         g_processes->prepend(child);
     }
     }
 
 
-    if (g_profiling_all_threads) {
-        VERIFY(g_global_perf_events);
-        g_global_perf_events->add_process(*child, ProcessEventType::Create);
-    }
+    PerformanceManager::add_process_created_event(*child);
 
 
     ScopedSpinLock lock(g_scheduler_lock);
     ScopedSpinLock lock(g_scheduler_lock);
     child_first_thread->set_affinity(Thread::current()->affinity());
     child_first_thread->set_affinity(Thread::current()->affinity());

+ 4 - 3
Kernel/Syscalls/profiling.cpp

@@ -7,7 +7,7 @@
 #include <Kernel/CoreDump.h>
 #include <Kernel/CoreDump.h>
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/FileSystem/FileDescription.h>
 #include <Kernel/FileSystem/VirtualFileSystem.h>
 #include <Kernel/FileSystem/VirtualFileSystem.h>
-#include <Kernel/PerformanceEventBuffer.h>
+#include <Kernel/PerformanceManager.h>
 #include <Kernel/Process.h>
 #include <Kernel/Process.h>
 
 
 namespace Kernel {
 namespace Kernel {
@@ -27,12 +27,13 @@ KResultOr<int> Process::sys$profiling_enable(pid_t pid)
             g_global_perf_events->clear();
             g_global_perf_events->clear();
         else
         else
             g_global_perf_events = PerformanceEventBuffer::try_create_with_size(32 * MiB).leak_ptr();
             g_global_perf_events = PerformanceEventBuffer::try_create_with_size(32 * MiB).leak_ptr();
+
         ScopedSpinLock lock(g_processes_lock);
         ScopedSpinLock lock(g_processes_lock);
+        g_profiling_all_threads = true;
         Process::for_each([](auto& process) {
         Process::for_each([](auto& process) {
-            g_global_perf_events->add_process(process, ProcessEventType::Create);
+            PerformanceManager::add_process_created_event(process);
             return IterationDecision::Continue;
             return IterationDecision::Continue;
         });
         });
-        g_profiling_all_threads = true;
         return 0;
         return 0;
     }
     }