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
83 list_for_each_entry(tracker, &dir->list, head) { in ref_tracker_get_stats()
141 __ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir, in __ref_tracker_dir_pr_ostream() argument
149 lockdep_assert_held(&dir->lock); in __ref_tracker_dir_pr_ostream()
151 if (list_empty(&dir->list)) in __ref_tracker_dir_pr_ostream()
154 stats = ref_tracker_get_stats(dir, display_limit); in __ref_tracker_dir_pr_ostream()
157 s->prefix, dir->class, dir, stats); in __ref_tracker_dir_pr_ostream()
168 dir->class, dir, stats->stacks[i].count, in __ref_tracker_dir_pr_ostream()
175 s->prefix, dir->class, dir, skipped, stats->total); in __ref_tracker_dir_pr_ostream()
182 void ref_tracker_dir_print_locked(struct ref_tracker_dir *dir, in ref_tracker_dir_print_locked() argument
188 __ref_tracker_dir_pr_ostream(dir, display_limit, &os); in ref_tracker_dir_print_locked()
192 void ref_tracker_dir_print(struct ref_tracker_dir *dir, in ref_tracker_dir_print() argument
197 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_print()
198 ref_tracker_dir_print_locked(dir, display_limit); in ref_tracker_dir_print()
199 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_print()
203 int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t size) in ref_tracker_dir_snprint() argument
211 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_snprint()
212 __ref_tracker_dir_pr_ostream(dir, 16, &os); in ref_tracker_dir_snprint()
213 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_snprint()
219 void ref_tracker_dir_exit(struct ref_tracker_dir *dir) in ref_tracker_dir_exit() argument
225 dir->dead = true; in ref_tracker_dir_exit()
230 ref_tracker_debugfs_mark(dir); in ref_tracker_dir_exit()
231 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_dir_exit()
232 list_for_each_entry_safe(tracker, n, &dir->quarantine, head) { in ref_tracker_dir_exit()
235 dir->quarantine_avail++; in ref_tracker_dir_exit()
237 if (!list_empty(&dir->list)) { in ref_tracker_dir_exit()
238 ref_tracker_dir_print_locked(dir, 16); in ref_tracker_dir_exit()
240 list_for_each_entry_safe(tracker, n, &dir->list, head) { in ref_tracker_dir_exit()
245 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_dir_exit()
247 WARN_ON_ONCE(refcount_read(&dir->untracked) != 1); in ref_tracker_dir_exit()
248 WARN_ON_ONCE(refcount_read(&dir->no_tracker) != 1); in ref_tracker_dir_exit()
252 int ref_tracker_alloc(struct ref_tracker_dir *dir, in ref_tracker_alloc() argument
262 WARN_ON_ONCE(dir->dead); in ref_tracker_alloc()
265 refcount_inc(&dir->no_tracker); in ref_tracker_alloc()
273 refcount_inc(&dir->untracked); in ref_tracker_alloc()
279 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_alloc()
280 list_add(&tracker->head, &dir->list); in ref_tracker_alloc()
281 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_alloc()
286 int ref_tracker_free(struct ref_tracker_dir *dir, in ref_tracker_free() argument
295 WARN_ON_ONCE(dir->dead); in ref_tracker_free()
298 refcount_dec(&dir->no_tracker); in ref_tracker_free()
303 refcount_dec(&dir->untracked); in ref_tracker_free()
310 spin_lock_irqsave(&dir->lock, flags); in ref_tracker_free()
321 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_free()
329 list_move_tail(&tracker->head, &dir->quarantine); in ref_tracker_free()
330 if (!dir->quarantine_avail) { in ref_tracker_free()
331 tracker = list_first_entry(&dir->quarantine, struct ref_tracker, head); in ref_tracker_free()
334 dir->quarantine_avail--; in ref_tracker_free()
337 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_free()
358 static int ref_tracker_dir_seq_print(struct ref_tracker_dir *dir, struct seq_file *seq) in ref_tracker_dir_seq_print() argument
364 __ref_tracker_dir_pr_ostream(dir, 16, &os); in ref_tracker_dir_seq_print()
371 struct ref_tracker_dir *dir = f->private; in ref_tracker_debugfs_show() local
372 unsigned long index = (unsigned long)dir; in ref_tracker_debugfs_show()
394 spin_lock(&dir->lock); in ref_tracker_debugfs_show()
396 ret = ref_tracker_dir_seq_print(dir, f); in ref_tracker_debugfs_show()
397 spin_unlock_irqrestore(&dir->lock, flags); in ref_tracker_debugfs_show()
403 struct ref_tracker_dir *dir = inode->i_private; in ref_tracker_debugfs_open() local
405 return single_open(filp, ref_tracker_debugfs_show, dir); in ref_tracker_debugfs_open()
425 void ref_tracker_dir_debugfs(struct ref_tracker_dir *dir) in ref_tracker_dir_debugfs() argument
432 dentry = xa_load(&debugfs_dentries, (unsigned long)dir); in ref_tracker_dir_debugfs()
436 ret = snprintf(name, sizeof(name), "%s@%p", dir->class, dir); in ref_tracker_dir_debugfs()
441 ref_tracker_debug_dir, dir, in ref_tracker_dir_debugfs()
446 old = xa_store_irq(&debugfs_dentries, (unsigned long)dir, in ref_tracker_dir_debugfs()
458 void __ostream_printf ref_tracker_dir_symlink(struct ref_tracker_dir *dir, const char *fmt, ...) in ref_tracker_dir_symlink() argument
465 symlink = xa_load(&debugfs_symlinks, (unsigned long)dir); in ref_tracker_dir_symlink()
466 dentry = xa_load(&debugfs_dentries, (unsigned long)dir); in ref_tracker_dir_symlink()
486 old = xa_store_irq(&debugfs_symlinks, (unsigned long)dir, in ref_tracker_dir_symlink()