Add backward_mmap to evlist. Alloc this array in perf_evlist__mmap_ex()
and free it together with normal mmap.

Signed-off-by: Wang Nan <[email protected]>
Cc: Arnaldo Carvalho de Melo <[email protected]>
Cc: He Kuang <[email protected]>
Cc: Jiri Olsa <[email protected]>
Cc: Masami Hiramatsu <[email protected]>
Cc: Namhyung Kim <[email protected]>
Cc: Zefan Li <[email protected]>
Cc: Nilay Vaish <[email protected]>
Cc: [email protected]
---
 tools/perf/util/evlist.c | 18 +++++++++++++-----
 tools/perf/util/evlist.h |  1 +
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c
index bbad72f..53c25a4 100644
--- a/tools/perf/util/evlist.c
+++ b/tools/perf/util/evlist.c
@@ -123,6 +123,7 @@ static void perf_evlist__purge(struct perf_evlist *evlist)
 void perf_evlist__exit(struct perf_evlist *evlist)
 {
        zfree(&evlist->mmap);
+       zfree(&evlist->backward_mmap);
        fdarray__exit(&evlist->pollfd);
 }
 
@@ -962,17 +963,20 @@ static void perf_evlist__munmap_nofree(struct perf_evlist 
*evlist)
 {
        int i;
 
-       if (evlist->mmap == NULL)
-               return;
+       if (evlist->mmap)
+               for (i = 0; i < evlist->nr_mmaps; i++)
+                       perf_mmap__munmap(&evlist->mmap[i]);
 
-       for (i = 0; i < evlist->nr_mmaps; i++)
-               perf_mmap__munmap(&evlist->mmap[i]);
+       if (evlist->backward_mmap)
+               for (i = 0; i < evlist->nr_mmaps; i++)
+                       perf_mmap__munmap(&evlist->backward_mmap[i]);
 }
 
 void perf_evlist__munmap(struct perf_evlist *evlist)
 {
        perf_evlist__munmap_nofree(evlist);
        zfree(&evlist->mmap);
+       zfree(&evlist->backward_mmap);
 }
 
 static struct perf_mmap *perf_evlist__alloc_mmap(struct perf_evlist *evlist)
@@ -1289,8 +1293,12 @@ int perf_evlist__mmap_ex(struct perf_evlist *evlist, 
unsigned int pages,
 
        if (!evlist->mmap)
                evlist->mmap = perf_evlist__alloc_mmap(evlist);
-       if (!evlist->mmap)
+       if (!evlist->backward_mmap)
+               evlist->backward_mmap = perf_evlist__alloc_mmap(evlist);
+       if (!evlist->mmap || !evlist->backward_mmap) {
+               perf_evlist__munmap(evlist);
                return -ENOMEM;
+       }
 
        if (evlist->pollfd.entries == NULL && perf_evlist__alloc_pollfd(evlist) 
< 0)
                return -ENOMEM;
diff --git a/tools/perf/util/evlist.h b/tools/perf/util/evlist.h
index 2fc5c16..8acac5f 100644
--- a/tools/perf/util/evlist.h
+++ b/tools/perf/util/evlist.h
@@ -61,6 +61,7 @@ struct perf_evlist {
        } workload;
        struct fdarray   pollfd;
        struct perf_mmap *mmap;
+       struct perf_mmap *backward_mmap;
        struct thread_map *threads;
        struct cpu_map    *cpus;
        struct perf_evsel *selected;
-- 
1.8.3.4

Reply via email to