debug.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * mm/debug.c
  4. *
  5. * mm/ specific debug routines.
  6. *
  7. */
  8. #include <linux/kernel.h>
  9. #include <linux/mm.h>
  10. #include <linux/trace_events.h>
  11. #include <linux/memcontrol.h>
  12. #include <trace/events/mmflags.h>
  13. #include <linux/migrate.h>
  14. #include <linux/page_owner.h>
  15. #include <linux/ctype.h>
  16. #include "internal.h"
  17. #include <trace/events/migrate.h>
  18. /*
  19. * Define EM() and EMe() so that MIGRATE_REASON from trace/events/migrate.h can
  20. * be used to populate migrate_reason_names[].
  21. */
  22. #undef EM
  23. #undef EMe
  24. #define EM(a, b) b,
  25. #define EMe(a, b) b
  26. const char *migrate_reason_names[MR_TYPES] = {
  27. MIGRATE_REASON
  28. };
  29. const struct trace_print_flags pageflag_names[] = {
  30. __def_pageflag_names,
  31. {0, NULL}
  32. };
  33. const struct trace_print_flags gfpflag_names[] = {
  34. __def_gfpflag_names,
  35. {0, NULL}
  36. };
  37. const struct trace_print_flags vmaflag_names[] = {
  38. __def_vmaflag_names,
  39. {0, NULL}
  40. };
  41. #define DEF_PAGETYPE_NAME(_name) [PGTY_##_name - 0xf0] = __stringify(_name)
  42. static const char *page_type_names[] = {
  43. DEF_PAGETYPE_NAME(slab),
  44. DEF_PAGETYPE_NAME(hugetlb),
  45. DEF_PAGETYPE_NAME(offline),
  46. DEF_PAGETYPE_NAME(guard),
  47. DEF_PAGETYPE_NAME(table),
  48. DEF_PAGETYPE_NAME(buddy),
  49. DEF_PAGETYPE_NAME(unaccepted),
  50. };
  51. static const char *page_type_name(unsigned int page_type)
  52. {
  53. unsigned i = (page_type >> 24) - 0xf0;
  54. if (i >= ARRAY_SIZE(page_type_names))
  55. return "unknown";
  56. return page_type_names[i];
  57. }
  58. static void __dump_folio(const struct folio *folio, const struct page *page,
  59. unsigned long pfn, unsigned long idx)
  60. {
  61. struct address_space *mapping = folio_mapping(folio);
  62. int mapcount = atomic_read(&page->_mapcount) + 1;
  63. char *type = "";
  64. if (page_mapcount_is_type(mapcount))
  65. mapcount = 0;
  66. pr_warn("page: refcount:%d mapcount:%d mapping:%p index:%#lx pfn:%#lx\n",
  67. folio_ref_count(folio), mapcount, mapping,
  68. folio->index + idx, pfn);
  69. if (folio_test_large(folio)) {
  70. int pincount = 0;
  71. if (folio_has_pincount(folio))
  72. pincount = atomic_read(&folio->_pincount);
  73. pr_warn("head: order:%u mapcount:%d entire_mapcount:%d nr_pages_mapped:%d pincount:%d\n",
  74. folio_order(folio),
  75. folio_mapcount(folio),
  76. folio_entire_mapcount(folio),
  77. folio_nr_pages_mapped(folio),
  78. pincount);
  79. }
  80. #ifdef CONFIG_MEMCG
  81. if (folio->memcg_data)
  82. pr_warn("memcg:%lx\n", folio->memcg_data);
  83. #endif
  84. if (folio_test_ksm(folio))
  85. type = "ksm ";
  86. else if (folio_test_anon(folio))
  87. type = "anon ";
  88. else if (mapping)
  89. dump_mapping(mapping);
  90. BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS + 1);
  91. /*
  92. * Accessing the pageblock without the zone lock. It could change to
  93. * "isolate" again in the meantime, but since we are just dumping the
  94. * state for debugging, it should be fine to accept a bit of
  95. * inaccuracy here due to racing.
  96. */
  97. pr_warn("%sflags: %pGp%s\n", type, &folio->flags,
  98. is_migrate_cma_folio(folio, pfn) ? " CMA" : "");
  99. if (page_has_type(&folio->page))
  100. pr_warn("page_type: %x(%s)\n", folio->page.page_type >> 24,
  101. page_type_name(folio->page.page_type));
  102. print_hex_dump(KERN_WARNING, "raw: ", DUMP_PREFIX_NONE, 32,
  103. sizeof(unsigned long), page,
  104. sizeof(struct page), false);
  105. if (folio_test_large(folio))
  106. print_hex_dump(KERN_WARNING, "head: ", DUMP_PREFIX_NONE, 32,
  107. sizeof(unsigned long), folio,
  108. 2 * sizeof(struct page), false);
  109. }
  110. static void __dump_page(const struct page *page)
  111. {
  112. struct page_snapshot ps;
  113. snapshot_page(&ps, page);
  114. if (!snapshot_page_is_faithful(&ps))
  115. pr_warn("page does not match folio\n");
  116. __dump_folio(&ps.folio_snapshot, &ps.page_snapshot, ps.pfn, ps.idx);
  117. }
  118. void dump_page(const struct page *page, const char *reason)
  119. {
  120. if (PagePoisoned(page))
  121. pr_warn("page:%p is uninitialized and poisoned\n", page);
  122. else
  123. __dump_page(page);
  124. if (reason)
  125. pr_warn("page dumped because: %s\n", reason);
  126. dump_page_owner(page);
  127. }
  128. EXPORT_SYMBOL(dump_page);
  129. #ifdef CONFIG_DEBUG_VM
  130. void dump_vma(const struct vm_area_struct *vma)
  131. {
  132. pr_emerg("vma %px start %px end %px mm %px\n"
  133. "prot %lx anon_vma %px vm_ops %px\n"
  134. "pgoff %lx file %px private_data %px\n"
  135. #ifdef CONFIG_PER_VMA_LOCK
  136. "refcnt %x\n"
  137. #endif
  138. "flags: %#lx(%pGv)\n",
  139. vma, (void *)vma->vm_start, (void *)vma->vm_end, vma->vm_mm,
  140. (unsigned long)pgprot_val(vma->vm_page_prot),
  141. vma->anon_vma, vma->vm_ops, vma->vm_pgoff,
  142. vma->vm_file, vma->vm_private_data,
  143. #ifdef CONFIG_PER_VMA_LOCK
  144. refcount_read(&vma->vm_refcnt),
  145. #endif
  146. vma->vm_flags, &vma->vm_flags);
  147. }
  148. EXPORT_SYMBOL(dump_vma);
  149. void dump_mm(const struct mm_struct *mm)
  150. {
  151. pr_emerg("mm %px task_size %lu\n"
  152. "mmap_base %lu mmap_legacy_base %lu\n"
  153. "pgd %px mm_users %d mm_count %d pgtables_bytes %lu map_count %d\n"
  154. "hiwater_rss %lx hiwater_vm %lx total_vm %lx locked_vm %lx\n"
  155. "pinned_vm %llx data_vm %lx exec_vm %lx stack_vm %lx\n"
  156. "start_code %lx end_code %lx start_data %lx end_data %lx\n"
  157. "start_brk %lx brk %lx start_stack %lx\n"
  158. "arg_start %lx arg_end %lx env_start %lx env_end %lx\n"
  159. "binfmt %px flags %*pb\n"
  160. #ifdef CONFIG_AIO
  161. "ioctx_table %px\n"
  162. #endif
  163. #ifdef CONFIG_MEMCG
  164. "owner %px "
  165. #endif
  166. "exe_file %px\n"
  167. #ifdef CONFIG_MMU_NOTIFIER
  168. "notifier_subscriptions %px\n"
  169. #endif
  170. #ifdef CONFIG_NUMA_BALANCING
  171. "numa_next_scan %lu numa_scan_offset %lu numa_scan_seq %d\n"
  172. #endif
  173. "tlb_flush_pending %d\n"
  174. "def_flags: %#lx(%pGv)\n",
  175. mm, mm->task_size,
  176. mm->mmap_base, mm->mmap_legacy_base,
  177. mm->pgd, atomic_read(&mm->mm_users),
  178. atomic_read(&mm->mm_count),
  179. mm_pgtables_bytes(mm),
  180. mm->map_count,
  181. mm->hiwater_rss, mm->hiwater_vm, mm->total_vm, mm->locked_vm,
  182. (u64)atomic64_read(&mm->pinned_vm),
  183. mm->data_vm, mm->exec_vm, mm->stack_vm,
  184. mm->start_code, mm->end_code, mm->start_data, mm->end_data,
  185. mm->start_brk, mm->brk, mm->start_stack,
  186. mm->arg_start, mm->arg_end, mm->env_start, mm->env_end,
  187. mm->binfmt, NUM_MM_FLAG_BITS, __mm_flags_get_bitmap(mm),
  188. #ifdef CONFIG_AIO
  189. mm->ioctx_table,
  190. #endif
  191. #ifdef CONFIG_MEMCG
  192. mm->owner,
  193. #endif
  194. mm->exe_file,
  195. #ifdef CONFIG_MMU_NOTIFIER
  196. mm->notifier_subscriptions,
  197. #endif
  198. #ifdef CONFIG_NUMA_BALANCING
  199. mm->numa_next_scan, mm->numa_scan_offset, mm->numa_scan_seq,
  200. #endif
  201. atomic_read(&mm->tlb_flush_pending),
  202. mm->def_flags, &mm->def_flags
  203. );
  204. }
  205. EXPORT_SYMBOL(dump_mm);
  206. void dump_vmg(const struct vma_merge_struct *vmg, const char *reason)
  207. {
  208. if (reason)
  209. pr_warn("vmg %px dumped because: %s\n", vmg, reason);
  210. if (!vmg) {
  211. pr_warn("vmg %px state: (NULL)\n", vmg);
  212. return;
  213. }
  214. pr_warn("vmg %px state: mm %px pgoff %lx\n"
  215. "vmi %px [%lx,%lx)\n"
  216. "prev %px middle %px next %px target %px\n"
  217. "start %lx end %lx flags %lx\n"
  218. "file %px anon_vma %px policy %px\n"
  219. "uffd_ctx %px\n"
  220. "anon_name %px\n"
  221. "state %x\n"
  222. "just_expand %d\n"
  223. "__adjust_middle_start %d __adjust_next_start %d\n"
  224. "__remove_middle %d __remove_next %d\n",
  225. vmg, vmg->mm, vmg->pgoff,
  226. vmg->vmi, vmg->vmi ? vma_iter_addr(vmg->vmi) : 0,
  227. vmg->vmi ? vma_iter_end(vmg->vmi) : 0,
  228. vmg->prev, vmg->middle, vmg->next, vmg->target,
  229. vmg->start, vmg->end, vmg->vm_flags,
  230. vmg->file, vmg->anon_vma, vmg->policy,
  231. #ifdef CONFIG_USERFAULTFD
  232. vmg->uffd_ctx.ctx,
  233. #else
  234. (void *)0,
  235. #endif
  236. vmg->anon_name,
  237. (int)vmg->state,
  238. vmg->just_expand,
  239. vmg->__adjust_middle_start, vmg->__adjust_next_start,
  240. vmg->__remove_middle, vmg->__remove_next);
  241. if (vmg->mm) {
  242. pr_warn("vmg %px mm:\n", vmg);
  243. dump_mm(vmg->mm);
  244. } else {
  245. pr_warn("vmg %px mm: (NULL)\n", vmg);
  246. }
  247. if (vmg->prev) {
  248. pr_warn("vmg %px prev:\n", vmg);
  249. dump_vma(vmg->prev);
  250. } else {
  251. pr_warn("vmg %px prev: (NULL)\n", vmg);
  252. }
  253. if (vmg->middle) {
  254. pr_warn("vmg %px middle:\n", vmg);
  255. dump_vma(vmg->middle);
  256. } else {
  257. pr_warn("vmg %px middle: (NULL)\n", vmg);
  258. }
  259. if (vmg->next) {
  260. pr_warn("vmg %px next:\n", vmg);
  261. dump_vma(vmg->next);
  262. } else {
  263. pr_warn("vmg %px next: (NULL)\n", vmg);
  264. }
  265. #ifdef CONFIG_DEBUG_VM_MAPLE_TREE
  266. if (vmg->vmi) {
  267. pr_warn("vmg %px vmi:\n", vmg);
  268. vma_iter_dump_tree(vmg->vmi);
  269. } else {
  270. pr_warn("vmg %px vmi: (NULL)\n", vmg);
  271. }
  272. #endif
  273. }
  274. EXPORT_SYMBOL(dump_vmg);
  275. static bool page_init_poisoning __read_mostly = true;
  276. static int __init setup_vm_debug(char *str)
  277. {
  278. bool __page_init_poisoning = true;
  279. /*
  280. * Calling vm_debug with no arguments is equivalent to requesting
  281. * to enable all debugging options we can control.
  282. */
  283. if (*str++ != '=' || !*str)
  284. goto out;
  285. __page_init_poisoning = false;
  286. if (*str == '-')
  287. goto out;
  288. while (*str) {
  289. switch (tolower(*str)) {
  290. case 'p':
  291. __page_init_poisoning = true;
  292. break;
  293. default:
  294. pr_err("vm_debug option '%c' unknown. skipped\n",
  295. *str);
  296. }
  297. str++;
  298. }
  299. out:
  300. if (page_init_poisoning && !__page_init_poisoning)
  301. pr_warn("Page struct poisoning disabled by kernel command line option 'vm_debug'\n");
  302. page_init_poisoning = __page_init_poisoning;
  303. return 1;
  304. }
  305. __setup("vm_debug", setup_vm_debug);
  306. void page_init_poison(struct page *page, size_t size)
  307. {
  308. if (page_init_poisoning)
  309. memset(page, PAGE_POISON_PATTERN, size);
  310. }
  311. void vma_iter_dump_tree(const struct vma_iterator *vmi)
  312. {
  313. #if defined(CONFIG_DEBUG_VM_MAPLE_TREE)
  314. mas_dump(&vmi->mas);
  315. mt_dump(vmi->mas.tree, mt_dump_hex);
  316. #endif /* CONFIG_DEBUG_VM_MAPLE_TREE */
  317. }
  318. #endif /* CONFIG_DEBUG_VM */