perf annotate: Fix off by one symbol hist size allocation and hit accounting
We were not noticing it because symbol__inc_addr_samples was erroneously dropping samples that hit the last byte in a function. Working on a fix for a problem reported by David Miller, Stephane Eranian and Sorin Dumitru, where addresses < sym->start were causing problems, I noticed this other problem. Cc: David Ahern <dsahern@gmail.com> Cc: David Miller <davem@davemloft.net> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Sorin Dumitru <dumitru.sorin87@gmail.com> Cc: Stephane Eranian <eranian@google.com> Link: http://lkml.kernel.org/n/tip-pqjaq4cr1xs2xen73pjhbav4@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
cc96aa7a7f
Коммит
64c17be4ff
|
@ -28,8 +28,8 @@ int symbol__annotate_init(struct map *map __used, struct symbol *sym)
|
|||
int symbol__alloc_hist(struct symbol *sym)
|
||||
{
|
||||
struct annotation *notes = symbol__annotation(sym);
|
||||
size_t sizeof_sym_hist = (sizeof(struct sym_hist) +
|
||||
(sym->end - sym->start) * sizeof(u64));
|
||||
const size_t size = sym->end - sym->start + 1;
|
||||
size_t sizeof_sym_hist = (sizeof(struct sym_hist) + size * sizeof(u64));
|
||||
|
||||
notes->src = zalloc(sizeof(*notes->src) + symbol_conf.nr_events * sizeof_sym_hist);
|
||||
if (notes->src == NULL)
|
||||
|
@ -64,7 +64,7 @@ int symbol__inc_addr_samples(struct symbol *sym, struct map *map,
|
|||
|
||||
pr_debug3("%s: addr=%#" PRIx64 "\n", __func__, map->unmap_ip(map, addr));
|
||||
|
||||
if (addr >= sym->end)
|
||||
if (addr > sym->end)
|
||||
return 0;
|
||||
|
||||
offset = addr - sym->start;
|
||||
|
|
Загрузка…
Ссылка в новой задаче