|
@@ -809,15 +809,23 @@ static void perf_event__process_sample(struct perf_tool *tool,
|
|
|
|
|
|
static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
|
|
|
{
|
|
|
+ struct record_opts *opts = &top->record_opts;
|
|
|
+ struct perf_evlist *evlist = top->evlist;
|
|
|
struct perf_sample sample;
|
|
|
struct perf_evsel *evsel;
|
|
|
+ struct perf_mmap *md;
|
|
|
struct perf_session *session = top->session;
|
|
|
union perf_event *event;
|
|
|
struct machine *machine;
|
|
|
+ u64 end, start;
|
|
|
int ret;
|
|
|
|
|
|
- while ((event = perf_evlist__mmap_read(top->evlist, idx)) != NULL) {
|
|
|
- ret = perf_evlist__parse_sample(top->evlist, event, &sample);
|
|
|
+ md = opts->overwrite ? &evlist->overwrite_mmap[idx] : &evlist->mmap[idx];
|
|
|
+ if (perf_mmap__read_init(md, opts->overwrite, &start, &end) < 0)
|
|
|
+ return;
|
|
|
+
|
|
|
+ while ((event = perf_mmap__read_event(md, opts->overwrite, &start, end)) != NULL) {
|
|
|
+ ret = perf_evlist__parse_sample(evlist, event, &sample);
|
|
|
if (ret) {
|
|
|
pr_err("Can't parse sample, err = %d\n", ret);
|
|
|
goto next_event;
|
|
@@ -871,16 +879,28 @@ static void perf_top__mmap_read_idx(struct perf_top *top, int idx)
|
|
|
} else
|
|
|
++session->evlist->stats.nr_unknown_events;
|
|
|
next_event:
|
|
|
- perf_evlist__mmap_consume(top->evlist, idx);
|
|
|
+ perf_mmap__consume(md, opts->overwrite);
|
|
|
}
|
|
|
+
|
|
|
+ perf_mmap__read_done(md);
|
|
|
}
|
|
|
|
|
|
static void perf_top__mmap_read(struct perf_top *top)
|
|
|
{
|
|
|
+ bool overwrite = top->record_opts.overwrite;
|
|
|
+ struct perf_evlist *evlist = top->evlist;
|
|
|
int i;
|
|
|
|
|
|
+ if (overwrite)
|
|
|
+ perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_DATA_PENDING);
|
|
|
+
|
|
|
for (i = 0; i < top->evlist->nr_mmaps; i++)
|
|
|
perf_top__mmap_read_idx(top, i);
|
|
|
+
|
|
|
+ if (overwrite) {
|
|
|
+ perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_EMPTY);
|
|
|
+ perf_evlist__toggle_bkw_mmap(evlist, BKW_MMAP_RUNNING);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -979,11 +999,6 @@ static int perf_top__start_counters(struct perf_top *top)
|
|
|
goto out_err;
|
|
|
}
|
|
|
|
|
|
- if (opts->overwrite) {
|
|
|
- ui__error("not support overwrite mode yet\n");
|
|
|
- goto out_err;
|
|
|
- }
|
|
|
-
|
|
|
perf_evlist__config(evlist, opts, &callchain_param);
|
|
|
|
|
|
evlist__for_each_entry(evlist, counter) {
|
|
@@ -1144,7 +1159,7 @@ static int __cmd_top(struct perf_top *top)
|
|
|
|
|
|
perf_top__mmap_read(top);
|
|
|
|
|
|
- if (hits == top->samples)
|
|
|
+ if (opts->overwrite || (hits == top->samples))
|
|
|
ret = perf_evlist__poll(top->evlist, 100);
|
|
|
|
|
|
if (resize) {
|
|
@@ -1238,6 +1253,7 @@ int cmd_top(int argc, const char **argv)
|
|
|
.uses_mmap = true,
|
|
|
},
|
|
|
.proc_map_timeout = 500,
|
|
|
+ .overwrite = 1,
|
|
|
},
|
|
|
.max_stack = sysctl_perf_event_max_stack,
|
|
|
.sym_pcnt_filter = 5,
|