Messages in this thread | | | Date | Thu, 5 Nov 2015 14:36:06 +0200 | From | "Kirill A. Shutemov" <> | Subject | Re: [PATCH 4/4] mm: prepare page_referenced() and page_idle to new THP refcounting |
| |
On Thu, Nov 05, 2015 at 03:07:26PM +0300, Vladimir Davydov wrote: > @@ -849,30 +836,23 @@ static int page_referenced_one(struct page *page, struct vm_area_struct *vma, > if (pmd_page(*pmd) != page) > goto unlock_pmd; > > - if (vma->vm_flags & VM_LOCKED) { > - pra->vm_flags |= VM_LOCKED; > - ret = SWAP_FAIL; /* To break the loop */ > - goto unlock_pmd; > - } > - > - if (pmdp_clear_flush_young_notify(vma, address, pmd)) > - referenced++; > - spin_unlock(ptl); > + pte = (pte_t *)pmd;
pmd_t and pte_t are not always compatible. We shouldn't pretend they are. And we shouldn't use pte_unmap_unlock() to unlock pmd table.
What about interface like this (I'm not sure about helper's name):
void page_check_address_transhuge(struct page *page, struct mm_struct *mm, unsigned long address, pmd_t **pmdp, pte_t **ptep, spinlock_t **ptlp);
page_check_address_transhuge(page, mm, address, &pmd, &pte, &ptl); if (pmd) { /* handle pmd... */ } else if (pte) { /* handle pte... */ } else { return SWAP_AGAIN; }
/* common stuff */
if (pmd) spin_unlock(ptl); else pte_unmap_unlock(pte, ptl);
/* ... */
The helper shouldn't set pmd if the page is tracked to pte.
-- Kirill A. Shutemov
| |