Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
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
9struct ref_tracker;
10
11struct 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
22static 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
33void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
34
35void ref_tracker_dir_print(struct ref_tracker_dir *dir,
36 unsigned int display_limit);
37
38int ref_tracker_alloc(struct ref_tracker_dir *dir,
39 struct ref_tracker **trackerp, gfp_t gfp);
40
41int ref_tracker_free(struct ref_tracker_dir *dir,
42 struct ref_tracker **trackerp);
43
44#else /* CONFIG_REF_TRACKER */
45
46static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
47 unsigned int quarantine_count)
48{
49}
50
51static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
52{
53}
54
55static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
56 unsigned int display_limit)
57{
58}
59
60static 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
67static 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 */