ebruakagunduz

__collapse_huge_page_isolate()

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