ref_tracker.c 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #define pr_fmt(fmt) "ref_tracker: " fmt
  3. #include <linux/export.h>
  4. #include <linux/list_sort.h>
  5. #include <linux/ref_tracker.h>
  6. #include <linux/slab.h>
  7. #include <linux/stacktrace.h>
  8. #include <linux/stackdepot.h>
  9. #include <linux/seq_file.h>
  10. #define REF_TRACKER_STACK_ENTRIES 16
  11. #define STACK_BUF_SIZE 1024
  12. struct ref_tracker {
  13. struct list_head head; /* anchor into dir->list or dir->quarantine */
  14. bool dead;
  15. depot_stack_handle_t alloc_stack_handle;
  16. depot_stack_handle_t free_stack_handle;
  17. };
  18. struct ref_tracker_dir_stats {
  19. int total;
  20. int count;
  21. struct {
  22. depot_stack_handle_t stack_handle;
  23. unsigned int count;
  24. } stacks[];
  25. };
  26. #ifdef CONFIG_DEBUG_FS
  27. #include <linux/xarray.h>
  28. /*
  29. * ref_tracker_dir_init() is usually called in allocation-safe contexts, but
  30. * the same is not true of ref_tracker_dir_exit() which can be called from
  31. * anywhere an object is freed. Removing debugfs dentries is a blocking
  32. * operation, so we defer that work to the debugfs_reap_worker.
  33. *
  34. * Each dentry is tracked in the appropriate xarray. When
  35. * ref_tracker_dir_exit() is called, its entries in the xarrays are marked and
  36. * the workqueue job is scheduled. The worker then runs and deletes any marked
  37. * dentries asynchronously.
  38. */
  39. static struct xarray debugfs_dentries;
  40. static struct xarray debugfs_symlinks;
  41. static struct work_struct debugfs_reap_worker;
  42. #define REF_TRACKER_DIR_DEAD XA_MARK_0
  43. static inline void ref_tracker_debugfs_mark(struct ref_tracker_dir *dir)
  44. {
  45. unsigned long flags;
  46. xa_lock_irqsave(&debugfs_dentries, flags);
  47. __xa_set_mark(&debugfs_dentries, (unsigned long)dir, REF_TRACKER_DIR_DEAD);
  48. xa_unlock_irqrestore(&debugfs_dentries, flags);
  49. xa_lock_irqsave(&debugfs_symlinks, flags);
  50. __xa_set_mark(&debugfs_symlinks, (unsigned long)dir, REF_TRACKER_DIR_DEAD);
  51. xa_unlock_irqrestore(&debugfs_symlinks, flags);
  52. schedule_work(&debugfs_reap_worker);
  53. }
  54. #else
  55. static inline void ref_tracker_debugfs_mark(struct ref_tracker_dir *dir)
  56. {
  57. }
  58. #endif
  59. static struct ref_tracker_dir_stats *
  60. ref_tracker_get_stats(struct ref_tracker_dir *dir, unsigned int limit)
  61. {
  62. struct ref_tracker_dir_stats *stats;
  63. struct ref_tracker *tracker;
  64. stats = kmalloc_flex(*stats, stacks, limit, GFP_NOWAIT);
  65. if (!stats)
  66. return ERR_PTR(-ENOMEM);
  67. stats->total = 0;
  68. stats->count = 0;
  69. list_for_each_entry(tracker, &dir->list, head) {
  70. depot_stack_handle_t stack = tracker->alloc_stack_handle;
  71. int i;
  72. ++stats->total;
  73. for (i = 0; i < stats->count; ++i)
  74. if (stats->stacks[i].stack_handle == stack)
  75. break;
  76. if (i >= limit)
  77. continue;
  78. if (i >= stats->count) {
  79. stats->stacks[i].stack_handle = stack;
  80. stats->stacks[i].count = 0;
  81. ++stats->count;
  82. }
  83. ++stats->stacks[i].count;
  84. }
  85. return stats;
  86. }
  87. struct ostream {
  88. void __ostream_printf (*func)(struct ostream *stream, char *fmt, ...);
  89. char *prefix;
  90. char *buf;
  91. struct seq_file *seq;
  92. int size, used;
  93. };
  94. static void __ostream_printf pr_ostream_log(struct ostream *stream, char *fmt, ...)
  95. {
  96. va_list args;
  97. va_start(args, fmt);
  98. vprintk(fmt, args);
  99. va_end(args);
  100. }
  101. static void __ostream_printf pr_ostream_buf(struct ostream *stream, char *fmt, ...)
  102. {
  103. int ret, len = stream->size - stream->used;
  104. va_list args;
  105. va_start(args, fmt);
  106. ret = vsnprintf(stream->buf + stream->used, len, fmt, args);
  107. va_end(args);
  108. if (ret > 0)
  109. stream->used += min(ret, len);
  110. }
  111. #define pr_ostream(stream, fmt, args...) \
  112. ({ \
  113. struct ostream *_s = (stream); \
  114. \
  115. _s->func(_s, fmt, ##args); \
  116. })
  117. static void
  118. __ref_tracker_dir_pr_ostream(struct ref_tracker_dir *dir,
  119. unsigned int display_limit, struct ostream *s)
  120. {
  121. struct ref_tracker_dir_stats *stats;
  122. unsigned int i = 0, skipped;
  123. depot_stack_handle_t stack;
  124. char *sbuf;
  125. lockdep_assert_held(&dir->lock);
  126. if (list_empty(&dir->list))
  127. return;
  128. stats = ref_tracker_get_stats(dir, display_limit);
  129. if (IS_ERR(stats)) {
  130. pr_ostream(s, "%s%s@%p: couldn't get stats, error %pe\n",
  131. s->prefix, dir->class, dir, stats);
  132. return;
  133. }
  134. sbuf = kmalloc(STACK_BUF_SIZE, GFP_NOWAIT);
  135. for (i = 0, skipped = stats->total; i < stats->count; ++i) {
  136. stack = stats->stacks[i].stack_handle;
  137. if (sbuf && !stack_depot_snprint(stack, sbuf, STACK_BUF_SIZE, 4))
  138. sbuf[0] = 0;
  139. pr_ostream(s, "%s%s@%p has %d/%d users at\n%s\n", s->prefix,
  140. dir->class, dir, stats->stacks[i].count,
  141. stats->total, sbuf);
  142. skipped -= stats->stacks[i].count;
  143. }
  144. if (skipped)
  145. pr_ostream(s, "%s%s@%p skipped reports about %d/%d users.\n",
  146. s->prefix, dir->class, dir, skipped, stats->total);
  147. kfree(sbuf);
  148. kfree(stats);
  149. }
  150. void ref_tracker_dir_print_locked(struct ref_tracker_dir *dir,
  151. unsigned int display_limit)
  152. {
  153. struct ostream os = { .func = pr_ostream_log,
  154. .prefix = "ref_tracker: " };
  155. __ref_tracker_dir_pr_ostream(dir, display_limit, &os);
  156. }
  157. EXPORT_SYMBOL(ref_tracker_dir_print_locked);
  158. void ref_tracker_dir_print(struct ref_tracker_dir *dir,
  159. unsigned int display_limit)
  160. {
  161. unsigned long flags;
  162. spin_lock_irqsave(&dir->lock, flags);
  163. ref_tracker_dir_print_locked(dir, display_limit);
  164. spin_unlock_irqrestore(&dir->lock, flags);
  165. }
  166. EXPORT_SYMBOL(ref_tracker_dir_print);
  167. int ref_tracker_dir_snprint(struct ref_tracker_dir *dir, char *buf, size_t size)
  168. {
  169. struct ostream os = { .func = pr_ostream_buf,
  170. .prefix = "ref_tracker: ",
  171. .buf = buf,
  172. .size = size };
  173. unsigned long flags;
  174. spin_lock_irqsave(&dir->lock, flags);
  175. __ref_tracker_dir_pr_ostream(dir, 16, &os);
  176. spin_unlock_irqrestore(&dir->lock, flags);
  177. return os.used;
  178. }
  179. EXPORT_SYMBOL(ref_tracker_dir_snprint);
  180. void ref_tracker_dir_exit(struct ref_tracker_dir *dir)
  181. {
  182. struct ref_tracker *tracker, *n;
  183. unsigned long flags;
  184. bool leak = false;
  185. dir->dead = true;
  186. /*
  187. * The xarray entries must be marked before the dir->lock is taken to
  188. * protect simultaneous debugfs readers.
  189. */
  190. ref_tracker_debugfs_mark(dir);
  191. spin_lock_irqsave(&dir->lock, flags);
  192. list_for_each_entry_safe(tracker, n, &dir->quarantine, head) {
  193. list_del(&tracker->head);
  194. kfree(tracker);
  195. dir->quarantine_avail++;
  196. }
  197. if (!list_empty(&dir->list)) {
  198. ref_tracker_dir_print_locked(dir, 16);
  199. leak = true;
  200. list_for_each_entry_safe(tracker, n, &dir->list, head) {
  201. list_del(&tracker->head);
  202. kfree(tracker);
  203. }
  204. }
  205. spin_unlock_irqrestore(&dir->lock, flags);
  206. WARN_ON_ONCE(leak);
  207. WARN_ON_ONCE(refcount_read(&dir->untracked) != 1);
  208. WARN_ON_ONCE(refcount_read(&dir->no_tracker) != 1);
  209. }
  210. EXPORT_SYMBOL(ref_tracker_dir_exit);
  211. int ref_tracker_alloc(struct ref_tracker_dir *dir,
  212. struct ref_tracker **trackerp,
  213. gfp_t gfp)
  214. {
  215. unsigned long entries[REF_TRACKER_STACK_ENTRIES];
  216. struct ref_tracker *tracker;
  217. unsigned int nr_entries;
  218. gfp_t gfp_mask = gfp | __GFP_NOWARN;
  219. unsigned long flags;
  220. WARN_ON_ONCE(dir->dead);
  221. if (!trackerp) {
  222. refcount_inc(&dir->no_tracker);
  223. return 0;
  224. }
  225. if (gfp & __GFP_DIRECT_RECLAIM)
  226. gfp_mask |= __GFP_NOFAIL;
  227. *trackerp = tracker = kzalloc_obj(*tracker, gfp_mask);
  228. if (unlikely(!tracker)) {
  229. pr_err_once("memory allocation failure, unreliable refcount tracker.\n");
  230. refcount_inc(&dir->untracked);
  231. return -ENOMEM;
  232. }
  233. nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
  234. tracker->alloc_stack_handle = stack_depot_save(entries, nr_entries, gfp);
  235. spin_lock_irqsave(&dir->lock, flags);
  236. list_add(&tracker->head, &dir->list);
  237. spin_unlock_irqrestore(&dir->lock, flags);
  238. return 0;
  239. }
  240. EXPORT_SYMBOL_GPL(ref_tracker_alloc);
  241. int ref_tracker_free(struct ref_tracker_dir *dir,
  242. struct ref_tracker **trackerp)
  243. {
  244. unsigned long entries[REF_TRACKER_STACK_ENTRIES];
  245. depot_stack_handle_t stack_handle;
  246. struct ref_tracker *tracker;
  247. unsigned int nr_entries;
  248. unsigned long flags;
  249. WARN_ON_ONCE(dir->dead);
  250. if (!trackerp) {
  251. refcount_dec(&dir->no_tracker);
  252. return 0;
  253. }
  254. tracker = *trackerp;
  255. if (!tracker) {
  256. refcount_dec(&dir->untracked);
  257. return -EEXIST;
  258. }
  259. nr_entries = stack_trace_save(entries, ARRAY_SIZE(entries), 1);
  260. stack_handle = stack_depot_save(entries, nr_entries,
  261. GFP_NOWAIT);
  262. spin_lock_irqsave(&dir->lock, flags);
  263. if (tracker->dead) {
  264. pr_err("reference already released.\n");
  265. if (tracker->alloc_stack_handle) {
  266. pr_err("allocated in:\n");
  267. stack_depot_print(tracker->alloc_stack_handle);
  268. }
  269. if (tracker->free_stack_handle) {
  270. pr_err("freed in:\n");
  271. stack_depot_print(tracker->free_stack_handle);
  272. }
  273. spin_unlock_irqrestore(&dir->lock, flags);
  274. WARN_ON_ONCE(1);
  275. return -EINVAL;
  276. }
  277. tracker->dead = true;
  278. tracker->free_stack_handle = stack_handle;
  279. list_move_tail(&tracker->head, &dir->quarantine);
  280. if (!dir->quarantine_avail) {
  281. tracker = list_first_entry(&dir->quarantine, struct ref_tracker, head);
  282. list_del(&tracker->head);
  283. } else {
  284. dir->quarantine_avail--;
  285. tracker = NULL;
  286. }
  287. spin_unlock_irqrestore(&dir->lock, flags);
  288. kfree(tracker);
  289. return 0;
  290. }
  291. EXPORT_SYMBOL_GPL(ref_tracker_free);
  292. #ifdef CONFIG_DEBUG_FS
  293. #include <linux/debugfs.h>
  294. static struct dentry *ref_tracker_debug_dir = (struct dentry *)-ENOENT;
  295. static void __ostream_printf pr_ostream_seq(struct ostream *stream, char *fmt, ...)
  296. {
  297. va_list args;
  298. va_start(args, fmt);
  299. seq_vprintf(stream->seq, fmt, args);
  300. va_end(args);
  301. }
  302. static int ref_tracker_dir_seq_print(struct ref_tracker_dir *dir, struct seq_file *seq)
  303. {
  304. struct ostream os = { .func = pr_ostream_seq,
  305. .prefix = "",
  306. .seq = seq };
  307. __ref_tracker_dir_pr_ostream(dir, 16, &os);
  308. return os.used;
  309. }
  310. static int ref_tracker_debugfs_show(struct seq_file *f, void *v)
  311. {
  312. struct ref_tracker_dir *dir = f->private;
  313. unsigned long index = (unsigned long)dir;
  314. unsigned long flags;
  315. int ret;
  316. /*
  317. * "dir" may not exist at this point if ref_tracker_dir_exit() has
  318. * already been called. Take care not to dereference it until its
  319. * legitimacy is established.
  320. *
  321. * The xa_lock is necessary to ensure that "dir" doesn't disappear
  322. * before its lock can be taken. If it's in the hash and not marked
  323. * dead, then it's safe to take dir->lock which prevents
  324. * ref_tracker_dir_exit() from completing. Once the dir->lock is
  325. * acquired, the xa_lock can be released. All of this must be IRQ-safe.
  326. */
  327. xa_lock_irqsave(&debugfs_dentries, flags);
  328. if (!xa_load(&debugfs_dentries, index) ||
  329. xa_get_mark(&debugfs_dentries, index, REF_TRACKER_DIR_DEAD)) {
  330. xa_unlock_irqrestore(&debugfs_dentries, flags);
  331. return -ENODATA;
  332. }
  333. spin_lock(&dir->lock);
  334. xa_unlock(&debugfs_dentries);
  335. ret = ref_tracker_dir_seq_print(dir, f);
  336. spin_unlock_irqrestore(&dir->lock, flags);
  337. return ret;
  338. }
  339. static int ref_tracker_debugfs_open(struct inode *inode, struct file *filp)
  340. {
  341. struct ref_tracker_dir *dir = inode->i_private;
  342. return single_open(filp, ref_tracker_debugfs_show, dir);
  343. }
  344. static const struct file_operations ref_tracker_debugfs_fops = {
  345. .owner = THIS_MODULE,
  346. .open = ref_tracker_debugfs_open,
  347. .read = seq_read,
  348. .llseek = seq_lseek,
  349. .release = single_release,
  350. };
  351. /**
  352. * ref_tracker_dir_debugfs - create debugfs file for ref_tracker_dir
  353. * @dir: ref_tracker_dir to be associated with debugfs file
  354. *
  355. * In most cases, a debugfs file will be created automatically for every
  356. * ref_tracker_dir. If the object was created before debugfs is brought up
  357. * then that may fail. In those cases, it is safe to call this at a later
  358. * time to create the file.
  359. */
  360. void ref_tracker_dir_debugfs(struct ref_tracker_dir *dir)
  361. {
  362. char name[NAME_MAX + 1];
  363. struct dentry *dentry;
  364. int ret;
  365. /* No-op if already created */
  366. dentry = xa_load(&debugfs_dentries, (unsigned long)dir);
  367. if (dentry && !xa_is_err(dentry))
  368. return;
  369. ret = snprintf(name, sizeof(name), "%s@%p", dir->class, dir);
  370. name[sizeof(name) - 1] = '\0';
  371. if (ret < sizeof(name)) {
  372. dentry = debugfs_create_file(name, S_IFREG | 0400,
  373. ref_tracker_debug_dir, dir,
  374. &ref_tracker_debugfs_fops);
  375. if (!IS_ERR(dentry)) {
  376. void *old;
  377. old = xa_store_irq(&debugfs_dentries, (unsigned long)dir,
  378. dentry, GFP_KERNEL);
  379. if (xa_is_err(old))
  380. debugfs_remove(dentry);
  381. else
  382. WARN_ON_ONCE(old);
  383. }
  384. }
  385. }
  386. EXPORT_SYMBOL(ref_tracker_dir_debugfs);
  387. void __ostream_printf ref_tracker_dir_symlink(struct ref_tracker_dir *dir, const char *fmt, ...)
  388. {
  389. char name[NAME_MAX + 1];
  390. struct dentry *symlink, *dentry;
  391. va_list args;
  392. int ret;
  393. symlink = xa_load(&debugfs_symlinks, (unsigned long)dir);
  394. dentry = xa_load(&debugfs_dentries, (unsigned long)dir);
  395. /* Already created?*/
  396. if (symlink && !xa_is_err(symlink))
  397. return;
  398. if (!dentry || xa_is_err(dentry))
  399. return;
  400. va_start(args, fmt);
  401. ret = vsnprintf(name, sizeof(name), fmt, args);
  402. va_end(args);
  403. name[sizeof(name) - 1] = '\0';
  404. if (ret < sizeof(name)) {
  405. symlink = debugfs_create_symlink(name, ref_tracker_debug_dir,
  406. dentry->d_name.name);
  407. if (!IS_ERR(symlink)) {
  408. void *old;
  409. old = xa_store_irq(&debugfs_symlinks, (unsigned long)dir,
  410. symlink, GFP_KERNEL);
  411. if (xa_is_err(old))
  412. debugfs_remove(symlink);
  413. else
  414. WARN_ON_ONCE(old);
  415. }
  416. }
  417. }
  418. EXPORT_SYMBOL(ref_tracker_dir_symlink);
  419. static void debugfs_reap_work(struct work_struct *work)
  420. {
  421. struct dentry *dentry;
  422. unsigned long index;
  423. bool reaped;
  424. do {
  425. reaped = false;
  426. xa_for_each_marked(&debugfs_symlinks, index, dentry, REF_TRACKER_DIR_DEAD) {
  427. xa_erase_irq(&debugfs_symlinks, index);
  428. debugfs_remove(dentry);
  429. reaped = true;
  430. }
  431. xa_for_each_marked(&debugfs_dentries, index, dentry, REF_TRACKER_DIR_DEAD) {
  432. xa_erase_irq(&debugfs_dentries, index);
  433. debugfs_remove(dentry);
  434. reaped = true;
  435. }
  436. } while (reaped);
  437. }
  438. static int __init ref_tracker_debugfs_postcore_init(void)
  439. {
  440. INIT_WORK(&debugfs_reap_worker, debugfs_reap_work);
  441. xa_init_flags(&debugfs_dentries, XA_FLAGS_LOCK_IRQ);
  442. xa_init_flags(&debugfs_symlinks, XA_FLAGS_LOCK_IRQ);
  443. return 0;
  444. }
  445. postcore_initcall(ref_tracker_debugfs_postcore_init);
  446. static int __init ref_tracker_debugfs_late_init(void)
  447. {
  448. ref_tracker_debug_dir = debugfs_create_dir("ref_tracker", NULL);
  449. return 0;
  450. }
  451. late_initcall(ref_tracker_debugfs_late_init);
  452. #endif /* CONFIG_DEBUG_FS */