Lines Matching refs:dir
51 static inline void ref_tracker_debugfs_mark(struct ref_tracker_dir *dir) in ref_tracker_debugfs_mark() argument
56 __xa_set_mark(&debugfs_dentries, (unsigned long)dir, REF_TRACKER_DIR_DEAD); in ref_tracker_debugfs_mark()
60 __xa_set_mark(&debugfs_symlinks, (unsigned long)dir, REF_TRACKER_DIR_DEAD); in ref_tracker_debugfs_mark()
66 static inline void ref_tracker_debugfs_mark(struct ref_tracker_dir *dir) in ref_tracker_debugfs_mark() argument
72 ref_tracker_get_stats(struct ref_tracker_dir *dir, unsigned int limit) in ref_tracker_get_stats() argument
84 list_for_each_entry(tracker, &dir->list, head) { in ref_tracker_get_stats()
142 __ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir, in __ref_tracker_dir_pr_ostream() argument
150 lockdep_assert_held(&dir->lock); in __ref_tracker_dir_pr_ostream()
152 if (list_empty(&dir->list)) in __ref_tracker_dir_pr_ostream()
155 stats = ref_tracker_get_stats(dir, display_limit); in __ref_tracker_dir_pr_ostream()
158 s->prefix, dir->class, dir, stats); in __ref_tracker_dir_pr_ostream()
169 dir->class, dir, stats->stacks[i].count, in __ref_tracker_dir_pr_ostream()
176 s->prefix, dir->class, dir, skipped, stats->total); in __ref_tracker_dir_pr_ostream()
183 void ref_tracker_dir_print_locked(struct ref_tracker_dir *dir, in ref_tracker_dir_print_locked() argument
189 __ref_tracker_dir_pr_ostream(dir, display_limit, &os); in ref_tracker_dir_print_locked()
193 void ref_tracker_dir_print(struct ref_tracker_dir *dir, in ref_tracker_dir_print() argument
198 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_print()
199 ref_tracker_dir_print_locked(dir, display_limit); in ref_tracker_dir_print()
200 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_print()
204 int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t size) in ref_tracker_dir_snprint() argument
212 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_snprint()
213 __ref_tracker_dir_pr_ostream(dir, 16, &os); in ref_tracker_dir_snprint()
214 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_snprint()
220 void ref_tracker_dir_exit(struct ref_tracker_dir *dir) in ref_tracker_dir_exit() argument
226 dir->dead = true; in ref_tracker_dir_exit()
231 ref_tracker_debugfs_mark(dir); in ref_tracker_dir_exit()
232 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_exit()
233 list_for_each_entry_safe(tracker, n, &dir->quarantine, head) { in ref_tracker_dir_exit()
236 dir->quarantine_avail++; in ref_tracker_dir_exit()
238 if (!list_empty(&dir->list)) { in ref_tracker_dir_exit()
239 ref_tracker_dir_print_locked(dir, 16); in ref_tracker_dir_exit()
241 list_for_each_entry_safe(tracker, n, &dir->list, head) { in ref_tracker_dir_exit()
246 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_exit()
248 WARN_ON_ONCE(refcount_read(&dir->untracked) != 1); in ref_tracker_dir_exit()
249 WARN_ON_ONCE(refcount_read(&dir->no_tracker) != 1); in ref_tracker_dir_exit()
253 int ref_tracker_alloc(struct ref_tracker_dir *dir, in ref_tracker_alloc() argument
263 WARN_ON_ONCE(dir->dead); in ref_tracker_alloc()
266 refcount_inc(&dir->no_tracker); in ref_tracker_alloc()
274 refcount_inc(&dir->untracked); in ref_tracker_alloc()
280 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_alloc()
281 list_add(&tracker->head, &dir->list); in ref_tracker_alloc()
282 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_alloc()
287 int ref_tracker_free(struct ref_tracker_dir *dir, in ref_tracker_free() argument
296 WARN_ON_ONCE(dir->dead); in ref_tracker_free()
299 refcount_dec(&dir->no_tracker); in ref_tracker_free()
304 refcount_dec(&dir->untracked); in ref_tracker_free()
311 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_free()
322 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_free()
330 list_move_tail(&tracker->head, &dir->quarantine); in ref_tracker_free()
331 if (!dir->quarantine_avail) { in ref_tracker_free()
332 tracker = list_first_entry(&dir->quarantine, struct ref_tracker, head); in ref_tracker_free()
335 dir->quarantine_avail--; in ref_tracker_free()
338 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_free()
359 static int ref_tracker_dir_seq_print(struct ref_tracker_dir *dir, struct seq_file *seq) in ref_tracker_dir_seq_print() argument
365 __ref_tracker_dir_pr_ostream(dir, 16, &os); in ref_tracker_dir_seq_print()
372 struct ref_tracker_dir *dir = f->private; in ref_tracker_debugfs_show() local
373 unsigned long index = (unsigned long)dir; in ref_tracker_debugfs_show()
395 spin_lock(&dir->lock); in ref_tracker_debugfs_show()
397 ret = ref_tracker_dir_seq_print(dir, f); in ref_tracker_debugfs_show()
398 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_debugfs_show()
404 struct ref_tracker_dir *dir = inode->i_private; in ref_tracker_debugfs_open() local
406 return single_open(filp, ref_tracker_debugfs_show, dir); in ref_tracker_debugfs_open()
426 void ref_tracker_dir_debugfs(struct ref_tracker_dir *dir) in ref_tracker_dir_debugfs() argument
433 dentry = xa_load(&debugfs_dentries, (unsigned long)dir); in ref_tracker_dir_debugfs()
437 ret = snprintf(name, sizeof(name), "%s@%p", dir->class, dir); in ref_tracker_dir_debugfs()
442 ref_tracker_debug_dir, dir, in ref_tracker_dir_debugfs()
447 old = xa_store_irq(&debugfs_dentries, (unsigned long)dir, in ref_tracker_dir_debugfs()
459 void __ostream_printf ref_tracker_dir_symlink(struct ref_tracker_dir *dir, const char *fmt, ...) in ref_tracker_dir_symlink() argument
466 symlink = xa_load(&debugfs_symlinks, (unsigned long)dir); in ref_tracker_dir_symlink()
467 dentry = xa_load(&debugfs_dentries, (unsigned long)dir); in ref_tracker_dir_symlink()
487 old = xa_store_irq(&debugfs_symlinks, (unsigned long)dir, in ref_tracker_dir_symlink()