Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf evlist: Introduce backward_mmap array for evlist

Add backward_mmap to evlist, free it together with normal mmap.

Improve perf_evlist__pick_pc(), search backward_mmap if evlist->mmap is
not available.

This patch doesn't alloc this array. It will be allocated conditionally
in the following commits.

Signed-off-by: Wang Nan <wangnan0@huawei.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Cc: He Kuang <hekuang@huawei.com>
Cc: Masami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Nilay Vaish <nilayvaish@gmail.com>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468485287-33422-8-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Wang Nan and committed by
Arnaldo Carvalho de Melo
b2cb615d a1f72618

+16 -7
+7 -3
tools/perf/builtin-record.c
··· 509 509 if (!evlist) 510 510 return 0; 511 511 512 - maps = evlist->mmap; 512 + maps = backward ? evlist->backward_mmap : evlist->mmap; 513 513 if (!maps) 514 514 return 0; 515 515 ··· 696 696 static const struct perf_event_mmap_page * 697 697 perf_evlist__pick_pc(struct perf_evlist *evlist) 698 698 { 699 - if (evlist && evlist->mmap && evlist->mmap[0].base) 700 - return evlist->mmap[0].base; 699 + if (evlist) { 700 + if (evlist->mmap && evlist->mmap[0].base) 701 + return evlist->mmap[0].base; 702 + if (evlist->backward_mmap && evlist->backward_mmap[0].base) 703 + return evlist->backward_mmap[0].base; 704 + } 701 705 return NULL; 702 706 } 703 707
+8 -4
tools/perf/util/evlist.c
··· 123 123 void perf_evlist__exit(struct perf_evlist *evlist) 124 124 { 125 125 zfree(&evlist->mmap); 126 + zfree(&evlist->backward_mmap); 126 127 fdarray__exit(&evlist->pollfd); 127 128 } 128 129 ··· 974 973 { 975 974 int i; 976 975 977 - if (evlist->mmap == NULL) 978 - return; 976 + if (evlist->mmap) 977 + for (i = 0; i < evlist->nr_mmaps; i++) 978 + perf_mmap__munmap(&evlist->mmap[i]); 979 979 980 - for (i = 0; i < evlist->nr_mmaps; i++) 981 - perf_mmap__munmap(&evlist->mmap[i]); 980 + if (evlist->backward_mmap) 981 + for (i = 0; i < evlist->nr_mmaps; i++) 982 + perf_mmap__munmap(&evlist->backward_mmap[i]); 982 983 } 983 984 984 985 void perf_evlist__munmap(struct perf_evlist *evlist) 985 986 { 986 987 perf_evlist__munmap_nofree(evlist); 987 988 zfree(&evlist->mmap); 989 + zfree(&evlist->backward_mmap); 988 990 } 989 991 990 992 static struct perf_mmap *perf_evlist__alloc_mmap(struct perf_evlist *evlist)
+1
tools/perf/util/evlist.h
··· 61 61 } workload; 62 62 struct fdarray pollfd; 63 63 struct perf_mmap *mmap; 64 + struct perf_mmap *backward_mmap; 64 65 struct thread_map *threads; 65 66 struct cpu_map *cpus; 66 67 struct perf_evsel *selected;