debug.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * mm/debug.c
  3. *
  4. * mm/ specific debug routines.
  5. *
  6. */
  7. #include <linux/kernel.h>
  8. #include <linux/mm.h>
  9. #include <linux/trace_events.h>
  10. #include <linux/memcontrol.h>
  11. #include <trace/events/mmflags.h>
  12. static const struct trace_print_flags pageflag_names[] = {
  13. __def_pageflag_names
  14. };
  15. static const struct trace_print_flags gfpflag_names[] = {
  16. __def_gfpflag_names
  17. };
  18. static void dump_flags(unsigned long flags,
  19. const struct trace_print_flags *names, int count)
  20. {
  21. const char *delim = "";
  22. unsigned long mask;
  23. int i;
  24. pr_emerg("flags: %#lx(", flags);
  25. /* remove zone id */
  26. flags &= (1UL << NR_PAGEFLAGS) - 1;
  27. for (i = 0; i < count && flags; i++) {
  28. mask = names[i].mask;
  29. if ((flags & mask) != mask)
  30. continue;
  31. flags &= ~mask;
  32. pr_cont("%s%s", delim, names[i].name);
  33. delim = "|";
  34. }
  35. /* check for left over flags */
  36. if (flags)
  37. pr_cont("%s%#lx", delim, flags);
  38. pr_cont(")\n");
  39. }
  40. void dump_page_badflags(struct page *page, const char *reason,
  41. unsigned long badflags)
  42. {
  43. pr_emerg("page:%p count:%d mapcount:%d mapping:%p index:%#lx",
  44. page, atomic_read(&page->_count), page_mapcount(page),
  45. page->mapping, page->index);
  46. if (PageCompound(page))
  47. pr_cont(" compound_mapcount: %d", compound_mapcount(page));
  48. pr_cont("\n");
  49. BUILD_BUG_ON(ARRAY_SIZE(pageflag_names) != __NR_PAGEFLAGS);
  50. dump_flags(page->flags, pageflag_names, ARRAY_SIZE(pageflag_names));
  51. if (reason)
  52. pr_alert("page dumped because: %s\n", reason);
  53. if (page->flags & badflags) {
  54. pr_alert("bad because of flags:\n");
  55. dump_flags(page->flags & badflags,
  56. pageflag_names, ARRAY_SIZE(pageflag_names));
  57. }
  58. #ifdef CONFIG_MEMCG
  59. if (page->mem_cgroup)
  60. pr_alert("page->mem_cgroup:%p\n", page->mem_cgroup);
  61. #endif
  62. }
  63. void dump_page(struct page *page, const char *reason)
  64. {
  65. dump_page_badflags(page, reason, 0);
  66. }
  67. EXPORT_SYMBOL(dump_page);
  68. #ifdef CONFIG_DEBUG_VM
  69. static const struct trace_print_flags vmaflag_names[] = {
  70. __def_vmaflag_names
  71. };
  72. void dump_vma(const struct vm_area_struct *vma)
  73. {
  74. pr_emerg("vma %p start %p end %p\n"
  75. "next %p prev %p mm %p\n"
  76. "prot %lx anon_vma %p vm_ops %p\n"
  77. "pgoff %lx file %p private_data %p\n",
  78. vma, (void *)vma->vm_start, (void *)vma->vm_end, vma->vm_next,
  79. vma->vm_prev, vma->vm_mm,
  80. (unsigned long)pgprot_val(vma->vm_page_prot),
  81. vma->anon_vma, vma->vm_ops, vma->vm_pgoff,
  82. vma->vm_file, vma->vm_private_data);
  83. dump_flags(vma->vm_flags, vmaflag_names, ARRAY_SIZE(vmaflag_names));
  84. }
  85. EXPORT_SYMBOL(dump_vma);
  86. void dump_mm(const struct mm_struct *mm)
  87. {
  88. pr_emerg("mm %p mmap %p seqnum %d task_size %lu\n"
  89. #ifdef CONFIG_MMU
  90. "get_unmapped_area %p\n"
  91. #endif
  92. "mmap_base %lu mmap_legacy_base %lu highest_vm_end %lu\n"
  93. "pgd %p mm_users %d mm_count %d nr_ptes %lu nr_pmds %lu map_count %d\n"
  94. "hiwater_rss %lx hiwater_vm %lx total_vm %lx locked_vm %lx\n"
  95. "pinned_vm %lx data_vm %lx exec_vm %lx stack_vm %lx\n"
  96. "start_code %lx end_code %lx start_data %lx end_data %lx\n"
  97. "start_brk %lx brk %lx start_stack %lx\n"
  98. "arg_start %lx arg_end %lx env_start %lx env_end %lx\n"
  99. "binfmt %p flags %lx core_state %p\n"
  100. #ifdef CONFIG_AIO
  101. "ioctx_table %p\n"
  102. #endif
  103. #ifdef CONFIG_MEMCG
  104. "owner %p "
  105. #endif
  106. "exe_file %p\n"
  107. #ifdef CONFIG_MMU_NOTIFIER
  108. "mmu_notifier_mm %p\n"
  109. #endif
  110. #ifdef CONFIG_NUMA_BALANCING
  111. "numa_next_scan %lu numa_scan_offset %lu numa_scan_seq %d\n"
  112. #endif
  113. #if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION)
  114. "tlb_flush_pending %d\n"
  115. #endif
  116. "%s", /* This is here to hold the comma */
  117. mm, mm->mmap, mm->vmacache_seqnum, mm->task_size,
  118. #ifdef CONFIG_MMU
  119. mm->get_unmapped_area,
  120. #endif
  121. mm->mmap_base, mm->mmap_legacy_base, mm->highest_vm_end,
  122. mm->pgd, atomic_read(&mm->mm_users),
  123. atomic_read(&mm->mm_count),
  124. atomic_long_read((atomic_long_t *)&mm->nr_ptes),
  125. mm_nr_pmds((struct mm_struct *)mm),
  126. mm->map_count,
  127. mm->hiwater_rss, mm->hiwater_vm, mm->total_vm, mm->locked_vm,
  128. mm->pinned_vm, mm->data_vm, mm->exec_vm, mm->stack_vm,
  129. mm->start_code, mm->end_code, mm->start_data, mm->end_data,
  130. mm->start_brk, mm->brk, mm->start_stack,
  131. mm->arg_start, mm->arg_end, mm->env_start, mm->env_end,
  132. mm->binfmt, mm->flags, mm->core_state,
  133. #ifdef CONFIG_AIO
  134. mm->ioctx_table,
  135. #endif
  136. #ifdef CONFIG_MEMCG
  137. mm->owner,
  138. #endif
  139. mm->exe_file,
  140. #ifdef CONFIG_MMU_NOTIFIER
  141. mm->mmu_notifier_mm,
  142. #endif
  143. #ifdef CONFIG_NUMA_BALANCING
  144. mm->numa_next_scan, mm->numa_scan_offset, mm->numa_scan_seq,
  145. #endif
  146. #if defined(CONFIG_NUMA_BALANCING) || defined(CONFIG_COMPACTION)
  147. mm->tlb_flush_pending,
  148. #endif
  149. "" /* This is here to not have a comma! */
  150. );
  151. dump_flags(mm->def_flags, vmaflag_names,
  152. ARRAY_SIZE(vmaflag_names));
  153. }
  154. #endif /* CONFIG_DEBUG_VM */