Commit 12245509 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar

perf tools: Don't trow away old map slices not overlapped by new maps

Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: David S. Miller <davem@davemloft.net>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1267800842-22324-1-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent d4944a06
...@@ -183,8 +183,8 @@ struct thread *perf_session__findnew(struct perf_session *self, pid_t pid) ...@@ -183,8 +183,8 @@ struct thread *perf_session__findnew(struct perf_session *self, pid_t pid)
return th; return th;
} }
static void map_groups__remove_overlappings(struct map_groups *self, static int map_groups__fixup_overlappings(struct map_groups *self,
struct map *map) struct map *map)
{ {
struct rb_root *root = &self->maps[map->type]; struct rb_root *root = &self->maps[map->type];
struct rb_node *next = rb_first(root); struct rb_node *next = rb_first(root);
...@@ -209,7 +209,36 @@ static void map_groups__remove_overlappings(struct map_groups *self, ...@@ -209,7 +209,36 @@ static void map_groups__remove_overlappings(struct map_groups *self,
* list. * list.
*/ */
list_add_tail(&pos->node, &self->removed_maps[map->type]); list_add_tail(&pos->node, &self->removed_maps[map->type]);
/*
* Now check if we need to create new maps for areas not
* overlapped by the new map:
*/
if (map->start > pos->start) {
struct map *before = map__clone(pos);
if (before == NULL)
return -ENOMEM;
before->end = map->start - 1;
map_groups__insert(self, before);
if (verbose >= 2)
map__fprintf(before, stderr);
}
if (map->end < pos->end) {
struct map *after = map__clone(pos);
if (after == NULL)
return -ENOMEM;
after->start = map->end + 1;
map_groups__insert(self, after);
if (verbose >= 2)
map__fprintf(after, stderr);
}
} }
return 0;
} }
void maps__insert(struct rb_root *maps, struct map *map) void maps__insert(struct rb_root *maps, struct map *map)
...@@ -254,7 +283,7 @@ struct map *maps__find(struct rb_root *maps, u64 ip) ...@@ -254,7 +283,7 @@ struct map *maps__find(struct rb_root *maps, u64 ip)
void thread__insert_map(struct thread *self, struct map *map) void thread__insert_map(struct thread *self, struct map *map)
{ {
map_groups__remove_overlappings(&self->mg, map); map_groups__fixup_overlappings(&self->mg, map);
map_groups__insert(&self->mg, map); map_groups__insert(&self->mg, map);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment