Kernel: Prune uninteresting kernel frames from profiling samples
Start capturing the sample stacks at the EIP/EBP of the pre-empted thread instead of capturing EBP in the sampling function itself.
This commit is contained in:
parent
bf0719092f
commit
647cfcb641
Notes:
sideshowbarker
2024-07-18 23:08:43 +09:00
Author: https://github.com/awesomekling Commit: https://github.com/SerenityOS/serenity/commit/647cfcb6412
3 changed files with 12 additions and 5 deletions
|
@ -39,6 +39,16 @@ PerformanceEventBuffer::PerformanceEventBuffer()
|
|||
}
|
||||
|
||||
KResult PerformanceEventBuffer::append(int type, FlatPtr arg1, FlatPtr arg2)
|
||||
{
|
||||
FlatPtr ebp;
|
||||
asm volatile("movl %%ebp, %%eax"
|
||||
: "=a"(ebp));
|
||||
auto current_thread = Thread::current();
|
||||
auto eip = current_thread->get_register_dump_from_stack().eip;
|
||||
return append_with_eip_and_ebp(eip, ebp, type, arg1, arg2);
|
||||
}
|
||||
|
||||
KResult PerformanceEventBuffer::append_with_eip_and_ebp(u32 eip, u32 ebp, int type, FlatPtr arg1, FlatPtr arg2)
|
||||
{
|
||||
if (count() >= capacity())
|
||||
return KResult(-ENOBUFS);
|
||||
|
@ -60,11 +70,7 @@ KResult PerformanceEventBuffer::append(int type, FlatPtr arg1, FlatPtr arg2)
|
|||
return KResult(-EINVAL);
|
||||
}
|
||||
|
||||
FlatPtr ebp;
|
||||
asm volatile("movl %%ebp, %%eax"
|
||||
: "=a"(ebp));
|
||||
auto current_thread = Thread::current();
|
||||
auto eip = current_thread->get_register_dump_from_stack().eip;
|
||||
Vector<FlatPtr> backtrace;
|
||||
{
|
||||
SmapDisabler disabler;
|
||||
|
|
|
@ -61,6 +61,7 @@ public:
|
|||
PerformanceEventBuffer();
|
||||
|
||||
KResult append(int type, FlatPtr arg1, FlatPtr arg2);
|
||||
KResult append_with_eip_and_ebp(u32 eip, u32 ebp, int type, FlatPtr arg1, FlatPtr arg2);
|
||||
|
||||
void clear()
|
||||
{
|
||||
|
|
|
@ -495,7 +495,7 @@ void Scheduler::timer_tick(const RegisterState& regs)
|
|||
if (current_thread->process().is_profiling()) {
|
||||
ASSERT(current_thread->process().perf_events());
|
||||
auto& perf_events = *current_thread->process().perf_events();
|
||||
[[maybe_unused]] auto rc = perf_events.append(PERF_EVENT_SAMPLE, 0, 0);
|
||||
[[maybe_unused]] auto rc = perf_events.append_with_eip_and_ebp(regs.eip, regs.ebp, PERF_EVENT_SAMPLE, 0, 0);
|
||||
}
|
||||
|
||||
if (current_thread->tick((regs.cs & 3) == 0))
|
||||
|
|
Loading…
Add table
Reference in a new issue