perf evlist: Check 'base' pointer before checking refcnt when put a mmap
evlist->mmap[i]->refcnt could be 0 if an evlist has no evsel or if all evsels don't match the evlist during mmap. For example, when all evsels are overwritable but the evlist itself is normal. To avoid crashing, perf should check 'base' pointer before checking refcnt, and raise bug only when base is not NULL. Signed-off-by: Wang Nan <wangnan0@huawei.com> Cc: He Kuang <hekuang@huawei.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Masami Hiramatsu <mhiramat@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Zefan Li <lizefan@huawei.com> Cc: pi3orama@163.com Link: http://lkml.kernel.org/r/1464183898-174512-2-git-send-email-wangnan0@huawei.com [ Renamed 'mmap' variable, it is reserved in old distros such as Ubuntu 12.04, breaking the build ] Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
f3058a1c19
commit
e10e4ef63b
|
@ -856,9 +856,11 @@ static void perf_evlist__mmap_get(struct perf_evlist *evlist, int idx)
|
|||
|
||||
static void perf_evlist__mmap_put(struct perf_evlist *evlist, int idx)
|
||||
{
|
||||
BUG_ON(atomic_read(&evlist->mmap[idx].refcnt) == 0);
|
||||
struct perf_mmap *md = &evlist->mmap[idx];
|
||||
|
||||
if (atomic_dec_and_test(&evlist->mmap[idx].refcnt))
|
||||
BUG_ON(md->base && atomic_read(&md->refcnt) == 0);
|
||||
|
||||
if (atomic_dec_and_test(&md->refcnt))
|
||||
__perf_evlist__munmap(evlist, idx);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue