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