|
@@ -6,6 +6,7 @@
|
|
#include "session.h"
|
|
#include "session.h"
|
|
#include "namespaces.h"
|
|
#include "namespaces.h"
|
|
#include "sort.h"
|
|
#include "sort.h"
|
|
|
|
+#include "units.h"
|
|
#include "evlist.h"
|
|
#include "evlist.h"
|
|
#include "evsel.h"
|
|
#include "evsel.h"
|
|
#include "annotate.h"
|
|
#include "annotate.h"
|
|
@@ -14,6 +15,7 @@
|
|
#include "ui/progress.h"
|
|
#include "ui/progress.h"
|
|
#include <errno.h>
|
|
#include <errno.h>
|
|
#include <math.h>
|
|
#include <math.h>
|
|
|
|
+#include <inttypes.h>
|
|
#include <sys/param.h>
|
|
#include <sys/param.h>
|
|
|
|
|
|
static bool hists__filter_entry_by_dso(struct hists *hists,
|
|
static bool hists__filter_entry_by_dso(struct hists *hists,
|
|
@@ -2454,6 +2456,85 @@ u64 hists__total_period(struct hists *hists)
|
|
hists->stats.total_period;
|
|
hists->stats.total_period;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+int __hists__scnprintf_title(struct hists *hists, char *bf, size_t size, bool show_freq)
|
|
|
|
+{
|
|
|
|
+ char unit;
|
|
|
|
+ int printed;
|
|
|
|
+ const struct dso *dso = hists->dso_filter;
|
|
|
|
+ const struct thread *thread = hists->thread_filter;
|
|
|
|
+ int socket_id = hists->socket_filter;
|
|
|
|
+ unsigned long nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];
|
|
|
|
+ u64 nr_events = hists->stats.total_period;
|
|
|
|
+ struct perf_evsel *evsel = hists_to_evsel(hists);
|
|
|
|
+ const char *ev_name = perf_evsel__name(evsel);
|
|
|
|
+ char buf[512], sample_freq_str[64] = "";
|
|
|
|
+ size_t buflen = sizeof(buf);
|
|
|
|
+ char ref[30] = " show reference callgraph, ";
|
|
|
|
+ bool enable_ref = false;
|
|
|
|
+
|
|
|
|
+ if (symbol_conf.filter_relative) {
|
|
|
|
+ nr_samples = hists->stats.nr_non_filtered_samples;
|
|
|
|
+ nr_events = hists->stats.total_non_filtered_period;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (perf_evsel__is_group_event(evsel)) {
|
|
|
|
+ struct perf_evsel *pos;
|
|
|
|
+
|
|
|
|
+ perf_evsel__group_desc(evsel, buf, buflen);
|
|
|
|
+ ev_name = buf;
|
|
|
|
+
|
|
|
|
+ for_each_group_member(pos, evsel) {
|
|
|
|
+ struct hists *pos_hists = evsel__hists(pos);
|
|
|
|
+
|
|
|
|
+ if (symbol_conf.filter_relative) {
|
|
|
|
+ nr_samples += pos_hists->stats.nr_non_filtered_samples;
|
|
|
|
+ nr_events += pos_hists->stats.total_non_filtered_period;
|
|
|
|
+ } else {
|
|
|
|
+ nr_samples += pos_hists->stats.nr_events[PERF_RECORD_SAMPLE];
|
|
|
|
+ nr_events += pos_hists->stats.total_period;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (symbol_conf.show_ref_callgraph &&
|
|
|
|
+ strstr(ev_name, "call-graph=no"))
|
|
|
|
+ enable_ref = true;
|
|
|
|
+
|
|
|
|
+ if (show_freq)
|
|
|
|
+ scnprintf(sample_freq_str, sizeof(sample_freq_str), " %d Hz,", evsel->attr.sample_freq);
|
|
|
|
+
|
|
|
|
+ nr_samples = convert_unit(nr_samples, &unit);
|
|
|
|
+ printed = scnprintf(bf, size,
|
|
|
|
+ "Samples: %lu%c of event%s '%s',%s%sEvent count (approx.): %" PRIu64,
|
|
|
|
+ nr_samples, unit, evsel->nr_members > 1 ? "s" : "",
|
|
|
|
+ ev_name, sample_freq_str, enable_ref ? ref : " ", nr_events);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ if (hists->uid_filter_str)
|
|
|
|
+ printed += snprintf(bf + printed, size - printed,
|
|
|
|
+ ", UID: %s", hists->uid_filter_str);
|
|
|
|
+ if (thread) {
|
|
|
|
+ if (hists__has(hists, thread)) {
|
|
|
|
+ printed += scnprintf(bf + printed, size - printed,
|
|
|
|
+ ", Thread: %s(%d)",
|
|
|
|
+ (thread->comm_set ? thread__comm_str(thread) : ""),
|
|
|
|
+ thread->tid);
|
|
|
|
+ } else {
|
|
|
|
+ printed += scnprintf(bf + printed, size - printed,
|
|
|
|
+ ", Thread: %s",
|
|
|
|
+ (thread->comm_set ? thread__comm_str(thread) : ""));
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ if (dso)
|
|
|
|
+ printed += scnprintf(bf + printed, size - printed,
|
|
|
|
+ ", DSO: %s", dso->short_name);
|
|
|
|
+ if (socket_id > -1)
|
|
|
|
+ printed += scnprintf(bf + printed, size - printed,
|
|
|
|
+ ", Processor Socket: %d", socket_id);
|
|
|
|
+
|
|
|
|
+ return printed;
|
|
|
|
+}
|
|
|
|
+
|
|
int parse_filter_percentage(const struct option *opt __maybe_unused,
|
|
int parse_filter_percentage(const struct option *opt __maybe_unused,
|
|
const char *arg, int unset __maybe_unused)
|
|
const char *arg, int unset __maybe_unused)
|
|
{
|
|
{
|