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 refcount_t no_tracker; 17 bool dead; 18 struct list_head list; /* List of active trackers */ 19 struct list_head quarantine; /* List of dead trackers */ 20 char name[32]; 21 #endif 22 }; 23 24 #ifdef CONFIG_REF_TRACKER 25 26 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, 27 unsigned int quarantine_count, 28 const char *name) 29 { 30 INIT_LIST_HEAD(&dir->list); 31 INIT_LIST_HEAD(&dir->quarantine); 32 spin_lock_init(&dir->lock); 33 dir->quarantine_avail = quarantine_count; 34 dir->dead = false; 35 refcount_set(&dir->untracked, 1); 36 refcount_set(&dir->no_tracker, 1); 37 strscpy(dir->name, name, sizeof(dir->name)); 38 stack_depot_init(); 39 } 40 41 void ref_tracker_dir_exit(struct ref_tracker_dir *dir); 42 43 void ref_tracker_dir_print_locked(struct ref_tracker_dir *dir, 44 unsigned int display_limit); 45 46 void ref_tracker_dir_print(struct ref_tracker_dir *dir, 47 unsigned int display_limit); 48 49 int ref_tracker_alloc(struct ref_tracker_dir *dir, 50 struct ref_tracker **trackerp, gfp_t gfp); 51 52 int ref_tracker_free(struct ref_tracker_dir *dir, 53 struct ref_tracker **trackerp); 54 55 #else /* CONFIG_REF_TRACKER */ 56 57 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, 58 unsigned int quarantine_count, 59 const char *name) 60 { 61 } 62 63 static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir) 64 { 65 } 66 67 static inline void ref_tracker_dir_print_locked(struct ref_tracker_dir *dir, 68 unsigned int display_limit) 69 { 70 } 71 72 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir, 73 unsigned int display_limit) 74 { 75 } 76 77 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir, 78 struct ref_tracker **trackerp, 79 gfp_t gfp) 80 { 81 return 0; 82 } 83 84 static inline int ref_tracker_free(struct ref_tracker_dir *dir, 85 struct ref_tracker **trackerp) 86 { 87 return 0; 88 } 89 90 #endif 91 92 #endif /* _LINUX_REF_TRACKER_H */ 93