Commit e6a9efce authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo
Browse files

perf map: Add set_ methods for...


perf map: Add set_ methods for map->{start,end,pgoff,pgoff,reloc,erange_warned,dso,map_ip,unmap_ip,priv}

To have a way to intercept usage of the reference counted struct map.

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent e1805aae
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -191,7 +191,7 @@ static void ui__warn_map_erange(struct map *map, struct symbol *sym, u64 ip)
	if (use_browser <= 0)
		sleep(5);

	map->erange_warned = true;
	map__set_erange_warned(map, true);
}

static void perf_top__record_precise_ip(struct perf_top *top,
@@ -225,7 +225,7 @@ static void perf_top__record_precise_ip(struct perf_top *top,
		 */
		mutex_unlock(&he->hists->lock);

		if (err == -ERANGE && !he->ms.map->erange_warned)
		if (err == -ERANGE && !map__erange_warned(he->ms.map))
			ui__warn_map_erange(he->ms.map, sym, ip);
		else if (err == -ENOMEM) {
			pr_err("Not enough memory for annotating '%s' symbol!\n",
+8 −8
Original line number Diff line number Diff line
@@ -95,8 +95,8 @@ static int test__maps__merge_in(struct test_suite *t __maybe_unused, int subtest
		map = dso__new_map(bpf_progs[i].name);
		TEST_ASSERT_VAL("failed to create map", map);

		map->start = bpf_progs[i].start;
		map->end   = bpf_progs[i].end;
		map__set_start(map, bpf_progs[i].start);
		map__set_end(map, bpf_progs[i].end);
		TEST_ASSERT_VAL("failed to insert map", maps__insert(maps, map) == 0);
		map__put(map);
	}
@@ -111,16 +111,16 @@ static int test__maps__merge_in(struct test_suite *t __maybe_unused, int subtest
	TEST_ASSERT_VAL("failed to create map", map_kcore3);

	/* kcore1 map overlaps over all bpf maps */
	map_kcore1->start = 100;
	map_kcore1->end   = 1000;
	map__set_start(map_kcore1, 100);
	map__set_end(map_kcore1, 1000);

	/* kcore2 map hides behind bpf_prog_2 */
	map_kcore2->start = 550;
	map_kcore2->end   = 570;
	map__set_start(map_kcore2, 550);
	map__set_end(map_kcore2, 570);

	/* kcore3 map hides behind bpf_prog_3, kcore1 and adds new map */
	map_kcore3->start = 880;
	map_kcore3->end   = 1100;
	map__set_start(map_kcore3, 880);
	map__set_end(map_kcore3, 1100);

	ret = maps__merge_in(maps, map_kcore1);
	TEST_ASSERT_VAL("failed to merge map", !ret);
+2 −2
Original line number Diff line number Diff line
@@ -304,7 +304,7 @@ static int test__vmlinux_matches_kallsyms(struct test_suite *test __maybe_unused
								dso->short_name :
								dso->name));
		if (pair) {
			pair->priv = 1;
			map__set_priv(pair, 1);
		} else {
			if (!header_printed) {
				pr_info("WARN: Maps only in vmlinux:\n");
@@ -340,7 +340,7 @@ static int test__vmlinux_matches_kallsyms(struct test_suite *test __maybe_unused
				pr_info(":\nWARN: *%" PRIx64 "-%" PRIx64 " %" PRIx64,
					map__start(pair), map__end(pair), map__pgoff(pair));
			pr_info(" %s\n", dso->name);
			pair->priv = 1;
			map__set_priv(pair, 1);
		}
	}

+12 −11
Original line number Diff line number Diff line
@@ -910,8 +910,8 @@ static int machine__process_ksymbol_register(struct machine *machine,
			dso__set_loaded(dso);
		}

		map->start = event->ksymbol.addr;
		map->end = map__start(map) + event->ksymbol.len;
		map__set_start(map, event->ksymbol.addr);
		map__set_end(map, map__start(map) + event->ksymbol.len);
		err = maps__insert(machine__kernel_maps(machine), map);
		if (err) {
			err = -ENOMEM;
@@ -1218,8 +1218,8 @@ int machine__create_extra_kernel_map(struct machine *machine,
	if (!map)
		return -ENOMEM;

	map->end   = xm->end;
	map->pgoff = xm->pgoff;
	map__set_end(map, xm->end);
	map__set_pgoff(map, xm->pgoff);

	kmap = map__kmap(map);

@@ -1291,7 +1291,7 @@ int machine__map_x86_64_entry_trampolines(struct machine *machine,

		dest_map = maps__find(kmaps, map__pgoff(map));
		if (dest_map != map)
			map->pgoff = map__map_ip(dest_map, map__pgoff(map));
			map__set_pgoff(map, map__map_ip(dest_map, map__pgoff(map)));
		found = true;
	}
	if (found || machine->trampolines_mapped)
@@ -1342,7 +1342,8 @@ __machine__create_kernel_maps(struct machine *machine, struct dso *kernel)
	if (machine->vmlinux_map == NULL)
		return -ENOMEM;

	machine->vmlinux_map->map_ip = machine->vmlinux_map->unmap_ip = identity__map_ip;
	map__set_map_ip(machine->vmlinux_map, identity__map_ip);
	map__set_unmap_ip(machine->vmlinux_map, identity__map_ip);
	return maps__insert(machine__kernel_maps(machine), machine->vmlinux_map);
}

@@ -1623,7 +1624,7 @@ static int machine__create_module(void *arg, const char *name, u64 start,
	map = machine__addnew_module_map(machine, start, name);
	if (map == NULL)
		return -1;
	map->end = start + size;
	map__set_end(map, start + size);

	dso__kernel_module_get_build_id(map__dso(map), machine->root_dir);
	map__put(map);
@@ -1659,14 +1660,14 @@ static int machine__create_modules(struct machine *machine)
static void machine__set_kernel_mmap(struct machine *machine,
				     u64 start, u64 end)
{
	machine->vmlinux_map->start = start;
	machine->vmlinux_map->end   = end;
	map__set_start(machine->vmlinux_map, start);
	map__set_end(machine->vmlinux_map, end);
	/*
	 * Be a bit paranoid here, some perf.data file came with
	 * a zero sized synthesized MMAP event for the kernel.
	 */
	if (start == 0 && end == 0)
		machine->vmlinux_map->end = ~0ULL;
		map__set_end(machine->vmlinux_map, ~0ULL);
}

static int machine__update_kernel_mmap(struct machine *machine,
@@ -1810,7 +1811,7 @@ static int machine__process_kernel_mmap_event(struct machine *machine,
		if (map == NULL)
			goto out_problem;

		map->end = map__start(map) + xm->end - xm->start;
		map__set_end(map, map__start(map) + xm->end - xm->start);

		if (build_id__is_defined(bid))
			dso__set_build_id(map__dso(map), bid);
+10 −10
Original line number Diff line number Diff line
@@ -104,14 +104,14 @@ static inline bool replace_android_lib(const char *filename, char *newfilename)

void map__init(struct map *map, u64 start, u64 end, u64 pgoff, struct dso *dso)
{
	map->start    = start;
	map->end      = end;
	map->pgoff    = pgoff;
	map->reloc    = 0;
	map->dso      = dso__get(dso);
	map->map_ip   = map__dso_map_ip;
	map->unmap_ip = map__dso_unmap_ip;
	map->erange_warned = false;
	map__set_start(map, start);
	map__set_end(map, end);
	map__set_pgoff(map, pgoff);
	map__set_reloc(map, 0);
	map__set_dso(map, dso__get(dso));
	map__set_map_ip(map, map__dso_map_ip);
	map__set_unmap_ip(map, map__dso_unmap_ip);
	map__set_erange_warned(map, false);
	refcount_set(map__refcnt(map), 1);
}

@@ -317,7 +317,7 @@ void map__fixup_start(struct map *map)
	if (nd != NULL) {
		struct symbol *sym = rb_entry(nd, struct symbol, rb_node);

		map->start = sym->start;
		map__set_start(map, sym->start);
	}
}

@@ -329,7 +329,7 @@ void map__fixup_end(struct map *map)

	if (nd != NULL) {
		struct symbol *sym = rb_entry(nd, struct symbol, rb_node);
		map->end = sym->end;
		map__set_end(map, sym->end);
	}
}

Loading