Lines Matching refs:map

16 void perf_mmap__init(struct perf_mmap *map, struct perf_mmap *prev,
19 map->fd = -1;
20 map->overwrite = overwrite;
21 map->unmap_cb = unmap_cb;
22 refcount_set(&map->refcnt, 0);
24 prev->next = map;
27 size_t perf_mmap__mmap_len(struct perf_mmap *map)
29 return map->mask + 1 + page_size;
32 int perf_mmap__mmap(struct perf_mmap *map, struct perf_mmap_param *mp,
35 map->prev = 0;
36 map->mask = mp->mask;
37 map->base = mmap(NULL, perf_mmap__mmap_len(map), mp->prot,
39 if (map->base == MAP_FAILED) {
40 map->base = NULL;
44 map->fd = fd;
45 map->cpu = cpu;
49 void perf_mmap__munmap(struct perf_mmap *map)
51 if (map && map->base != NULL) {
52 munmap(map->base, perf_mmap__mmap_len(map));
53 map->base = NULL;
54 map->fd = -1;
55 refcount_set(&map->refcnt, 0);
57 if (map && map->unmap_cb)
58 map->unmap_cb(map);
61 void perf_mmap__get(struct perf_mmap *map)
63 refcount_inc(&map->refcnt);
66 void perf_mmap__put(struct perf_mmap *map)
68 BUG_ON(map->base && refcount_read(&map->refcnt) == 0);
70 if (refcount_dec_and_test(&map->refcnt))
71 perf_mmap__munmap(map);
79 u64 perf_mmap__read_head(struct perf_mmap *map)
81 return ring_buffer_read_head(map->base);
84 static bool perf_mmap__empty(struct perf_mmap *map)
86 struct perf_event_mmap_page *pc = map->base;
88 return perf_mmap__read_head(map) == map->prev && !pc->aux_size;
91 void perf_mmap__consume(struct perf_mmap *map)
93 if (!map->overwrite) {
94 u64 old = map->prev;
96 perf_mmap__write_tail(map, old);
99 if (refcount_read(&map->refcnt) == 1 && perf_mmap__empty(map))
100 perf_mmap__put(map);
172 int perf_mmap__read_init(struct perf_mmap *map)
177 if (!refcount_read(&map->refcnt))
180 return __perf_mmap__read_init(map);
186 * The last perf_mmap__read() will set tail to map->core.prev.
187 * Need to correct the map->core.prev to head which is the end of next read.
189 void perf_mmap__read_done(struct perf_mmap *map)
194 if (!refcount_read(&map->refcnt))
197 map->prev = perf_mmap__read_head(map);
201 static union perf_event *perf_mmap__read(struct perf_mmap *map,
204 unsigned char *data = map->base + page_size;
211 event = (union perf_event *)&data[*startp & map->mask];
221 if ((*startp & map->mask) + size != ((*startp + size) & map->mask)) {
224 void *dst = map->event_copy;
227 cpy = min(map->mask + 1 - (offset & map->mask), len);
228 memcpy(dst, &data[offset & map->mask], cpy);
234 event = (union perf_event *)map->event_copy;
255 union perf_event *perf_mmap__read_event(struct perf_mmap *map)
262 if (!refcount_read(&map->refcnt))
266 if (!map->overwrite)
267 map->end = perf_mmap__read_head(map);
269 event = perf_mmap__read(map, &map->start, map->end);
271 if (!map->overwrite)
272 map->prev = map->start;