perf cpu_map: Add cpu_map__new_event function
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>
This commit is contained in:
parent
6c872901af
commit
f77b57ad4f
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue