qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v14 06/10] monitor: adding tb_stats hmp command


From: Wu, Fei
Subject: Re: [PATCH v14 06/10] monitor: adding tb_stats hmp command
Date: Thu, 1 Jun 2023 15:20:36 +0800
User-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.11.0

On 6/1/2023 9:23 AM, Richard Henderson wrote:
> On 5/30/23 01:35, Fei Wu wrote:
>> From: "Vanderson M. do Rosario" <vandersonmr2@gmail.com>
>>
>> Adding tb_stats [start|pause|stop|filter] command to hmp.
>> This allows controlling the collection of statistics.
>> It is also possible to set the level of collection:
>> all, jit, or exec.
>>
>> tb_stats filter allow to only collect statistics for the TB
>> in the last_search list.
>>
>> The goal of this command is to allow the dynamic exploration
>> of the TCG behavior and quality. Therefore, for now, a
>> corresponding QMP command is not worthwhile.
>>
>> Acked-by: Dr. David Alan Gilbert <dgilbert@redhat.com>
>> Signed-off-by: Vanderson M. do Rosario <vandersonmr2@gmail.com>
>> Message-Id: <20190829173437.5926-8-vandersonmr2@gmail.com>
>> Message-Id: <20190829173437.5926-9-vandersonmr2@gmail.com>
>> [AJB: fix authorship]
>> Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
>> Signed-off-by: Fei Wu <fei2.wu@intel.com>
>> ---
> 
> 
> I still don't see what pause does.
> 
maybe it's necessary to discuss the user scenario, I suppose the
original design is for this case:
* start
* pause - there are some interesting stats we want to keep
* not interested timeline
* start again - continue to investigate the interesting ones

>> diff --git a/accel/tcg/tb-stats.c b/accel/tcg/tb-stats.c
>> index 68ac7d3f73..805e1fc74d 100644
>> --- a/accel/tcg/tb-stats.c
>> +++ b/accel/tcg/tb-stats.c
>> @@ -16,18 +16,20 @@
>>   #include "qemu/timer.h"
>>     #include "exec/tb-stats.h"
>> +#include "exec/tb-flush.h"
>>   #include "tb-context.h"
>>     /* TBStatistic collection controls */
>>   enum TBStatsStatus {
>>       TB_STATS_DISABLED = 0,
>>       TB_STATS_RUNNING,
>> -    TB_STATS_PAUSED,
>> -    TB_STATS_STOPPED
>> +    TB_STATS_PAUSED
>>   };
> 
> Why?
> 
STOPPED is the same as DISABLED.

>>     static enum TBStatsStatus tcg_collect_tb_stats;
>>   static uint32_t default_tbstats_flag;
>> +/* only accessed in safe work */
>> +static GList *last_search;
>>     uint64_t dev_time;
>>   @@ -170,6 +172,101 @@ void dump_jit_profile_info(TCGProfile *s,
>> GString *buf)
>>       g_free(jpi);
>>   }
>>   +static void free_tbstats(void *p, uint32_t hash, void *userp)
>> +{
>> +    g_free(p);
>> +}
>> +
>> +static void clean_tbstats(void)
>> +{
>> +    /* remove all tb_stats */
>> +    qht_iter(&tb_ctx.tb_stats, free_tbstats, NULL);
>> +    qht_destroy(&tb_ctx.tb_stats);
>> +}
>> +
>> +void do_hmp_tbstats_safe(CPUState *cpu, run_on_cpu_data icmd)
>> +{
>> +    struct TbstatsCommand *cmdinfo = icmd.host_ptr;
>> +    int cmd = cmdinfo->cmd;
>> +    uint32_t level = cmdinfo->level;
>> +
>> +    switch (cmd) {
>> +    case START:
>> +        if (tb_stats_collection_enabled()) {
>> +            qemu_printf("TB information already being recorded");
>> +            return;
>> +        } else if (tb_stats_collection_paused()) {
>> +            set_tbstats_flags(level);
>> +        } else {
>> +            qht_init(&tb_ctx.tb_stats, tb_stats_cmp,
>> CODE_GEN_HTABLE_SIZE,
>> +                     QHT_MODE_AUTO_RESIZE);
>> +        }
>> +
>> +        set_default_tbstats_flag(level);
>> +        enable_collect_tb_stats();
>> +        tb_flush(cpu);
>> +        break;
>> +    case PAUSE:
>> +        if (!tb_stats_collection_enabled()) {
>> +            qemu_printf("TB information not being recorded");
>> +            return;
>> +        }
>> +
>> +        /*
>> +         * Continue to create TBStatistic structures but stop collecting
>> +         * statistics
>> +         */
>> +        pause_collect_tb_stats();
>> +        set_default_tbstats_flag(TB_NOTHING);
>> +        set_tbstats_flags(TB_PAUSED);
>> +        tb_flush(cpu);
>> +        break;
>> +    case STOP:
>> +        if (tb_stats_collection_disabled()) {
>> +            qemu_printf("TB information not being recorded");
>> +            return;
>> +        }
>> +
>> +        /* Dissalloc all TBStatistics structures and stop creating
>> new ones */
>> +        disable_collect_tb_stats();
>> +        clean_tbstats();
>> +        tb_flush(cpu);
>> +        break;
>> +    case FILTER:
>> +        if (!tb_stats_collection_enabled()) {
>> +            qemu_printf("TB information not being recorded");
>> +            return;
>> +        }
>> +        if (!last_search) {
>> +            qemu_printf(
>> +                    "no search on record! execute info tbs before
>> filtering!");
>> +            return;
>> +        }
>> +
>> +        set_default_tbstats_flag(TB_NOTHING);
>> +
>> +        /*
>> +         * Set all tbstats as paused, then return only the ones from
>> last_search
>> +         */
>> +        pause_collect_tb_stats();
>> +        set_tbstats_flags(TB_PAUSED);
>> +
>> +        for (GList *iter = last_search; iter; iter =
>> g_list_next(iter)) {
>> +            TBStatistics *tbs = iter->data;
>> +            tbs->stats_enabled = level;
>> +        }
>> +
>> +        tb_flush(cpu);
>> +
>> +        break;
>> +    default: /* INVALID */
>> +        g_assert_not_reached();
>> +        break;
>> +    }
>> +
>> +    g_free(cmdinfo);
>> +}
> 
> Why isn't all of this in monitor.c?
> It's not used or usable from user-only mode.
> 
closer to tb-stats, or closer to monitor? It seems to me monitor.c only
contains the shim layer of qmp/hmp, the real stuffs which are large
enough are put together with their logic part, e.g. dump_exec_info().

Thanks,
Fei.

>> +void set_tbstats_flags(uint32_t flag)
>> +{
>> +    /* iterate over tbstats setting their flag as TB_NOTHING */
>> +    qht_iter(&tb_ctx.tb_stats, reset_tbstats_flag, &flag);
>> +}
> 
> Again, I question why a global variable is not more appropriate.
> 
> 
> r~




reply via email to

[Prev in Thread] Current Thread [Next in Thread]