Commit e03edfea authored by Jiri Olsa's avatar Jiri Olsa Committed by Arnaldo Carvalho de Melo

libperf: Add 'refcnt' to struct perf_mmap

Move 'refcnt' from tools/perf's mmap to libperf's perf_mmap struct.

Committer notes:

Add the refcount.h include directive here, now it is needed.
Signed-off-by: default avatarJiri Olsa <jolsa@kernel.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Michael Petlan <mpetlan@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lore.kernel.org/lkml/20190913132355.21634-15-jolsa@kernel.orgSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 56a94706
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
#ifndef __LIBPERF_INTERNAL_MMAP_H #ifndef __LIBPERF_INTERNAL_MMAP_H
#define __LIBPERF_INTERNAL_MMAP_H #define __LIBPERF_INTERNAL_MMAP_H
#include <linux/refcount.h>
/** /**
* struct perf_mmap - perf's ring buffer mmap details * struct perf_mmap - perf's ring buffer mmap details
* *
...@@ -12,6 +14,7 @@ struct perf_mmap { ...@@ -12,6 +14,7 @@ struct perf_mmap {
int mask; int mask;
int fd; int fd;
int cpu; int cpu;
refcount_t refcnt;
}; };
#endif /* __LIBPERF_INTERNAL_MMAP_H */ #endif /* __LIBPERF_INTERNAL_MMAP_H */
...@@ -719,7 +719,7 @@ static struct mmap *evlist__alloc_mmap(struct evlist *evlist, ...@@ -719,7 +719,7 @@ static struct mmap *evlist__alloc_mmap(struct evlist *evlist,
* Each PERF_EVENT_IOC_SET_OUTPUT points to this mmap and * Each PERF_EVENT_IOC_SET_OUTPUT points to this mmap and
* thus does perf_mmap__get() on it. * thus does perf_mmap__get() on it.
*/ */
refcount_set(&map[i].refcnt, 0); refcount_set(&map[i].core.refcnt, 0);
} }
return map; return map;
} }
......
...@@ -89,7 +89,7 @@ union perf_event *perf_mmap__read_event(struct mmap *map) ...@@ -89,7 +89,7 @@ union perf_event *perf_mmap__read_event(struct mmap *map)
/* /*
* Check if event was unmapped due to a POLLHUP/POLLERR. * Check if event was unmapped due to a POLLHUP/POLLERR.
*/ */
if (!refcount_read(&map->refcnt)) if (!refcount_read(&map->core.refcnt))
return NULL; return NULL;
/* non-overwirte doesn't pause the ringbuffer */ /* non-overwirte doesn't pause the ringbuffer */
...@@ -111,14 +111,14 @@ static bool perf_mmap__empty(struct mmap *map) ...@@ -111,14 +111,14 @@ static bool perf_mmap__empty(struct mmap *map)
void perf_mmap__get(struct mmap *map) void perf_mmap__get(struct mmap *map)
{ {
refcount_inc(&map->refcnt); refcount_inc(&map->core.refcnt);
} }
void perf_mmap__put(struct mmap *map) void perf_mmap__put(struct mmap *map)
{ {
BUG_ON(map->core.base && refcount_read(&map->refcnt) == 0); BUG_ON(map->core.base && refcount_read(&map->core.refcnt) == 0);
if (refcount_dec_and_test(&map->refcnt)) if (refcount_dec_and_test(&map->core.refcnt))
perf_mmap__munmap(map); perf_mmap__munmap(map);
} }
...@@ -130,7 +130,7 @@ void perf_mmap__consume(struct mmap *map) ...@@ -130,7 +130,7 @@ void perf_mmap__consume(struct mmap *map)
perf_mmap__write_tail(map, old); perf_mmap__write_tail(map, old);
} }
if (refcount_read(&map->refcnt) == 1 && perf_mmap__empty(map)) if (refcount_read(&map->core.refcnt) == 1 && perf_mmap__empty(map))
perf_mmap__put(map); perf_mmap__put(map);
} }
...@@ -321,7 +321,7 @@ void perf_mmap__munmap(struct mmap *map) ...@@ -321,7 +321,7 @@ void perf_mmap__munmap(struct mmap *map)
munmap(map->core.base, perf_mmap__mmap_len(map)); munmap(map->core.base, perf_mmap__mmap_len(map));
map->core.base = NULL; map->core.base = NULL;
map->core.fd = -1; map->core.fd = -1;
refcount_set(&map->refcnt, 0); refcount_set(&map->core.refcnt, 0);
} }
auxtrace_mmap__munmap(&map->auxtrace_mmap); auxtrace_mmap__munmap(&map->auxtrace_mmap);
} }
...@@ -367,7 +367,7 @@ int perf_mmap__mmap(struct mmap *map, struct mmap_params *mp, int fd, int cpu) ...@@ -367,7 +367,7 @@ int perf_mmap__mmap(struct mmap *map, struct mmap_params *mp, int fd, int cpu)
* evlist layer can't just drop it when filtering events in * evlist layer can't just drop it when filtering events in
* perf_evlist__filter_pollfd(). * perf_evlist__filter_pollfd().
*/ */
refcount_set(&map->refcnt, 2); refcount_set(&map->core.refcnt, 2);
map->prev = 0; map->prev = 0;
map->core.mask = mp->mask; map->core.mask = mp->mask;
map->core.base = mmap(NULL, perf_mmap__mmap_len(map), mp->prot, map->core.base = mmap(NULL, perf_mmap__mmap_len(map), mp->prot,
...@@ -479,7 +479,7 @@ int perf_mmap__read_init(struct mmap *map) ...@@ -479,7 +479,7 @@ int perf_mmap__read_init(struct mmap *map)
/* /*
* Check if event was unmapped due to a POLLHUP/POLLERR. * Check if event was unmapped due to a POLLHUP/POLLERR.
*/ */
if (!refcount_read(&map->refcnt)) if (!refcount_read(&map->core.refcnt))
return -ENOENT; return -ENOENT;
return __perf_mmap__read_init(map); return __perf_mmap__read_init(map);
...@@ -537,7 +537,7 @@ void perf_mmap__read_done(struct mmap *map) ...@@ -537,7 +537,7 @@ void perf_mmap__read_done(struct mmap *map)
/* /*
* Check if event was unmapped due to a POLLHUP/POLLERR. * Check if event was unmapped due to a POLLHUP/POLLERR.
*/ */
if (!refcount_read(&map->refcnt)) if (!refcount_read(&map->core.refcnt))
return; return;
map->prev = perf_mmap__read_head(map); map->prev = perf_mmap__read_head(map);
......
...@@ -22,7 +22,6 @@ struct aiocb; ...@@ -22,7 +22,6 @@ struct aiocb;
*/ */
struct mmap { struct mmap {
struct perf_mmap core; struct perf_mmap core;
refcount_t refcnt;
u64 prev; u64 prev;
u64 start; u64 start;
u64 end; u64 end;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment