mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
1.8 KiB
79 lines
1.8 KiB
// SPDX-License-Identifier: GPL-2.0-or-later |
|
#ifndef _LINUX_REF_TRACKER_H |
|
#define _LINUX_REF_TRACKER_H |
|
#include <linux/refcount.h> |
|
#include <linux/types.h> |
|
#include <linux/spinlock.h> |
|
#include <linux/stackdepot.h> |
|
|
|
struct ref_tracker; |
|
|
|
struct ref_tracker_dir { |
|
#ifdef CONFIG_REF_TRACKER |
|
spinlock_t lock; |
|
unsigned int quarantine_avail; |
|
refcount_t untracked; |
|
refcount_t no_tracker; |
|
bool dead; |
|
struct list_head list; /* List of active trackers */ |
|
struct list_head quarantine; /* List of dead trackers */ |
|
#endif |
|
}; |
|
|
|
#ifdef CONFIG_REF_TRACKER |
|
static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, |
|
unsigned int quarantine_count) |
|
{ |
|
INIT_LIST_HEAD(&dir->list); |
|
INIT_LIST_HEAD(&dir->quarantine); |
|
spin_lock_init(&dir->lock); |
|
dir->quarantine_avail = quarantine_count; |
|
dir->dead = false; |
|
refcount_set(&dir->untracked, 1); |
|
refcount_set(&dir->no_tracker, 1); |
|
stack_depot_init(); |
|
} |
|
|
|
void ref_tracker_dir_exit(struct ref_tracker_dir *dir); |
|
|
|
void ref_tracker_dir_print(struct ref_tracker_dir *dir, |
|
unsigned int display_limit); |
|
|
|
int ref_tracker_alloc(struct ref_tracker_dir *dir, |
|
struct ref_tracker **trackerp, gfp_t gfp); |
|
|
|
int ref_tracker_free(struct ref_tracker_dir *dir, |
|
struct ref_tracker **trackerp); |
|
|
|
#else /* CONFIG_REF_TRACKER */ |
|
|
|
static inline void ref_tracker_dir_init(struct ref_tracker_dir *dir, |
|
unsigned int quarantine_count) |
|
{ |
|
} |
|
|
|
static inline void ref_tracker_dir_exit(struct ref_tracker_dir *dir) |
|
{ |
|
} |
|
|
|
static inline void ref_tracker_dir_print(struct ref_tracker_dir *dir, |
|
unsigned int display_limit) |
|
{ |
|
} |
|
|
|
static inline int ref_tracker_alloc(struct ref_tracker_dir *dir, |
|
struct ref_tracker **trackerp, |
|
gfp_t gfp) |
|
{ |
|
return 0; |
|
} |
|
|
|
static inline int ref_tracker_free(struct ref_tracker_dir *dir, |
|
struct ref_tracker **trackerp) |
|
{ |
|
return 0; |
|
} |
|
|
|
#endif |
|
|
|
#endif /* _LINUX_REF_TRACKER_H */
|
|
|