Merge tag 'amlogic-fixes-v5.17-rc-v2' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / include / linux / ref_tracker.h
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 */