| 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 | |
| 10 | DECLARE_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 | |
| 17 | struct mem_info *mem_info__new(void); |
| 18 | struct mem_info *mem_info__clone(struct mem_info *mi); |
| 19 | struct mem_info *mem_info__get(struct mem_info *mi); |
| 20 | void mem_info__put(struct mem_info *mi); |
| 21 | |
| 22 | static inline void __mem_info__zput(struct mem_info **mi) |
| 23 | { |
| 24 | mem_info__put(mi: *mi); |
| 25 | *mi = NULL; |
| 26 | } |
| 27 | |
| 28 | #define mem_info__zput(mi) __mem_info__zput(&mi) |
| 29 | |
| 30 | static inline struct addr_map_symbol *mem_info__iaddr(struct mem_info *mi) |
| 31 | { |
| 32 | return &RC_CHK_ACCESS(mi)->iaddr; |
| 33 | } |
| 34 | |
| 35 | static inline struct addr_map_symbol *mem_info__daddr(struct mem_info *mi) |
| 36 | { |
| 37 | return &RC_CHK_ACCESS(mi)->daddr; |
| 38 | } |
| 39 | |
| 40 | static inline union perf_mem_data_src *mem_info__data_src(struct mem_info *mi) |
| 41 | { |
| 42 | return &RC_CHK_ACCESS(mi)->data_src; |
| 43 | } |
| 44 | |
| 45 | static inline const union perf_mem_data_src *mem_info__const_data_src(const struct mem_info *mi) |
| 46 | { |
| 47 | return &RC_CHK_ACCESS(mi)->data_src; |
| 48 | } |
| 49 | |
| 50 | static inline refcount_t *mem_info__refcnt(struct mem_info *mi) |
| 51 | { |
| 52 | return &RC_CHK_ACCESS(mi)->refcnt; |
| 53 | } |
| 54 | |
| 55 | #endif /* __PERF_MEM_INFO_H */ |
| 56 |
