lkml.org 
[lkml]   [2015]   [Dec]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 07/43] perf cpu_map: Add cpu_map__new_event function
    Date
    From: Jiri Olsa <jolsa@kernel.org>

    Introducing the cpu_map__new_event function to create a struct cpu_map
    object from a cpu_map event.

    Signed-off-by: Jiri Olsa <jolsa@kernel.org>
    Tested-by: Kan Liang <kan.liang@intel.com>
    Cc: David Ahern <dsahern@gmail.com>
    Cc: Namhyung Kim <namhyung@kernel.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Link: http://lkml.kernel.org/r/1445784728-21732-10-git-send-email-jolsa@kernel.org
    Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
    ---
    tools/perf/tests/cpumap.c | 25 +++++++++++++++++++++----
    tools/perf/util/cpumap.c | 42 ++++++++++++++++++++++++++++++++++++++++++
    tools/perf/util/cpumap.h | 1 +
    3 files changed, 64 insertions(+), 4 deletions(-)

    diff --git a/tools/perf/tests/cpumap.c b/tools/perf/tests/cpumap.c
    index 715480558088..4cb6418a8ffc 100644
    --- a/tools/perf/tests/cpumap.c
    +++ b/tools/perf/tests/cpumap.c
    @@ -6,12 +6,13 @@ static int process_event_mask(struct perf_tool *tool __maybe_unused,
    struct perf_sample *sample __maybe_unused,
    struct machine *machine __maybe_unused)
    {
    - struct cpu_map_event *map = &event->cpu_map;
    + struct cpu_map_event *map_event = &event->cpu_map;
    struct cpu_map_mask *mask;
    struct cpu_map_data *data;
    + struct cpu_map *map;
    int i;

    - data = &map->data;
    + data = &map_event->data;

    TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK);

    @@ -23,6 +24,14 @@ static int process_event_mask(struct perf_tool *tool __maybe_unused,
    TEST_ASSERT_VAL("wrong cpu", test_bit(i, mask->mask));
    }

    + map = cpu_map__new_data(data);
    + TEST_ASSERT_VAL("wrong nr", map->nr == 20);
    +
    + for (i = 0; i < 20; i++) {
    + TEST_ASSERT_VAL("wrong cpu", map->map[i] == i);
    + }
    +
    + cpu_map__put(map);
    return 0;
    }

    @@ -31,11 +40,12 @@ static int process_event_cpus(struct perf_tool *tool __maybe_unused,
    struct perf_sample *sample __maybe_unused,
    struct machine *machine __maybe_unused)
    {
    - struct cpu_map_event *map = &event->cpu_map;
    + struct cpu_map_event *map_event = &event->cpu_map;
    struct cpu_map_entries *cpus;
    struct cpu_map_data *data;
    + struct cpu_map *map;

    - data = &map->data;
    + data = &map_event->data;

    TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__CPUS);

    @@ -44,6 +54,13 @@ static int process_event_cpus(struct perf_tool *tool __maybe_unused,
    TEST_ASSERT_VAL("wrong nr", cpus->nr == 2);
    TEST_ASSERT_VAL("wrong cpu", cpus->cpu[0] == 1);
    TEST_ASSERT_VAL("wrong cpu", cpus->cpu[1] == 256);
    +
    + map = cpu_map__new_data(data);
    + TEST_ASSERT_VAL("wrong nr", map->nr == 2);
    + TEST_ASSERT_VAL("wrong cpu", map->map[0] == 1);
    + TEST_ASSERT_VAL("wrong cpu", map->map[1] == 256);
    + TEST_ASSERT_VAL("wrong refcnt", atomic_read(&map->refcnt) == 1);
    + cpu_map__put(map);
    return 0;
    }

    diff --git a/tools/perf/util/cpumap.c b/tools/perf/util/cpumap.c
    index 10af1e7524fb..a0717b93d8f5 100644
    --- a/tools/perf/util/cpumap.c
    +++ b/tools/perf/util/cpumap.c
    @@ -5,6 +5,7 @@
    #include <assert.h>
    #include <stdio.h>
    #include <stdlib.h>
    +#include <linux/bitmap.h>
    #include "asm/bug.h"

    static struct cpu_map *cpu_map__default_new(void)
    @@ -179,6 +180,47 @@ out:
    return cpus;
    }

    +static struct cpu_map *cpu_map__from_entries(struct cpu_map_entries *cpus)
    +{
    + struct cpu_map *map;
    +
    + map = cpu_map__empty_new(cpus->nr);
    + if (map) {
    + unsigned i;
    +
    + for (i = 0; i < cpus->nr; i++)
    + map->map[i] = (int)cpus->cpu[i];
    + }
    +
    + return map;
    +}
    +
    +static struct cpu_map *cpu_map__from_mask(struct cpu_map_mask *mask)
    +{
    + struct cpu_map *map;
    + int nr, nbits = mask->nr * mask->long_size * BITS_PER_BYTE;
    +
    + nr = bitmap_weight(mask->mask, nbits);
    +
    + map = cpu_map__empty_new(nr);
    + if (map) {
    + int cpu, i = 0;
    +
    + for_each_set_bit(cpu, mask->mask, nbits)
    + map->map[i++] = cpu;
    + }
    + return map;
    +
    +}
    +
    +struct cpu_map *cpu_map__new_data(struct cpu_map_data *data)
    +{
    + if (data->type == PERF_CPU_MAP__CPUS)
    + return cpu_map__from_entries((struct cpu_map_entries *)data->data);
    + else
    + return cpu_map__from_mask((struct cpu_map_mask *)data->data);
    +}
    +
    size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp)
    {
    int i;
    diff --git a/tools/perf/util/cpumap.h b/tools/perf/util/cpumap.h
    index 85f7772457fa..71c41b9efabb 100644
    --- a/tools/perf/util/cpumap.h
    +++ b/tools/perf/util/cpumap.h
    @@ -17,6 +17,7 @@ struct cpu_map {
    struct cpu_map *cpu_map__new(const char *cpu_list);
    struct cpu_map *cpu_map__empty_new(int nr);
    struct cpu_map *cpu_map__dummy_new(void);
    +struct cpu_map *cpu_map__new_data(struct cpu_map_data *data);
    struct cpu_map *cpu_map__read(FILE *file);
    size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
    int cpu_map__get_socket_id(int cpu);
    --
    2.1.0


    \
     
     \ /
      Last update: 2015-12-17 21:21    [W:2.476 / U:0.688 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site