|
@@ -175,42 +175,40 @@ static void perf_top__record_precise_ip(struct perf_top *top,
|
|
|
int counter, u64 ip)
|
|
|
{
|
|
|
struct annotation *notes;
|
|
|
- struct symbol *sym;
|
|
|
+ struct symbol *sym = he->ms.sym;
|
|
|
int err = 0;
|
|
|
|
|
|
- if (he == NULL || he->ms.sym == NULL ||
|
|
|
- ((top->sym_filter_entry == NULL ||
|
|
|
- top->sym_filter_entry->ms.sym != he->ms.sym) && use_browser != 1))
|
|
|
+ if (sym == NULL || (use_browser == 0 &&
|
|
|
+ (top->sym_filter_entry == NULL ||
|
|
|
+ top->sym_filter_entry->ms.sym != sym)))
|
|
|
return;
|
|
|
|
|
|
- sym = he->ms.sym;
|
|
|
notes = symbol__annotation(sym);
|
|
|
|
|
|
if (pthread_mutex_trylock(¬es->lock))
|
|
|
return;
|
|
|
|
|
|
- ip = he->ms.map->map_ip(he->ms.map, ip);
|
|
|
-
|
|
|
- if (ui__has_annotation())
|
|
|
- err = hist_entry__inc_addr_samples(he, counter, ip);
|
|
|
+ err = hist_entry__inc_addr_samples(he, counter, ip);
|
|
|
|
|
|
pthread_mutex_unlock(¬es->lock);
|
|
|
|
|
|
- /*
|
|
|
- * This function is now called with he->hists->lock held.
|
|
|
- * Release it before going to sleep.
|
|
|
- */
|
|
|
- pthread_mutex_unlock(&he->hists->lock);
|
|
|
+ if (unlikely(err)) {
|
|
|
+ /*
|
|
|
+ * This function is now called with he->hists->lock held.
|
|
|
+ * Release it before going to sleep.
|
|
|
+ */
|
|
|
+ pthread_mutex_unlock(&he->hists->lock);
|
|
|
+
|
|
|
+ if (err == -ERANGE && !he->ms.map->erange_warned)
|
|
|
+ ui__warn_map_erange(he->ms.map, sym, ip);
|
|
|
+ else if (err == -ENOMEM) {
|
|
|
+ pr_err("Not enough memory for annotating '%s' symbol!\n",
|
|
|
+ sym->name);
|
|
|
+ sleep(1);
|
|
|
+ }
|
|
|
|
|
|
- if (err == -ERANGE && !he->ms.map->erange_warned)
|
|
|
- ui__warn_map_erange(he->ms.map, sym, ip);
|
|
|
- else if (err == -ENOMEM) {
|
|
|
- pr_err("Not enough memory for annotating '%s' symbol!\n",
|
|
|
- sym->name);
|
|
|
- sleep(1);
|
|
|
+ pthread_mutex_lock(&he->hists->lock);
|
|
|
}
|
|
|
-
|
|
|
- pthread_mutex_lock(&he->hists->lock);
|
|
|
}
|
|
|
|
|
|
static void perf_top__show_details(struct perf_top *top)
|
|
@@ -687,14 +685,8 @@ static int hist_iter__top_callback(struct hist_entry_iter *iter,
|
|
|
struct hist_entry *he = iter->he;
|
|
|
struct perf_evsel *evsel = iter->evsel;
|
|
|
|
|
|
- if (sort__has_sym && single) {
|
|
|
- u64 ip = al->addr;
|
|
|
-
|
|
|
- if (al->map)
|
|
|
- ip = al->map->unmap_ip(al->map, ip);
|
|
|
-
|
|
|
- perf_top__record_precise_ip(top, he, evsel->idx, ip);
|
|
|
- }
|
|
|
+ if (sort__has_sym && single)
|
|
|
+ perf_top__record_precise_ip(top, he, evsel->idx, al->addr);
|
|
|
|
|
|
hist__account_cycles(iter->sample->branch_stack, al, iter->sample,
|
|
|
!(top->record_opts.branch_stack & PERF_SAMPLE_BRANCH_ANY));
|