lkml.org 
[lkml]   [2017]   [Nov]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v3 08/11] perf stat: Allocate shadow stats buffer for threads
    Date
    After perf_evlist__create_maps() being executed, we can get all
    threads from /proc. And via thread_map__nr(), we can also get
    the number of threads.

    With the number of threads, the patch allocates a buffer which
    will record the shadow stats for these threads.

    The buffer pointer is saved in stat_config.

    Signed-off-by: Jin Yao <yao.jin@linux.intel.com>
    ---
    tools/perf/builtin-stat.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
    tools/perf/util/stat.c | 11 ++++++++---
    2 files changed, 53 insertions(+), 4 deletions(-)

    diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c
    index c7fe582..505bb89 100644
    --- a/tools/perf/builtin-stat.c
    +++ b/tools/perf/builtin-stat.c
    @@ -214,8 +214,13 @@ static inline void diff_timespec(struct timespec *r, struct timespec *a,

    static void perf_stat__reset_stats(void)
    {
    + int i;
    +
    perf_evlist__reset_stats(evsel_list);
    perf_stat__reset_shadow_stats();
    +
    + for (i = 0; i < stat_config.stats_num; i++)
    + perf_stat__reset_shadow_per_stat(&stat_config.stats[i]);
    }

    static int create_perf_stat_counter(struct perf_evsel *evsel)
    @@ -2503,6 +2508,35 @@ int process_cpu_map_event(struct perf_tool *tool,
    return set_maps(st);
    }

    +static int runtime_stat_alloc(struct perf_stat_config *config, int nthreads)
    +{
    + int i;
    +
    + config->stats = calloc(nthreads, sizeof(struct runtime_stat));
    + if (!config->stats)
    + return -1;
    +
    + config->stats_num = nthreads;
    +
    + for (i = 0; i < nthreads; i++)
    + runtime_stat__init(&config->stats[i]);
    +
    + return 0;
    +}
    +
    +static void runtime_stat_free(struct perf_stat_config *config)
    +{
    + int i;
    +
    + if (!config->stats)
    + return;
    +
    + for (i = 0; i < config->stats_num; i++)
    + runtime_stat__free(&config->stats[i]);
    +
    + free(config->stats);
    +}
    +
    static const char * const stat_report_usage[] = {
    "perf stat report [<options>]",
    NULL,
    @@ -2758,8 +2792,15 @@ int cmd_stat(int argc, const char **argv)
    * Initialize thread_map with comm names,
    * so we could print it out on output.
    */
    - if (stat_config.aggr_mode == AGGR_THREAD)
    + if (stat_config.aggr_mode == AGGR_THREAD) {
    thread_map__read_comms(evsel_list->threads);
    + if (target.system_wide) {
    + if (runtime_stat_alloc(&stat_config,
    + thread_map__nr(evsel_list->threads))) {
    + goto out;
    + }
    + }
    + }

    if (interval && interval < 100) {
    if (interval < 10) {
    @@ -2849,5 +2890,8 @@ int cmd_stat(int argc, const char **argv)
    sysfs__write_int(FREEZE_ON_SMI_PATH, 0);

    perf_evlist__delete(evsel_list);
    +
    + runtime_stat_free(&stat_config);
    +
    return status;
    }
    diff --git a/tools/perf/util/stat.c b/tools/perf/util/stat.c
    index 78abfd4..32235657 100644
    --- a/tools/perf/util/stat.c
    +++ b/tools/perf/util/stat.c
    @@ -280,9 +280,14 @@ process_counter_values(struct perf_stat_config *config, struct perf_evsel *evsel
    if (config->aggr_mode == AGGR_NONE)
    perf_stat__update_shadow_stats(evsel, count->val, cpu,
    &rt_stat);
    - if (config->aggr_mode == AGGR_THREAD)
    - perf_stat__update_shadow_stats(evsel, count->val, 0,
    - &rt_stat);
    + if (config->aggr_mode == AGGR_THREAD) {
    + if (config->stats)
    + perf_stat__update_shadow_stats(evsel,
    + count->val, 0, &config->stats[thread]);
    + else
    + perf_stat__update_shadow_stats(evsel,
    + count->val, 0, &rt_stat);
    + }
    break;
    case AGGR_GLOBAL:
    aggr->val += count->val;
    --
    2.7.4
    \
     
     \ /
      Last update: 2017-11-29 05:12    [W:2.757 / U:0.456 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site