mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
qapi: introduce x-query-jit QMP command
This is a counterpart to the HMP "info jit" command. It is being added with an "x-" prefix because this QMP command is intended as an ad hoc debugging tool and will thus not be modelled in QAPI as fully structured data, nor will it have long term guaranteed stability. The existing HMP command is rewritten to call the QMP command. Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
parent
91f2fa7045
commit
3a841ab53f
8 changed files with 140 additions and 101 deletions
88
tcg/tcg.c
88
tcg/tcg.c
|
@ -4383,7 +4383,7 @@ int tcg_gen_code(TCGContext *s, TranslationBlock *tb)
|
|||
}
|
||||
|
||||
#ifdef CONFIG_PROFILER
|
||||
void tcg_dump_info(void)
|
||||
void tcg_dump_info(GString *buf)
|
||||
{
|
||||
TCGProfile prof = {};
|
||||
const TCGProfile *s;
|
||||
|
@ -4397,53 +4397,59 @@ void tcg_dump_info(void)
|
|||
tb_div_count = tb_count ? tb_count : 1;
|
||||
tot = s->interm_time + s->code_time;
|
||||
|
||||
qemu_printf("JIT cycles %" PRId64 " (%0.3f s at 2.4 GHz)\n",
|
||||
tot, tot / 2.4e9);
|
||||
qemu_printf("translated TBs %" PRId64 " (aborted=%" PRId64
|
||||
" %0.1f%%)\n",
|
||||
tb_count, s->tb_count1 - tb_count,
|
||||
(double)(s->tb_count1 - s->tb_count)
|
||||
/ (s->tb_count1 ? s->tb_count1 : 1) * 100.0);
|
||||
qemu_printf("avg ops/TB %0.1f max=%d\n",
|
||||
(double)s->op_count / tb_div_count, s->op_count_max);
|
||||
qemu_printf("deleted ops/TB %0.2f\n",
|
||||
(double)s->del_op_count / tb_div_count);
|
||||
qemu_printf("avg temps/TB %0.2f max=%d\n",
|
||||
(double)s->temp_count / tb_div_count, s->temp_count_max);
|
||||
qemu_printf("avg host code/TB %0.1f\n",
|
||||
(double)s->code_out_len / tb_div_count);
|
||||
qemu_printf("avg search data/TB %0.1f\n",
|
||||
(double)s->search_out_len / tb_div_count);
|
||||
g_string_append_printf(buf, "JIT cycles %" PRId64
|
||||
" (%0.3f s at 2.4 GHz)\n",
|
||||
tot, tot / 2.4e9);
|
||||
g_string_append_printf(buf, "translated TBs %" PRId64
|
||||
" (aborted=%" PRId64 " %0.1f%%)\n",
|
||||
tb_count, s->tb_count1 - tb_count,
|
||||
(double)(s->tb_count1 - s->tb_count)
|
||||
/ (s->tb_count1 ? s->tb_count1 : 1) * 100.0);
|
||||
g_string_append_printf(buf, "avg ops/TB %0.1f max=%d\n",
|
||||
(double)s->op_count / tb_div_count, s->op_count_max);
|
||||
g_string_append_printf(buf, "deleted ops/TB %0.2f\n",
|
||||
(double)s->del_op_count / tb_div_count);
|
||||
g_string_append_printf(buf, "avg temps/TB %0.2f max=%d\n",
|
||||
(double)s->temp_count / tb_div_count,
|
||||
s->temp_count_max);
|
||||
g_string_append_printf(buf, "avg host code/TB %0.1f\n",
|
||||
(double)s->code_out_len / tb_div_count);
|
||||
g_string_append_printf(buf, "avg search data/TB %0.1f\n",
|
||||
(double)s->search_out_len / tb_div_count);
|
||||
|
||||
qemu_printf("cycles/op %0.1f\n",
|
||||
s->op_count ? (double)tot / s->op_count : 0);
|
||||
qemu_printf("cycles/in byte %0.1f\n",
|
||||
s->code_in_len ? (double)tot / s->code_in_len : 0);
|
||||
qemu_printf("cycles/out byte %0.1f\n",
|
||||
s->code_out_len ? (double)tot / s->code_out_len : 0);
|
||||
qemu_printf("cycles/search byte %0.1f\n",
|
||||
s->search_out_len ? (double)tot / s->search_out_len : 0);
|
||||
g_string_append_printf(buf, "cycles/op %0.1f\n",
|
||||
s->op_count ? (double)tot / s->op_count : 0);
|
||||
g_string_append_printf(buf, "cycles/in byte %0.1f\n",
|
||||
s->code_in_len ? (double)tot / s->code_in_len : 0);
|
||||
g_string_append_printf(buf, "cycles/out byte %0.1f\n",
|
||||
s->code_out_len ? (double)tot / s->code_out_len : 0);
|
||||
g_string_append_printf(buf, "cycles/search byte %0.1f\n",
|
||||
s->search_out_len ?
|
||||
(double)tot / s->search_out_len : 0);
|
||||
if (tot == 0) {
|
||||
tot = 1;
|
||||
}
|
||||
qemu_printf(" gen_interm time %0.1f%%\n",
|
||||
(double)s->interm_time / tot * 100.0);
|
||||
qemu_printf(" gen_code time %0.1f%%\n",
|
||||
(double)s->code_time / tot * 100.0);
|
||||
qemu_printf("optim./code time %0.1f%%\n",
|
||||
(double)s->opt_time / (s->code_time ? s->code_time : 1)
|
||||
* 100.0);
|
||||
qemu_printf("liveness/code time %0.1f%%\n",
|
||||
(double)s->la_time / (s->code_time ? s->code_time : 1) * 100.0);
|
||||
qemu_printf("cpu_restore count %" PRId64 "\n",
|
||||
s->restore_count);
|
||||
qemu_printf(" avg cycles %0.1f\n",
|
||||
s->restore_count ? (double)s->restore_time / s->restore_count : 0);
|
||||
g_string_append_printf(buf, " gen_interm time %0.1f%%\n",
|
||||
(double)s->interm_time / tot * 100.0);
|
||||
g_string_append_printf(buf, " gen_code time %0.1f%%\n",
|
||||
(double)s->code_time / tot * 100.0);
|
||||
g_string_append_printf(buf, "optim./code time %0.1f%%\n",
|
||||
(double)s->opt_time / (s->code_time ?
|
||||
s->code_time : 1)
|
||||
* 100.0);
|
||||
g_string_append_printf(buf, "liveness/code time %0.1f%%\n",
|
||||
(double)s->la_time / (s->code_time ?
|
||||
s->code_time : 1) * 100.0);
|
||||
g_string_append_printf(buf, "cpu_restore count %" PRId64 "\n",
|
||||
s->restore_count);
|
||||
g_string_append_printf(buf, " avg cycles %0.1f\n",
|
||||
s->restore_count ?
|
||||
(double)s->restore_time / s->restore_count : 0);
|
||||
}
|
||||
#else
|
||||
void tcg_dump_info(void)
|
||||
void tcg_dump_info(GString *buf)
|
||||
{
|
||||
qemu_printf("[TCG profiler not compiled]\n");
|
||||
g_string_append_printf(buf, "[TCG profiler not compiled]\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue