Re: [PATCH v4 3.0-rc2-tip 2/22] 2: uprobes: Breakground page replacement.
From: Oleg Nesterov <oleg@redhat.com>
Date: 2011-06-13 13:48:54
Also in:
lkml
On 06/07, Srikar Dronamraju wrote:
+static int __replace_page(struct vm_area_struct *vma, struct page *page,
+ struct page *kpage)
+{
+ struct mm_struct *mm = vma->vm_mm;
+ pgd_t *pgd;
+ pud_t *pud;
+ pmd_t *pmd;
+ pte_t *ptep;
+ spinlock_t *ptl;
+ unsigned long addr;
+ int err = -EFAULT;
+
+ addr = page_address_in_vma(page, vma);
+ if (addr == -EFAULT)
+ goto out;
+
+ pgd = pgd_offset(mm, addr);
+ if (!pgd_present(*pgd))
+ goto out;
+
+ pud = pud_offset(pgd, addr);
+ if (!pud_present(*pud))
+ goto out;
+
+ pmd = pmd_offset(pud, addr);
+ if (pmd_trans_huge(*pmd) || (!pmd_present(*pmd)))
+ goto out;Hmm. So it doesn't work with transhuge pages? May be the caller should use __gup(FOLL_SPLIT), otherwise set_bkpt/etc can fail "mysteriously", no? OTOH, I don't really understand how pmd_trans_huge() is possible, valid_vma() checks ->vm_file != NULL and I iiuc transparent hugepages can only work with anonymous mappings. Confused... But the real problem (afaics) is VM_HUGETLB mappings. I can't understand how __replace_page() can work in this case. Probably valid_vma() should fail if is_vm_hugetlb_page()? Oleg. -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Fight unfair telecom internet charges in Canada: sign http://stopthemeter.ca/ Don't email: <a href=mailto:"dont@kvack.org"> email@kvack.org </a>