1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef __PERF_MEM_INFO_H
3#define __PERF_MEM_INFO_H
4
5#include <linux/refcount.h>
6#include <linux/perf_event.h>
7#include <internal/rc_check.h>
8#include "map_symbol.h"
9
10DECLARE_RC_STRUCT(mem_info) {
11	struct addr_map_symbol	iaddr;
12	struct addr_map_symbol	daddr;
13	union perf_mem_data_src	data_src;
14	refcount_t		refcnt;
15};
16
17struct mem_info *mem_info__new(void);
18struct mem_info *mem_info__get(struct mem_info *mi);
19void   mem_info__put(struct mem_info *mi);
20
21static inline void __mem_info__zput(struct mem_info **mi)
22{
23	mem_info__put(*mi);
24	*mi = NULL;
25}
26
27#define mem_info__zput(mi) __mem_info__zput(&mi)
28
29static inline struct addr_map_symbol *mem_info__iaddr(struct mem_info *mi)
30{
31	return &RC_CHK_ACCESS(mi)->iaddr;
32}
33
34static inline struct addr_map_symbol *mem_info__daddr(struct mem_info *mi)
35{
36	return &RC_CHK_ACCESS(mi)->daddr;
37}
38
39static inline union perf_mem_data_src *mem_info__data_src(struct mem_info *mi)
40{
41	return &RC_CHK_ACCESS(mi)->data_src;
42}
43
44static inline const union perf_mem_data_src *mem_info__const_data_src(const struct mem_info *mi)
45{
46	return &RC_CHK_ACCESS(mi)->data_src;
47}
48
49static inline refcount_t *mem_info__refcnt(struct mem_info *mi)
50{
51	return &RC_CHK_ACCESS(mi)->refcnt;
52}
53
54#endif /* __PERF_MEM_INFO_H */
55