xref: /linux-6.15/include/linux/ref_tracker.h (revision f034cc13)
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