On Wed, Jan 9, 2013 at 5:55 PM, Jiri Olsa <jo...@redhat.com> wrote:
> On Mon, Jan 07, 2013 at 07:27:50PM +0100, Stephane Eranian wrote:
>
> SNIP
>
>>
>> +static void ip__resolve_data(struct machine *self, struct thread *thread,
>> +                          u8 m,
>> +                         struct addr_map_symbol *ams,
>> +                         u64 addr)
>> +{
>> +     struct addr_location al;
>> +
>> +     memset(&al, 0, sizeof(al));
>> +
>> +     thread__find_addr_location(thread, self, m, MAP__VARIABLE, addr, &al,
>> +                                NULL);
>> +     ams->addr = addr;
>> +     ams->al_addr = al.addr;
>> +     ams->sym = al.sym;
>> +     ams->map = al.map;
>> +}
>> +
>> +struct mem_info *machine__resolve_mem(struct machine *self,
>> +                                   struct thread *thr,
>> +                                   struct perf_sample *sample,
>> +                                   u8 cpumode)
>> +{
>> +     struct mem_info *mi;
>> +
>> +     mi = calloc(1, sizeof(struct mem_info));
>> +     if (!mi)
>> +             return NULL;
>> +
>> +     ip__resolve_ams(self, thr, &mi->iaddr, sample->ip);
>> +     ip__resolve_data(self, thr, cpumode, &mi->daddr, sample->addr);
>> +     mi->cost = sample->weight;
>> +     mi->dsrc.val = sample->dsrc;
>> +
>> +     return mi;
>> +}
>> +
>
> The crash I report is due to the some maps could be removed
> via map_groups__fixup_overlappings.
>
> Attached patch makes the code working for me, but we might
> want to have some global unified fix for that, since this
> is not the only place suffering for that.
>
> Like globaly set map->referenced in add_hist_entry or
> hist_entry__new functions..
>
>
Would something like that work for you (untested)?

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 7034500..fc05b9f 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -274,6 +274,12 @@ static struct hist_entry *hist_entry__new(struct
hist_entry *template)

                if (he->ms.map)
                        he->ms.map->referenced = true;
+               if (he->mem_info) {
+                       if (he->mem_info->iaddr.map)
+                               he->mem_info->iaddr.map->referenced = true;
+                       if (he->mem_info->daddr.map)
+                               he->mem_info->daddr.map->referenced = true;
+               }
                if (symbol_conf.use_callchain)
                        callchain_init(he->callchain);
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to