seL4/include/kernel/traps.h
Kent McLeod 88a7d138c4 KernelBenchmarksTrackUtilisation: Add more stats
For each thread also track number of times scheduled, number of kernel
entries and amount of cycles spent inside the kernel.  Also add
core-wide totals for each.

Signed-off-by: Kent McLeod <Kent.Mcleod@data61.csiro.au>
2020-07-15 15:15:27 +10:00

46 lines
1.5 KiB
C

/*
* Copyright 2016, General Dynamics C4 Systems
*
* SPDX-License-Identifier: GPL-2.0-only
*/
#pragma once
#include <config.h>
#include <util.h>
#include <arch/kernel/traps.h>
#include <smp/lock.h>
/* This C function should be the first thing called from C after entry from
* assembly. It provides a single place to do any entry work that is not
* done in assembly for various reasons */
static inline void c_entry_hook(void)
{
arch_c_entry_hook();
#if defined(CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES) || defined(CONFIG_BENCHMARK_TRACK_UTILISATION)
ksEnter = timestamp();
#endif
}
/* This C function should be the last thing called from C before exiting
* the kernel (be it to assembly or returning to user space). It provides
* a place to provide any additional instrumentation or functionality
* in C before leaving the kernel */
static inline void c_exit_hook(void)
{
#ifdef CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES
benchmark_track_exit();
#endif /* CONFIG_BENCHMARK_TRACK_KERNEL_ENTRIES */
#ifdef CONFIG_BENCHMARK_TRACK_UTILISATION
if (likely(NODE_STATE(benchmark_log_utilisation_enabled))) {
timestamp_t exit = timestamp();
NODE_STATE(ksCurThread)->benchmark.number_kernel_entries++;
NODE_STATE(ksCurThread)->benchmark.kernel_utilisation += exit - ksEnter;
NODE_STATE(benchmark_kernel_number_entries)++;
NODE_STATE(benchmark_kernel_time) += exit - ksEnter;
}
#endif /* CONFIG_BENCHMARK_TRACK_UTILISATION */
arch_c_exit_hook();
}