On 10/09/18 17:34, Arnaldo Carvalho de Melo wrote:
> Em Fri, Sep 07, 2018 at 11:51:16AM +0300, Adrian Hunter escreveu:
>> Commit 1c5aae7710bb ("perf machine: Create maps for x86 PTI entry
>> trampolines") revealed a problem with maps__find_symbol_by_name() that
> 
> Can we have this with a Fixes: 1c5aae7710bb?
> 
> So that that, combined with the CC: stable, tells which stable kernels
> should get that fix, I think there are scripts harvesting Fixes: tags to
> help stable maintainers :-)

It seemed like potentially an existing issue so I did not want to limit how
far back it got applied.

> 
> - Arnaldo
> 
>> resulted in probes not being found e.g.
>>
>>      $ sudo perf probe xsk_mmap
>>      xsk_mmap is out of .text, skip it.
>>      Probe point 'xsk_mmap' not found.
>>         Error: Failed to add events.
>>
>> maps__find_symbol_by_name() can optionally return the map of the found
>> symbol. It can get the map wrong because, in fact, the symbol is found
>> on the map's dso, not allowing for the possibility that the dso has more
>> than one map. Fix by always checking the map contains the symbol.
>>
>> Reported-by: Björn Töpel <bjorn.to...@intel.com>
>> Tested-by: Björn Töpel <bjorn.to...@intel.com>
>> Cc: sta...@vger.kernel.org
>> Signed-off-by: Adrian Hunter <adrian.hun...@intel.com>
>> ---
>>
>>
>> Changes in V2:
>>
>>      Expanded commit message
>>      Corrected email address
>>
>>
>>  tools/perf/util/map.c | 11 +++++++++++
>>  1 file changed, 11 insertions(+)
>>
>> diff --git a/tools/perf/util/map.c b/tools/perf/util/map.c
>> index 3f07a587c8e6..354e54550d2b 100644
>> --- a/tools/perf/util/map.c
>> +++ b/tools/perf/util/map.c
>> @@ -574,6 +574,13 @@ struct symbol *map_groups__find_symbol(struct 
>> map_groups *mg,
>>      return NULL;
>>  }
>>  
>> +static bool map__contains_symbol(struct map *map, struct symbol *sym)
>> +{
>> +    u64 ip = map->unmap_ip(map, sym->start);
>> +
>> +    return ip >= map->start && ip < map->end;
>> +}
>> +
>>  struct symbol *maps__find_symbol_by_name(struct maps *maps, const char 
>> *name,
>>                                       struct map **mapp)
>>  {
>> @@ -589,6 +596,10 @@ struct symbol *maps__find_symbol_by_name(struct maps 
>> *maps, const char *name,
>>  
>>              if (sym == NULL)
>>                      continue;
>> +            if (!map__contains_symbol(pos, sym)) {
>> +                    sym = NULL;
>> +                    continue;
>> +            }
>>              if (mapp != NULL)
>>                      *mapp = pos;
>>              goto out;
>> -- 
>> 2.17.1
> 

Reply via email to