mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-08 10:13:56 -06:00
tcg: distribute tcg_time into TCG contexts
When we implemented per-vCPU TCG contexts, we forgot to also distribute the tcg_time counter, which has remained as a global accessed without any serialization, leading to potentially missed counts. Fix it by distributing the field over the TCG contexts, embedding it into TCGProfile with a field called "cpu_exec_time", which is more descriptive than "tcg_time". Add a function to query this value directly, and for completeness, fill in the field in tcg_profile_snapshot, even though its callers do not use it. Signed-off-by: Emilio G. Cota <cota@braap.org> Message-Id: <20181010144853.13005-5-cota@braap.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
dd1d7da23b
commit
72fd2efbbd
5 changed files with 37 additions and 5 deletions
23
tcg/tcg.c
23
tcg/tcg.c
|
@ -30,6 +30,7 @@
|
|||
/* Define to jump the ELF file used to communicate with GDB. */
|
||||
#undef DEBUG_JIT
|
||||
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/host-utils.h"
|
||||
#include "qemu/timer.h"
|
||||
|
@ -3361,6 +3362,7 @@ void tcg_profile_snapshot(TCGProfile *prof, bool counters, bool table)
|
|||
const TCGProfile *orig = &s->prof;
|
||||
|
||||
if (counters) {
|
||||
PROF_ADD(prof, orig, cpu_exec_time);
|
||||
PROF_ADD(prof, orig, tb_count1);
|
||||
PROF_ADD(prof, orig, tb_count);
|
||||
PROF_ADD(prof, orig, op_count);
|
||||
|
@ -3412,11 +3414,32 @@ void tcg_dump_op_count(FILE *f, fprintf_function cpu_fprintf)
|
|||
prof.table_op_count[i]);
|
||||
}
|
||||
}
|
||||
|
||||
int64_t tcg_cpu_exec_time(void)
|
||||
{
|
||||
unsigned int n_ctxs = atomic_read(&n_tcg_ctxs);
|
||||
unsigned int i;
|
||||
int64_t ret = 0;
|
||||
|
||||
for (i = 0; i < n_ctxs; i++) {
|
||||
const TCGContext *s = atomic_read(&tcg_ctxs[i]);
|
||||
const TCGProfile *prof = &s->prof;
|
||||
|
||||
ret += atomic_read(&prof->cpu_exec_time);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
#else
|
||||
void tcg_dump_op_count(FILE *f, fprintf_function cpu_fprintf)
|
||||
{
|
||||
cpu_fprintf(f, "[TCG profiler not compiled]\n");
|
||||
}
|
||||
|
||||
int64_t tcg_cpu_exec_time(void)
|
||||
{
|
||||
error_report("%s: TCG profiler not compiled", __func__);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue