1 // SPDX-License-Identifier: GPL-2.0-or-later 2 #ifndef _LINUX_REF_TRACKER_H 3 #define _LINUX_REF_TRACKER_H 4 #include <linux/refcount.h> 5 #include <linux/types.h> 6 #include <linux/spinlock.h> 7 #include <linux/stackdepot.h> 8 9 struct ref_tracker; 10 11 struct ref_tracker_dir { 12 #ifdef CONFIG_REF_TRACKER 13 spinlock_t lock; 14 unsigned int quarantine_avail; 15 refcount_t untracked; 16 struct list_head list; /* List of active trackers */ 17 struct list_head quarantine; /* List of dead trackers */ 18 #endif 19 }; 20 21 #ifdef CONFIG_REF_TRACKER 22 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, 23 unsigned int quarantine_count) 24 { 25 INIT_LIST_HEAD(&dir->list); 26 INIT_LIST_HEAD(&dir->quarantine); 27 spin_lock_init(&dir->lock); 28 dir->quarantine_avail = quarantine_count; 29 refcount_set(&dir->untracked, 1); 30 stack_depot_init(); 31 } 32 33 void ref_tracker_dir_exit(struct ref_tracker_dir *dir); 34 35 void ref_tracker_dir_print(struct ref_tracker_dir *dir, 36 unsigned int display_limit); 37 38 int ref_tracker_alloc(struct ref_tracker_dir *dir, 39 struct ref_tracker **trackerp, gfp_t gfp); 40 41 int ref_tracker_free(struct ref_tracker_dir *dir, 42 struct ref_tracker **trackerp); 43 44 #else /* CONFIG_REF_TRACKER */ 45 46 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, 47 unsigned int quarantine_count) 48 { 49 } 50 51 static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir) 52 { 53 } 54 55 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir, 56 unsigned int display_limit) 57 { 58 } 59 60 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir, 61 struct ref_tracker **trackerp, 62 gfp_t gfp) 63 { 64 return 0; 65 } 66 67 static inline int ref_tracker_free(struct ref_tracker_dir *dir, 68 struct ref_tracker **trackerp) 69 { 70 return 0; 71 } 72 73 #endif 74 75 #endif /* _LINUX_REF_TRACKER_H */ 76