162306a36Sopenharmony_ci#ifndef __PERF_MMAP_H
262306a36Sopenharmony_ci#define __PERF_MMAP_H 1
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci#include <internal/mmap.h>
562306a36Sopenharmony_ci#include <linux/types.h>
662306a36Sopenharmony_ci#include <linux/bitops.h>
762306a36Sopenharmony_ci#include <perf/cpumap.h>
862306a36Sopenharmony_ci#ifdef HAVE_AIO_SUPPORT
962306a36Sopenharmony_ci#include <aio.h>
1062306a36Sopenharmony_ci#endif
1162306a36Sopenharmony_ci#include "auxtrace.h"
1262306a36Sopenharmony_ci#include "util/compress.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_cistruct aiocb;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistruct mmap_cpu_mask {
1762306a36Sopenharmony_ci	unsigned long *bits;
1862306a36Sopenharmony_ci	size_t nbits;
1962306a36Sopenharmony_ci};
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_ci#define MMAP_CPU_MASK_BYTES(m) \
2262306a36Sopenharmony_ci	(BITS_TO_LONGS(((struct mmap_cpu_mask *)m)->nbits) * sizeof(unsigned long))
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci/**
2562306a36Sopenharmony_ci * struct mmap - perf's ring buffer mmap details
2662306a36Sopenharmony_ci *
2762306a36Sopenharmony_ci * @refcnt - e.g. code using PERF_EVENT_IOC_SET_OUTPUT to share this
2862306a36Sopenharmony_ci */
2962306a36Sopenharmony_cistruct mmap {
3062306a36Sopenharmony_ci	struct perf_mmap	core;
3162306a36Sopenharmony_ci	struct auxtrace_mmap auxtrace_mmap;
3262306a36Sopenharmony_ci#ifdef HAVE_AIO_SUPPORT
3362306a36Sopenharmony_ci	struct {
3462306a36Sopenharmony_ci		void		 **data;
3562306a36Sopenharmony_ci		struct aiocb	 *cblocks;
3662306a36Sopenharmony_ci		struct aiocb	 **aiocb;
3762306a36Sopenharmony_ci		int		 nr_cblocks;
3862306a36Sopenharmony_ci	} aio;
3962306a36Sopenharmony_ci#endif
4062306a36Sopenharmony_ci	struct mmap_cpu_mask	affinity_mask;
4162306a36Sopenharmony_ci	void		*data;
4262306a36Sopenharmony_ci	int		comp_level;
4362306a36Sopenharmony_ci	struct perf_data_file *file;
4462306a36Sopenharmony_ci	struct zstd_data      zstd_data;
4562306a36Sopenharmony_ci};
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct mmap_params {
4862306a36Sopenharmony_ci	struct perf_mmap_param core;
4962306a36Sopenharmony_ci	int nr_cblocks, affinity, flush, comp_level;
5062306a36Sopenharmony_ci	struct auxtrace_mmap_params auxtrace_mp;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciint mmap__mmap(struct mmap *map, struct mmap_params *mp, int fd, struct perf_cpu cpu);
5462306a36Sopenharmony_civoid mmap__munmap(struct mmap *map);
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ciunion perf_event *perf_mmap__read_forward(struct mmap *map);
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ciint perf_mmap__push(struct mmap *md, void *to,
5962306a36Sopenharmony_ci		    int push(struct mmap *map, void *to, void *buf, size_t size));
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cisize_t mmap__mmap_len(struct mmap *map);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_civoid mmap_cpu_mask__scnprintf(struct mmap_cpu_mask *mask, const char *tag);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciint mmap_cpu_mask__duplicate(struct mmap_cpu_mask *original,
6662306a36Sopenharmony_ci				struct mmap_cpu_mask *clone);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci#endif /*__PERF_MMAP_H */
69