Merge branch 'akpm' (patches from Andrew)
[linux-2.6-microblaze.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
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 */