Merge tag 'pull-work.iov_iter-rebased' of git://git.kernel.org/pub/scm/linux/kernel...
[linux-block.git] / include / linux / ref_tracker.h
CommitLineData
4e66934e
ED
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>
2dba5eb1 7#include <linux/stackdepot.h>
4e66934e
ED
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;
8fd5522f 16 refcount_t no_tracker;
e3ececfe 17 bool dead;
4e66934e
ED
18 struct list_head list; /* List of active trackers */
19 struct list_head quarantine; /* List of dead trackers */
20#endif
21};
22
23#ifdef CONFIG_REF_TRACKER
24static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
25 unsigned int quarantine_count)
26{
27 INIT_LIST_HEAD(&dir->list);
28 INIT_LIST_HEAD(&dir->quarantine);
29 spin_lock_init(&dir->lock);
30 dir->quarantine_avail = quarantine_count;
e3ececfe 31 dir->dead = false;
4e66934e 32 refcount_set(&dir->untracked, 1);
8fd5522f 33 refcount_set(&dir->no_tracker, 1);
2dba5eb1 34 stack_depot_init();
4e66934e
ED
35}
36
37void ref_tracker_dir_exit(struct ref_tracker_dir *dir);
38
39void ref_tracker_dir_print(struct ref_tracker_dir *dir,
40 unsigned int display_limit);
41
42int ref_tracker_alloc(struct ref_tracker_dir *dir,
43 struct ref_tracker **trackerp, gfp_t gfp);
44
45int ref_tracker_free(struct ref_tracker_dir *dir,
46 struct ref_tracker **trackerp);
47
48#else /* CONFIG_REF_TRACKER */
49
50static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir,
51 unsigned int quarantine_count)
52{
53}
54
55static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
56{
57}
58
59static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir,
60 unsigned int display_limit)
61{
62}
63
64static inline int ref_tracker_alloc(struct ref_tracker_dir *dir,
65 struct ref_tracker **trackerp,
66 gfp_t gfp)
67{
68 return 0;
69}
70
71static inline int ref_tracker_free(struct ref_tracker_dir *dir,
72 struct ref_tracker **trackerp)
73{
74 return 0;
75}
76
77#endif
78
79#endif /* _LINUX_REF_TRACKER_H */