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>
10 struct ref_tracker_dir {
11 #ifdef CONFIG_REF_TRACKER
13 unsigned int quarantine_avail;
15 struct list_head list; /* List of active trackers */
16 struct list_head quarantine; /* List of dead trackers */
20 #ifdef CONFIG_REF_TRACKER
21 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
22 unsigned int quarantine_count)
24 INIT_LIST_HEAD(&dir->list);
25 INIT_LIST_HEAD(&dir->quarantine);
26 spin_lock_init(&dir->lock);
27 dir->quarantine_avail = quarantine_count;
28 refcount_set(&dir->untracked, 1);
31 void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
33 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
34 unsigned int display_limit);
36 int ref_tracker_alloc(struct ref_tracker_dir *dir,
37 struct ref_tracker **trackerp, gfp_t gfp);
39 int ref_tracker_free(struct ref_tracker_dir *dir,
40 struct ref_tracker **trackerp);
42 #else /* CONFIG_REF_TRACKER */
44 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
45 unsigned int quarantine_count)
49 static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
53 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
54 unsigned int display_limit)
58 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
59 struct ref_tracker **trackerp,
65 static inline int ref_tracker_free(struct ref_tracker_dir *dir,
66 struct ref_tracker **trackerp)
73 #endif /* _LINUX_REF_TRACKER_H */