diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2010-03-05 09:54:02 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2010-03-10 07:52:25 -0500 |
| commit | 1224550969e0bf18785786a1a9f801cd86d68586 (patch) | |
| tree | 1727a375d012ccb2968e6e5c126767e49f9c226c /tools/perf/util/thread.c | |
| parent | d4944a06666054707d23e11888e480af239e5abf (diff) | |
perf tools: Don't trow away old map slices not overlapped by new maps
Signed-off-by: Arnaldo 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: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util/thread.c')
| -rw-r--r-- | tools/perf/util/thread.c | 35 |
1 files changed, 32 insertions, 3 deletions
diff --git a/tools/perf/util/thread.c b/tools/perf/util/thread.c index 21b92162282..9024fa1ff5c 100644 --- a/tools/perf/util/thread.c +++ b/tools/perf/util/thread.c | |||
| @@ -183,8 +183,8 @@ struct thread *perf_session__findnew(struct perf_session *self, pid_t pid) | |||
| 183 | return th; | 183 | return th; |
| 184 | } | 184 | } |
| 185 | 185 | ||
| 186 | static void map_groups__remove_overlappings(struct map_groups *self, | 186 | static int map_groups__fixup_overlappings(struct map_groups *self, |
| 187 | struct map *map) | 187 | struct map *map) |
| 188 | { | 188 | { |
| 189 | struct rb_root *root = &self->maps[map->type]; | 189 | struct rb_root *root = &self->maps[map->type]; |
| 190 | struct rb_node *next = rb_first(root); | 190 | struct rb_node *next = rb_first(root); |
| @@ -209,7 +209,36 @@ static void map_groups__remove_overlappings(struct map_groups *self, | |||
| 209 | * list. | 209 | * list. |
| 210 | */ | 210 | */ |
| 211 | list_add_tail(&pos->node, &self->removed_maps[map->type]); | 211 | list_add_tail(&pos->node, &self->removed_maps[map->type]); |
| 212 | /* | ||
| 213 | * Now check if we need to create new maps for areas not | ||
| 214 | * overlapped by the new map: | ||
| 215 | */ | ||
| 216 | if (map->start > pos->start) { | ||
| 217 | struct map *before = map__clone(pos); | ||
| 218 | |||
| 219 | if (before == NULL) | ||
| 220 | return -ENOMEM; | ||
| 221 | |||
| 222 | before->end = map->start - 1; | ||
| 223 | map_groups__insert(self, before); | ||
| 224 | if (verbose >= 2) | ||
| 225 | map__fprintf(before, stderr); | ||
| 226 | } | ||
| 227 | |||
| 228 | if (map->end < pos->end) { | ||
| 229 | struct map *after = map__clone(pos); | ||
| 230 | |||
| 231 | if (after == NULL) | ||
| 232 | return -ENOMEM; | ||
| 233 | |||
| 234 | after->start = map->end + 1; | ||
| 235 | map_groups__insert(self, after); | ||
| 236 | if (verbose >= 2) | ||
| 237 | map__fprintf(after, stderr); | ||
| 238 | } | ||
| 212 | } | 239 | } |
| 240 | |||
| 241 | return 0; | ||
| 213 | } | 242 | } |
| 214 | 243 | ||
| 215 | void maps__insert(struct rb_root *maps, struct map *map) | 244 | 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 | 283 | ||
| 255 | void thread__insert_map(struct thread *self, struct map *map) | 284 | void thread__insert_map(struct thread *self, struct map *map) |
| 256 | { | 285 | { |
| 257 | map_groups__remove_overlappings(&self->mg, map); | 286 | map_groups__fixup_overlappings(&self->mg, map); |
| 258 | map_groups__insert(&self->mg, map); | 287 | map_groups__insert(&self->mg, map); |
| 259 | } | 288 | } |
| 260 | 289 | ||
