diff options
author | Andreas Kling <kling@serenityos.org> | 2021-08-11 20:04:03 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-08-12 00:03:38 +0200 |
commit | 0d997d48eae24b1bf137e4a3b5914560dbb1e8be (patch) | |
tree | 9bf77c515659e314e7bb014478d5d27a037853b1 | |
parent | 84053816d51b8c912876f0e7274f3d4de5ade077 (diff) | |
download | serenity-0d997d48eae24b1bf137e4a3b5914560dbb1e8be.zip |
Kernel+LibC: Add PERF_EVENT_SIGNPOST
This event will be used by userspace programs wanting to mark
interesting high-level events in the profile. :^)
-rw-r--r-- | Kernel/PerformanceEventBuffer.cpp | 9 | ||||
-rw-r--r-- | Kernel/PerformanceEventBuffer.h | 6 | ||||
-rw-r--r-- | Kernel/UnixTypes.h | 1 | ||||
-rw-r--r-- | Userland/Libraries/LibC/serenity.h | 1 |
4 files changed, 17 insertions, 0 deletions
diff --git a/Kernel/PerformanceEventBuffer.cpp b/Kernel/PerformanceEventBuffer.cpp index f461ad8db9..aabfddc467 100644 --- a/Kernel/PerformanceEventBuffer.cpp +++ b/Kernel/PerformanceEventBuffer.cpp @@ -137,6 +137,10 @@ KResult PerformanceEventBuffer::append_with_ip_and_bp(ProcessID pid, ThreadID ti break; case PERF_EVENT_SYSCALL: break; + case PERF_EVENT_SIGNPOST: + event.data.signpost.arg1 = arg1; + event.data.signpost.arg2 = arg2; + break; default: return EINVAL; } @@ -231,6 +235,11 @@ bool PerformanceEventBuffer::to_json_impl(Serializer& object) const case PERF_EVENT_SYSCALL: event_object.add("type", "syscall"); break; + case PERF_EVENT_SIGNPOST: + event_object.add("type"sv, "signpost"sv); + event_object.add("arg1"sv, event.data.signpost.arg1); + event_object.add("arg2"sv, event.data.signpost.arg2); + break; } event_object.add("pid", event.pid); event_object.add("tid", event.tid); diff --git a/Kernel/PerformanceEventBuffer.h b/Kernel/PerformanceEventBuffer.h index 4c7c2fd748..217d738b09 100644 --- a/Kernel/PerformanceEventBuffer.h +++ b/Kernel/PerformanceEventBuffer.h @@ -62,6 +62,11 @@ struct [[gnu::packed]] KFreePerformanceEvent { FlatPtr ptr; }; +struct [[gnu::packed]] SignpostPerformanceEvent { + FlatPtr arg1; + FlatPtr arg2; +}; + struct [[gnu::packed]] PerformanceEvent { u16 type { 0 }; u8 stack_size { 0 }; @@ -80,6 +85,7 @@ struct [[gnu::packed]] PerformanceEvent { ContextSwitchPerformanceEvent context_switch; KMallocPerformanceEvent kmalloc; KFreePerformanceEvent kfree; + SignpostPerformanceEvent signpost; } data; static constexpr size_t max_stack_frame_count = 64; FlatPtr stack[max_stack_frame_count]; diff --git a/Kernel/UnixTypes.h b/Kernel/UnixTypes.h index 9ebc56bca8..fe62781483 100644 --- a/Kernel/UnixTypes.h +++ b/Kernel/UnixTypes.h @@ -63,6 +63,7 @@ enum { PERF_EVENT_KFREE = 4096, PERF_EVENT_PAGE_FAULT = 8192, PERF_EVENT_SYSCALL = 16384, + PERF_EVENT_SIGNPOST = 32768, }; #define WNOHANG 1 diff --git a/Userland/Libraries/LibC/serenity.h b/Userland/Libraries/LibC/serenity.h index a2533479d6..6c7e0f3d7b 100644 --- a/Userland/Libraries/LibC/serenity.h +++ b/Userland/Libraries/LibC/serenity.h @@ -113,6 +113,7 @@ enum { PERF_EVENT_KFREE = 4096, PERF_EVENT_PAGE_FAULT = 8192, PERF_EVENT_SYSCALL = 16384, + PERF_EVENT_SIGNPOST = 32768, }; #define PERF_EVENT_MASK_ALL (~0ull) |