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>
11 struct ref_tracker_dir {
12 #ifdef CONFIG_REF_TRACKER
14 unsigned int quarantine_avail;
16 struct list_head list; /* List of active trackers */
17 struct list_head quarantine; /* List of dead trackers */
21 #ifdef CONFIG_REF_TRACKER
22 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
23 unsigned int quarantine_count)
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);
33 void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
35 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
36 unsigned int display_limit);
38 int ref_tracker_alloc(struct ref_tracker_dir *dir,
39 struct ref_tracker **trackerp, gfp_t gfp);
41 int ref_tracker_free(struct ref_tracker_dir *dir,
42 struct ref_tracker **trackerp);
44 #else /* CONFIG_REF_TRACKER */
46 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
47 unsigned int quarantine_count)
51 static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
55 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
56 unsigned int display_limit)
60 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
61 struct ref_tracker **trackerp,
67 static inline int ref_tracker_free(struct ref_tracker_dir *dir,
68 struct ref_tracker **trackerp)
75 #endif /* _LINUX_REF_TRACKER_H */