Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f77b57ad authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo
Browse files

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: default avatarJiri Olsa <jolsa@kernel.org>
Tested-by: default avatarKan 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: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 6c872901
Loading
Loading
Loading
Loading
+21 −4
Original line number Original line Diff line number Diff line
@@ -6,12 +6,13 @@ static int process_event_mask(struct perf_tool *tool __maybe_unused,
			 struct perf_sample *sample __maybe_unused,
			 struct perf_sample *sample __maybe_unused,
			 struct machine *machine __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_mask *mask;
	struct cpu_map_data *data;
	struct cpu_map_data *data;
	struct cpu_map *map;
	int i;
	int i;


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


	TEST_ASSERT_VAL("wrong type", data->type == PERF_CPU_MAP__MASK);
	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));
		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;
	return 0;
}
}


@@ -31,11 +40,12 @@ static int process_event_cpus(struct perf_tool *tool __maybe_unused,
			 struct perf_sample *sample __maybe_unused,
			 struct perf_sample *sample __maybe_unused,
			 struct machine *machine __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_entries *cpus;
	struct cpu_map_data *data;
	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);
	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 nr",   cpus->nr == 2);
	TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[0] == 1);
	TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[0] == 1);
	TEST_ASSERT_VAL("wrong cpu",  cpus->cpu[1] == 256);
	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;
	return 0;
}
}


+42 −0
Original line number Original line Diff line number Diff line
@@ -5,6 +5,7 @@
#include <assert.h>
#include <assert.h>
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdlib.h>
#include <linux/bitmap.h>
#include "asm/bug.h"
#include "asm/bug.h"


static struct cpu_map *cpu_map__default_new(void)
static struct cpu_map *cpu_map__default_new(void)
@@ -179,6 +180,47 @@ struct cpu_map *cpu_map__new(const char *cpu_list)
	return cpus;
	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)
size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp)
{
{
	int i;
	int i;
+1 −0
Original line number Original line Diff line number Diff line
@@ -17,6 +17,7 @@ struct cpu_map {
struct cpu_map *cpu_map__new(const char *cpu_list);
struct cpu_map *cpu_map__new(const char *cpu_list);
struct cpu_map *cpu_map__empty_new(int nr);
struct cpu_map *cpu_map__empty_new(int nr);
struct cpu_map *cpu_map__dummy_new(void);
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);
struct cpu_map *cpu_map__read(FILE *file);
size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
size_t cpu_map__fprintf(struct cpu_map *map, FILE *fp);
int cpu_map__get_socket_id(int cpu);
int cpu_map__get_socket_id(int cpu);