|
@@ -21,6 +21,7 @@
|
|
|
#include <linux/kthread.h>
|
|
|
#include <linux/khugepaged.h>
|
|
|
#include <linux/freezer.h>
|
|
|
+#include <linux/pfn_t.h>
|
|
|
#include <linux/mman.h>
|
|
|
#include <linux/pagemap.h>
|
|
|
#include <linux/debugfs.h>
|
|
@@ -931,14 +932,16 @@ int do_huge_pmd_anonymous_page(struct mm_struct *mm, struct vm_area_struct *vma,
|
|
|
}
|
|
|
|
|
|
static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
|
|
|
- pmd_t *pmd, unsigned long pfn, pgprot_t prot, bool write)
|
|
|
+ pmd_t *pmd, pfn_t pfn, pgprot_t prot, bool write)
|
|
|
{
|
|
|
struct mm_struct *mm = vma->vm_mm;
|
|
|
pmd_t entry;
|
|
|
spinlock_t *ptl;
|
|
|
|
|
|
ptl = pmd_lock(mm, pmd);
|
|
|
- entry = pmd_mkhuge(pfn_pmd(pfn, prot));
|
|
|
+ entry = pmd_mkhuge(pfn_t_pmd(pfn, prot));
|
|
|
+ if (pfn_t_devmap(pfn))
|
|
|
+ entry = pmd_mkdevmap(entry);
|
|
|
if (write) {
|
|
|
entry = pmd_mkyoung(pmd_mkdirty(entry));
|
|
|
entry = maybe_pmd_mkwrite(entry, vma);
|
|
@@ -949,7 +952,7 @@ static void insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
|
|
|
}
|
|
|
|
|
|
int vmf_insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
|
|
|
- pmd_t *pmd, unsigned long pfn, bool write)
|
|
|
+ pmd_t *pmd, pfn_t pfn, bool write)
|
|
|
{
|
|
|
pgprot_t pgprot = vma->vm_page_prot;
|
|
|
/*
|
|
@@ -961,7 +964,7 @@ int vmf_insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr,
|
|
|
BUG_ON((vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) ==
|
|
|
(VM_PFNMAP|VM_MIXEDMAP));
|
|
|
BUG_ON((vma->vm_flags & VM_PFNMAP) && is_cow_mapping(vma->vm_flags));
|
|
|
- BUG_ON((vma->vm_flags & VM_MIXEDMAP) && pfn_valid(pfn));
|
|
|
+ BUG_ON(!pfn_t_devmap(pfn));
|
|
|
|
|
|
if (addr < vma->vm_start || addr >= vma->vm_end)
|
|
|
return VM_FAULT_SIGBUS;
|