mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 18:28:12 +00:00
Kernel: Start work on full system profiling :^)
The superuser can now call sys$profiling_enable() with PID -1 to enable profiling of all running threads in the system. The perf events are collected in a global PerformanceEventBuffer (currently 32 MiB in size.) The events can be accessed via /proc/profile
This commit is contained in:
parent
b425c2602c
commit
ea500dd3e3
5 changed files with 91 additions and 23 deletions
|
@ -32,9 +32,25 @@
|
|||
|
||||
namespace Kernel {
|
||||
|
||||
PerformanceEventBuffer* g_global_perf_events;
|
||||
bool g_profiling_all_threads;
|
||||
|
||||
KResultOr<int> Process::sys$profiling_enable(pid_t pid)
|
||||
{
|
||||
REQUIRE_NO_PROMISES;
|
||||
|
||||
if (pid == -1) {
|
||||
if (!is_superuser())
|
||||
return EPERM;
|
||||
ScopedCritical critical;
|
||||
if (g_global_perf_events)
|
||||
g_global_perf_events->clear();
|
||||
else
|
||||
g_global_perf_events = PerformanceEventBuffer::try_create_with_size(32 * MiB).leak_ptr();
|
||||
g_profiling_all_threads = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ScopedSpinLock lock(g_processes_lock);
|
||||
auto process = Process::from_pid(pid);
|
||||
if (!process)
|
||||
|
@ -51,6 +67,14 @@ KResultOr<int> Process::sys$profiling_enable(pid_t pid)
|
|||
|
||||
KResultOr<int> Process::sys$profiling_disable(pid_t pid)
|
||||
{
|
||||
if (pid == -1) {
|
||||
if (!is_superuser())
|
||||
return EPERM;
|
||||
ScopedCritical critical;
|
||||
g_profiling_all_threads = false;
|
||||
return 0;
|
||||
}
|
||||
|
||||
ScopedSpinLock lock(g_processes_lock);
|
||||
auto process = Process::from_pid(pid);
|
||||
if (!process)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue