Message ID | 20190614135332.12777-4-vandersonmr2@gmail.com |
---|---|
State | New |
Headers | show |
Series | Collecting TB Execution Frequency | expand |
On 6/14/19 6:53 AM, vandersonmr wrote: > Added -execfreq to enable execution frequency counting and dump > all the TB's addresses and their execution frequency at the end > of the execution. > > Signed-off-by: vandersonmr <vandersonmr2@gmail.com> > --- > linux-user/exit.c | 5 +++++ > linux-user/main.c | 7 +++++++ > 2 files changed, 12 insertions(+) > > diff --git a/linux-user/exit.c b/linux-user/exit.c > index bdda720553..0c6a2f2d5b 100644 > --- a/linux-user/exit.c > +++ b/linux-user/exit.c > @@ -26,8 +26,13 @@ > extern void __gcov_dump(void); > #endif > > +extern bool enable_freq_count; A third declaration. r~
[added Markus to Cc for his view on options] vandersonmr <vandersonmr2@gmail.com> writes: > Added -execfreq to enable execution frequency counting and dump > all the TB's addresses and their execution frequency at the end > of the execution. > > Signed-off-by: vandersonmr <vandersonmr2@gmail.com> This works well enough but we are going to need a way to enable this for softmmu as well. The preference for that is to add a option group to qemu-options.hx which will allow a number of related options to be grouped together. The last thing that was added was the thread=multi flag to -accel tcg,thread=multi but unfortunately the -accel option is very much a softmmu only option group. Maybe it's time to add a -tcg option for all the various options so we can have (and are likely to add)?: -tcg tbcount=true -tcg tbcount=true,tbstats=file,file=output.txt -tcg tbcount=true,tbstats=chardev,id=statschar There are going to future enhancements we might consider: -tcg jitperf=/tmp/perf.map A long time in the future we may even have: -tcg multiexitblocks=true until it defaults to true and the knob is just there to turn it off. The closest example of an option group shared between linux-user and softmmu is the trace code. Both builds do a: qemu_add_opts(&qemu_trace_opts); (why can't this be done by module init code?) And then they can call the general qemu_opts parser on the top level option: trace_opt_parse(arg); So maybe we need to bite the bullet and create tcg/tcg-options.c and put our tweaking machinery in there (and the real location of enable_freq_count)? Markus do you have a view? > --- > linux-user/exit.c | 5 +++++ > linux-user/main.c | 7 +++++++ > 2 files changed, 12 insertions(+) > > diff --git a/linux-user/exit.c b/linux-user/exit.c > index bdda720553..0c6a2f2d5b 100644 > --- a/linux-user/exit.c > +++ b/linux-user/exit.c > @@ -26,8 +26,13 @@ > extern void __gcov_dump(void); > #endif > > +extern bool enable_freq_count; > + > void preexit_cleanup(CPUArchState *env, int code) > { > + if (enable_freq_count) { > + tb_dump_all_exec_freq(); > + } > #ifdef TARGET_GPROF > _mcleanup(); > #endif > diff --git a/linux-user/main.c b/linux-user/main.c > index 1bf7155670..ece2d8bd8b 100644 > --- a/linux-user/main.c > +++ b/linux-user/main.c > @@ -388,6 +388,11 @@ static void handle_arg_trace(const char *arg) > trace_file = trace_opt_parse(arg); > } > > +static void handle_arg_execfreq(const char *arg) > +{ > + enable_freq_count = true; > +} > + > struct qemu_argument { > const char *argv; > const char *env; > @@ -439,6 +444,8 @@ static const struct qemu_argument arg_table[] = { > "", "Seed for pseudo-random number generator"}, > {"trace", "QEMU_TRACE", true, handle_arg_trace, > "", "[[enable=]<pattern>][,events=<file>][,file=<file>]"}, > + {"execfreq", "QEMU_EXEC_FREQ", false, handle_arg_execfreq, > + "", "enable and dump TB's execution frequency counting"}, > {"version", "QEMU_VERSION", false, handle_arg_version, > "", "display version information and exit"}, > {NULL, NULL, false, NULL, NULL, NULL} -- Alex Bennée
diff --git a/linux-user/exit.c b/linux-user/exit.c index bdda720553..0c6a2f2d5b 100644 --- a/linux-user/exit.c +++ b/linux-user/exit.c @@ -26,8 +26,13 @@ extern void __gcov_dump(void); #endif +extern bool enable_freq_count; + void preexit_cleanup(CPUArchState *env, int code) { + if (enable_freq_count) { + tb_dump_all_exec_freq(); + } #ifdef TARGET_GPROF _mcleanup(); #endif diff --git a/linux-user/main.c b/linux-user/main.c index 1bf7155670..ece2d8bd8b 100644 --- a/linux-user/main.c +++ b/linux-user/main.c @@ -388,6 +388,11 @@ static void handle_arg_trace(const char *arg) trace_file = trace_opt_parse(arg); } +static void handle_arg_execfreq(const char *arg) +{ + enable_freq_count = true; +} + struct qemu_argument { const char *argv; const char *env; @@ -439,6 +444,8 @@ static const struct qemu_argument arg_table[] = { "", "Seed for pseudo-random number generator"}, {"trace", "QEMU_TRACE", true, handle_arg_trace, "", "[[enable=]<pattern>][,events=<file>][,file=<file>]"}, + {"execfreq", "QEMU_EXEC_FREQ", false, handle_arg_execfreq, + "", "enable and dump TB's execution frequency counting"}, {"version", "QEMU_VERSION", false, handle_arg_version, "", "display version information and exit"}, {NULL, NULL, false, NULL, NULL, NULL}
Added -execfreq to enable execution frequency counting and dump all the TB's addresses and their execution frequency at the end of the execution. Signed-off-by: vandersonmr <vandersonmr2@gmail.com> --- linux-user/exit.c | 5 +++++ linux-user/main.c | 7 +++++++ 2 files changed, 12 insertions(+)