Merge tag 'drm-next-2020-04-03-1' of git://anongit.freedesktop.org/drm/drm
Pull drm hugepage support from Dave Airlie: "This adds support for hugepages to TTM and has been tested with the vmwgfx drivers, though I expect other drivers to start using it" * tag 'drm-next-2020-04-03-1' of git://anongit.freedesktop.org/drm/drm: drm/vmwgfx: Hook up the helpers to align buffer objects drm/vmwgfx: Introduce a huge page aligning TTM range manager drm: Add a drm_get_unmapped_area() helper drm/vmwgfx: Support huge page faults drm/ttm, drm/vmwgfx: Support huge TTM pagefaults mm: Add vmf_insert_pfn_xxx_prot() for huge page-table entries mm: Split huge pages on write-notify or COW mm: Introduce vma_is_special_huge fs: Constify vma argument to vma_is_dax
This commit is contained in:
@@ -824,11 +824,24 @@ out_unlock:
|
||||
pte_free(mm, pgtable);
|
||||
}
|
||||
|
||||
vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn, bool write)
|
||||
/**
|
||||
* vmf_insert_pfn_pmd_prot - insert a pmd size pfn
|
||||
* @vmf: Structure describing the fault
|
||||
* @pfn: pfn to insert
|
||||
* @pgprot: page protection to use
|
||||
* @write: whether it's a write fault
|
||||
*
|
||||
* Insert a pmd size pfn. See vmf_insert_pfn() for additional info and
|
||||
* also consult the vmf_insert_mixed_prot() documentation when
|
||||
* @pgprot != @vmf->vma->vm_page_prot.
|
||||
*
|
||||
* Return: vm_fault_t value.
|
||||
*/
|
||||
vm_fault_t vmf_insert_pfn_pmd_prot(struct vm_fault *vmf, pfn_t pfn,
|
||||
pgprot_t pgprot, bool write)
|
||||
{
|
||||
unsigned long addr = vmf->address & PMD_MASK;
|
||||
struct vm_area_struct *vma = vmf->vma;
|
||||
pgprot_t pgprot = vma->vm_page_prot;
|
||||
pgtable_t pgtable = NULL;
|
||||
|
||||
/*
|
||||
@@ -856,7 +869,7 @@ vm_fault_t vmf_insert_pfn_pmd(struct vm_fault *vmf, pfn_t pfn, bool write)
|
||||
insert_pfn_pmd(vma, addr, vmf->pmd, pfn, pgprot, write, pgtable);
|
||||
return VM_FAULT_NOPAGE;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vmf_insert_pfn_pmd);
|
||||
EXPORT_SYMBOL_GPL(vmf_insert_pfn_pmd_prot);
|
||||
|
||||
#ifdef CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD
|
||||
static pud_t maybe_pud_mkwrite(pud_t pud, struct vm_area_struct *vma)
|
||||
@@ -902,11 +915,24 @@ out_unlock:
|
||||
spin_unlock(ptl);
|
||||
}
|
||||
|
||||
vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn, bool write)
|
||||
/**
|
||||
* vmf_insert_pfn_pud_prot - insert a pud size pfn
|
||||
* @vmf: Structure describing the fault
|
||||
* @pfn: pfn to insert
|
||||
* @pgprot: page protection to use
|
||||
* @write: whether it's a write fault
|
||||
*
|
||||
* Insert a pud size pfn. See vmf_insert_pfn() for additional info and
|
||||
* also consult the vmf_insert_mixed_prot() documentation when
|
||||
* @pgprot != @vmf->vma->vm_page_prot.
|
||||
*
|
||||
* Return: vm_fault_t value.
|
||||
*/
|
||||
vm_fault_t vmf_insert_pfn_pud_prot(struct vm_fault *vmf, pfn_t pfn,
|
||||
pgprot_t pgprot, bool write)
|
||||
{
|
||||
unsigned long addr = vmf->address & PUD_MASK;
|
||||
struct vm_area_struct *vma = vmf->vma;
|
||||
pgprot_t pgprot = vma->vm_page_prot;
|
||||
|
||||
/*
|
||||
* If we had pud_special, we could avoid all these restrictions,
|
||||
@@ -927,7 +953,7 @@ vm_fault_t vmf_insert_pfn_pud(struct vm_fault *vmf, pfn_t pfn, bool write)
|
||||
insert_pfn_pud(vma, addr, vmf->pud, pfn, pgprot, write);
|
||||
return VM_FAULT_NOPAGE;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(vmf_insert_pfn_pud);
|
||||
EXPORT_SYMBOL_GPL(vmf_insert_pfn_pud_prot);
|
||||
#endif /* CONFIG_HAVE_ARCH_TRANSPARENT_HUGEPAGE_PUD */
|
||||
|
||||
static void touch_pmd(struct vm_area_struct *vma, unsigned long addr,
|
||||
@@ -1819,7 +1845,7 @@ int zap_huge_pmd(struct mmu_gather *tlb, struct vm_area_struct *vma,
|
||||
orig_pmd = pmdp_huge_get_and_clear_full(tlb->mm, addr, pmd,
|
||||
tlb->fullmm);
|
||||
tlb_remove_pmd_tlb_entry(tlb, pmd, addr);
|
||||
if (vma_is_dax(vma)) {
|
||||
if (vma_is_special_huge(vma)) {
|
||||
if (arch_needs_pgtable_deposit())
|
||||
zap_deposited_table(tlb->mm, pmd);
|
||||
spin_unlock(ptl);
|
||||
@@ -2083,7 +2109,7 @@ int zap_huge_pud(struct mmu_gather *tlb, struct vm_area_struct *vma,
|
||||
*/
|
||||
pudp_huge_get_and_clear_full(tlb->mm, addr, pud, tlb->fullmm);
|
||||
tlb_remove_pud_tlb_entry(tlb, pud, addr);
|
||||
if (vma_is_dax(vma)) {
|
||||
if (vma_is_special_huge(vma)) {
|
||||
spin_unlock(ptl);
|
||||
/* No zero page support yet */
|
||||
} else {
|
||||
@@ -2192,7 +2218,7 @@ static void __split_huge_pmd_locked(struct vm_area_struct *vma, pmd_t *pmd,
|
||||
*/
|
||||
if (arch_needs_pgtable_deposit())
|
||||
zap_deposited_table(mm, pmd);
|
||||
if (vma_is_dax(vma))
|
||||
if (vma_is_special_huge(vma))
|
||||
return;
|
||||
page = pmd_page(_pmd);
|
||||
if (!PageDirty(page) && pmd_dirty(_pmd))
|
||||
|
Reference in New Issue
Block a user