xref: /linux-6.15/include/linux/ref_tracker.h (revision 4e66934e)
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 
8 struct ref_tracker;
9 
10 struct ref_tracker_dir {
11 #ifdef CONFIG_REF_TRACKER
12 	spinlock_t		lock;
13 	unsigned int		quarantine_avail;
14 	refcount_t		untracked;
15 	struct list_head	list; /* List of active trackers */
16 	struct list_head	quarantine; /* List of dead trackers */
17 #endif
18 };
19 
20 #ifdef CONFIG_REF_TRACKER
21 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
22 					unsigned int quarantine_count)
23 {
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);
29 }
30 
31 void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
32 
33 void ref_tracker_dir_print(struct ref_tracker_dir *dir,
34 			   unsigned int display_limit);
35 
36 int ref_tracker_alloc(struct ref_tracker_dir *dir,
37 		      struct ref_tracker **trackerp, gfp_t gfp);
38 
39 int ref_tracker_free(struct ref_tracker_dir *dir,
40 		     struct ref_tracker **trackerp);
41 
42 #else /* CONFIG_REF_TRACKER */
43 
44 static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
45 					unsigned int quarantine_count)
46 {
47 }
48 
49 static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
50 {
51 }
52 
53 static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
54 					 unsigned int display_limit)
55 {
56 }
57 
58 static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
59 				    struct ref_tracker **trackerp,
60 				    gfp_t gfp)
61 {
62 	return 0;
63 }
64 
65 static inline int ref_tracker_free(struct ref_tracker_dir *dir,
66 				   struct ref_tracker **trackerp)
67 {
68 	return 0;
69 }
70 
71 #endif
72 
73 #endif /* _LINUX_REF_TRACKER_H */
74