ebruakagunduz

__collapse_huge_page_isolate, fix with scan pmd

Jan 15th, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.44 KB | None | 0 0
  1. static int __collapse_huge_page_isolate(struct vm_area_struct *vma,
  2. unsigned long address,
  3. pte_t *pte)
  4. {
  5. struct page *page;
  6. pte_t *_pte;
  7. int referenced = 0, none = 0;
  8. bool read_only_pte = false;
  9. for (_pte = pte; _pte < pte+HPAGE_PMD_NR;
  10. _pte++, address += PAGE_SIZE) {
  11. pte_t pteval = *_pte;
  12.  
  13. if (pte_none(pteval)) {
  14. if (++none <= khugepaged_max_ptes_none)
  15. continue;
  16. else
  17. goto out;
  18. }
  19. if (!pte_present(pteval))
  20. pr_info("is not present, pid: %i\n", current->pid);
  21. goto out;
  22. if (!pte_write(pteval)) {
  23. pr_info("read-only pte\n");
  24. read_only_pte = true;
  25. }
  26. page = vm_normal_page(vma, address, pteval);
  27. if (unlikely(!page))
  28. pr_info("!page\n");
  29. goto out;
  30.  
  31. if (read_only_pte) {
  32. read_only_pte = false;
  33. if (PageSwapCache(page))
  34. reuse_swap_page(page);
  35. }
  36. pr_info("vm_bug_on\n");
  37. VM_BUG_ON_PAGE(PageCompound(page), page);
  38. VM_BUG_ON_PAGE(!PageAnon(page), page);
  39. VM_BUG_ON_PAGE(!PageSwapBacked(page), page);
  40. /* cannot use mapcount: can't collapse if there's a gup pin */
  41.  
  42. if (page_count(page) != 1 + !!PageSwapCache(page))
  43. pr_info("page_count() error\n");
  44. goto out;
  45. /* pr_info("after page_count\n"); */
  46. /*
  47. * We can do it before isolate_lru_page because the
  48. * page can't be freed from under us. NOTE: PG_lock
  49. * is needed to serialize against split_huge_page
  50. * when invoked from the VM.
  51. */
  52. if (!trylock_page(page))
  53. pr_info("trylock_page() error\n");
  54. goto out;
  55. /*
  56. * Isolate the page to avoid collapsing an hugepage
  57. * currently in use by the VM.
  58. */
  59. if (isolate_lru_page(page)) {
  60. pr_info("isolate_lru_page() error\n");
  61. unlock_page(page);
  62. goto out;
  63. }
  64. /* 0 stands for page_is_file_cache(page) == false */
  65. inc_zone_page_state(page, NR_ISOLATED_ANON + 0);
  66. VM_BUG_ON_PAGE(!PageLocked(page), page);
  67. VM_BUG_ON_PAGE(PageLRU(page), page);
  68. pr_info("page on page lru succeeds\n");
  69.  
  70. /* If there is no mapped pte young don't collapse the page */
  71. if (pte_young(pteval) || PageReferenced(page) ||
  72. mmu_notifier_test_young(vma->vm_mm, address)) {
  73. referenced = 1;
  74. }
  75. }
  76. if (likely(referenced))
  77. pr_info("referenced set 1\n");
  78. return 1;
  79. out:
  80. release_pte_pages(pte, _pte);
  81. pr_info("ptes released\n");
  82. return 0;
  83. }
Advertisement
Add Comment
Please, Sign In to add comment