Lines Matching +full:pk +full:- +full:pk
1 // SPDX-License-Identifier: GPL-2.0-or-later
16 struct list_head head; /* anchor into dir->list or dir->quarantine */
40 return ERR_PTR(-ENOMEM); in ref_tracker_get_stats()
41 stats->total = 0; in ref_tracker_get_stats()
42 stats->count = 0; in ref_tracker_get_stats()
44 list_for_each_entry(tracker, &dir->list, head) { in ref_tracker_get_stats()
45 depot_stack_handle_t stack = tracker->alloc_stack_handle; in ref_tracker_get_stats()
48 ++stats->total; in ref_tracker_get_stats()
49 for (i = 0; i < stats->count; ++i) in ref_tracker_get_stats()
50 if (stats->stacks[i].stack_handle == stack) in ref_tracker_get_stats()
54 if (i >= stats->count) { in ref_tracker_get_stats()
55 stats->stacks[i].stack_handle = stack; in ref_tracker_get_stats()
56 stats->stacks[i].count = 0; in ref_tracker_get_stats()
57 ++stats->count; in ref_tracker_get_stats()
59 ++stats->stacks[i].count; in ref_tracker_get_stats()
74 if (!_s->buf) { \
77 int ret, len = _s->size - _s->used; \
78 ret = snprintf(_s->buf + _s->used, len, pr_fmt(fmt), ##args); \
79 _s->used += min(ret, len); \
92 lockdep_assert_held(&dir->lock); in __ref_tracker_dir_pr_ostream()
94 if (list_empty(&dir->list)) in __ref_tracker_dir_pr_ostream()
99 pr_ostream(s, "%s@%pK: couldn't get stats, error %pe\n", in __ref_tracker_dir_pr_ostream()
100 dir->name, dir, stats); in __ref_tracker_dir_pr_ostream()
106 for (i = 0, skipped = stats->total; i < stats->count; ++i) { in __ref_tracker_dir_pr_ostream()
107 stack = stats->stacks[i].stack_handle; in __ref_tracker_dir_pr_ostream()
110 pr_ostream(s, "%s@%pK has %d/%d users at\n%s\n", dir->name, dir, in __ref_tracker_dir_pr_ostream()
111 stats->stacks[i].count, stats->total, sbuf); in __ref_tracker_dir_pr_ostream()
112 skipped -= stats->stacks[i].count; in __ref_tracker_dir_pr_ostream()
116 pr_ostream(s, "%s@%pK skipped reports about %d/%d users.\n", in __ref_tracker_dir_pr_ostream()
117 dir->name, dir, skipped, stats->total); in __ref_tracker_dir_pr_ostream()
138 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_print()
140 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_print()
149 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_snprint()
151 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_snprint()
163 dir->dead = true; in ref_tracker_dir_exit()
164 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_exit()
165 list_for_each_entry_safe(tracker, n, &dir->quarantine, head) { in ref_tracker_dir_exit()
166 list_del(&tracker->head); in ref_tracker_dir_exit()
168 dir->quarantine_avail++; in ref_tracker_dir_exit()
170 if (!list_empty(&dir->list)) { in ref_tracker_dir_exit()
173 list_for_each_entry_safe(tracker, n, &dir->list, head) { in ref_tracker_dir_exit()
174 list_del(&tracker->head); in ref_tracker_dir_exit()
178 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_exit()
180 WARN_ON_ONCE(refcount_read(&dir->untracked) != 1); in ref_tracker_dir_exit()
181 WARN_ON_ONCE(refcount_read(&dir->no_tracker) != 1); in ref_tracker_dir_exit()
195 WARN_ON_ONCE(dir->dead); in ref_tracker_alloc()
198 refcount_inc(&dir->no_tracker); in ref_tracker_alloc()
206 refcount_inc(&dir->untracked); in ref_tracker_alloc()
207 return -ENOMEM; in ref_tracker_alloc()
210 tracker->alloc_stack_handle = stack_depot_save(entries, nr_entries, gfp); in ref_tracker_alloc()
212 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_alloc()
213 list_add(&tracker->head, &dir->list); in ref_tracker_alloc()
214 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_alloc()
228 WARN_ON_ONCE(dir->dead); in ref_tracker_free()
231 refcount_dec(&dir->no_tracker); in ref_tracker_free()
236 refcount_dec(&dir->untracked); in ref_tracker_free()
237 return -EEXIST; in ref_tracker_free()
243 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_free()
244 if (tracker->dead) { in ref_tracker_free()
246 if (tracker->alloc_stack_handle) { in ref_tracker_free()
248 stack_depot_print(tracker->alloc_stack_handle); in ref_tracker_free()
250 if (tracker->free_stack_handle) { in ref_tracker_free()
252 stack_depot_print(tracker->free_stack_handle); in ref_tracker_free()
254 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_free()
256 return -EINVAL; in ref_tracker_free()
258 tracker->dead = true; in ref_tracker_free()
260 tracker->free_stack_handle = stack_handle; in ref_tracker_free()
262 list_move_tail(&tracker->head, &dir->quarantine); in ref_tracker_free()
263 if (!dir->quarantine_avail) { in ref_tracker_free()
264 tracker = list_first_entry(&dir->quarantine, struct ref_tracker, head); in ref_tracker_free()
265 list_del(&tracker->head); in ref_tracker_free()
267 dir->quarantine_avail--; in ref_tracker_free()
270 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_free()