diff options
-rw-r--r-- | drivers/dax/device.c | 2 | ||||
-rw-r--r-- | fs/ext2/file.c | 1 | ||||
-rw-r--r-- | fs/ext4/file.c | 2 | ||||
-rw-r--r-- | fs/xfs/xfs_file.c | 2 | ||||
-rw-r--r-- | mm/hmm.c | 6 | ||||
-rw-r--r-- | mm/huge_memory.c | 4 | ||||
-rw-r--r-- | mm/ksm.c | 3 | ||||
-rw-r--r-- | mm/memory.c | 6 | ||||
-rw-r--r-- | mm/migrate.c | 3 | ||||
-rw-r--r-- | mm/mlock.c | 3 | ||||
-rw-r--r-- | mm/mmap.c | 9 |
11 files changed, 27 insertions, 14 deletions
diff --git a/drivers/dax/device.c b/drivers/dax/device.c index 108c37fca782..0a2acd7993f0 100644 --- a/drivers/dax/device.c +++ b/drivers/dax/device.c | |||
@@ -474,7 +474,7 @@ static int dax_mmap(struct file *filp, struct vm_area_struct *vma) | |||
474 | return rc; | 474 | return rc; |
475 | 475 | ||
476 | vma->vm_ops = &dax_vm_ops; | 476 | vma->vm_ops = &dax_vm_ops; |
477 | vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE; | 477 | vma->vm_flags |= VM_HUGEPAGE; |
478 | return 0; | 478 | return 0; |
479 | } | 479 | } |
480 | 480 | ||
diff --git a/fs/ext2/file.c b/fs/ext2/file.c index 047c327a6b23..28b2609f25c1 100644 --- a/fs/ext2/file.c +++ b/fs/ext2/file.c | |||
@@ -126,7 +126,6 @@ static int ext2_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
126 | 126 | ||
127 | file_accessed(file); | 127 | file_accessed(file); |
128 | vma->vm_ops = &ext2_dax_vm_ops; | 128 | vma->vm_ops = &ext2_dax_vm_ops; |
129 | vma->vm_flags |= VM_MIXEDMAP; | ||
130 | return 0; | 129 | return 0; |
131 | } | 130 | } |
132 | #else | 131 | #else |
diff --git a/fs/ext4/file.c b/fs/ext4/file.c index 7f8023340eb8..69d65d49837b 100644 --- a/fs/ext4/file.c +++ b/fs/ext4/file.c | |||
@@ -374,7 +374,7 @@ static int ext4_file_mmap(struct file *file, struct vm_area_struct *vma) | |||
374 | file_accessed(file); | 374 | file_accessed(file); |
375 | if (IS_DAX(file_inode(file))) { | 375 | if (IS_DAX(file_inode(file))) { |
376 | vma->vm_ops = &ext4_dax_vm_ops; | 376 | vma->vm_ops = &ext4_dax_vm_ops; |
377 | vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE; | 377 | vma->vm_flags |= VM_HUGEPAGE; |
378 | } else { | 378 | } else { |
379 | vma->vm_ops = &ext4_file_vm_ops; | 379 | vma->vm_ops = &ext4_file_vm_ops; |
380 | } | 380 | } |
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index 181e9084519b..5eaef2c17293 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
@@ -1169,7 +1169,7 @@ xfs_file_mmap( | |||
1169 | file_accessed(filp); | 1169 | file_accessed(filp); |
1170 | vma->vm_ops = &xfs_file_vm_ops; | 1170 | vma->vm_ops = &xfs_file_vm_ops; |
1171 | if (IS_DAX(file_inode(filp))) | 1171 | if (IS_DAX(file_inode(filp))) |
1172 | vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE; | 1172 | vma->vm_flags |= VM_HUGEPAGE; |
1173 | return 0; | 1173 | return 0; |
1174 | } | 1174 | } |
1175 | 1175 | ||
@@ -676,7 +676,8 @@ int hmm_vma_get_pfns(struct hmm_range *range) | |||
676 | return -EINVAL; | 676 | return -EINVAL; |
677 | 677 | ||
678 | /* FIXME support hugetlb fs */ | 678 | /* FIXME support hugetlb fs */ |
679 | if (is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_SPECIAL)) { | 679 | if (is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_SPECIAL) || |
680 | vma_is_dax(vma)) { | ||
680 | hmm_pfns_special(range); | 681 | hmm_pfns_special(range); |
681 | return -EINVAL; | 682 | return -EINVAL; |
682 | } | 683 | } |
@@ -849,7 +850,8 @@ int hmm_vma_fault(struct hmm_range *range, bool block) | |||
849 | return -EINVAL; | 850 | return -EINVAL; |
850 | 851 | ||
851 | /* FIXME support hugetlb fs */ | 852 | /* FIXME support hugetlb fs */ |
852 | if (is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_SPECIAL)) { | 853 | if (is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_SPECIAL) || |
854 | vma_is_dax(vma)) { | ||
853 | hmm_pfns_special(range); | 855 | hmm_pfns_special(range); |
854 | return -EINVAL; | 856 | return -EINVAL; |
855 | } | 857 | } |
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index a9e1e093df51..1ce44e87f494 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -762,11 +762,11 @@ int vmf_insert_pfn_pmd(struct vm_area_struct *vma, unsigned long addr, | |||
762 | * but we need to be consistent with PTEs and architectures that | 762 | * but we need to be consistent with PTEs and architectures that |
763 | * can't support a 'special' bit. | 763 | * can't support a 'special' bit. |
764 | */ | 764 | */ |
765 | BUG_ON(!(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP))); | 765 | BUG_ON(!(vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) && |
766 | !pfn_t_devmap(pfn)); | ||
766 | BUG_ON((vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) == | 767 | BUG_ON((vma->vm_flags & (VM_PFNMAP|VM_MIXEDMAP)) == |
767 | (VM_PFNMAP|VM_MIXEDMAP)); | 768 | (VM_PFNMAP|VM_MIXEDMAP)); |
768 | BUG_ON((vma->vm_flags & VM_PFNMAP) && is_cow_mapping(vma->vm_flags)); | 769 | BUG_ON((vma->vm_flags & VM_PFNMAP) && is_cow_mapping(vma->vm_flags)); |
769 | BUG_ON(!pfn_t_devmap(pfn)); | ||
770 | 770 | ||
771 | if (addr < vma->vm_start || addr >= vma->vm_end) | 771 | if (addr < vma->vm_start || addr >= vma->vm_end) |
772 | return VM_FAULT_SIGBUS; | 772 | return VM_FAULT_SIGBUS; |
@@ -2430,6 +2430,9 @@ int ksm_madvise(struct vm_area_struct *vma, unsigned long start, | |||
2430 | VM_HUGETLB | VM_MIXEDMAP)) | 2430 | VM_HUGETLB | VM_MIXEDMAP)) |
2431 | return 0; /* just ignore the advice */ | 2431 | return 0; /* just ignore the advice */ |
2432 | 2432 | ||
2433 | if (vma_is_dax(vma)) | ||
2434 | return 0; | ||
2435 | |||
2433 | #ifdef VM_SAO | 2436 | #ifdef VM_SAO |
2434 | if (*vm_flags & VM_SAO) | 2437 | if (*vm_flags & VM_SAO) |
2435 | return 0; | 2438 | return 0; |
diff --git a/mm/memory.c b/mm/memory.c index 348279ff6e51..7c3bd119fcca 100644 --- a/mm/memory.c +++ b/mm/memory.c | |||
@@ -859,6 +859,10 @@ struct page *_vm_normal_page(struct vm_area_struct *vma, unsigned long addr, | |||
859 | return NULL; | 859 | return NULL; |
860 | } | 860 | } |
861 | } | 861 | } |
862 | |||
863 | if (pte_devmap(pte)) | ||
864 | return NULL; | ||
865 | |||
862 | print_bad_pte(vma, addr, pte, NULL); | 866 | print_bad_pte(vma, addr, pte, NULL); |
863 | return NULL; | 867 | return NULL; |
864 | } | 868 | } |
@@ -923,6 +927,8 @@ struct page *vm_normal_page_pmd(struct vm_area_struct *vma, unsigned long addr, | |||
923 | } | 927 | } |
924 | } | 928 | } |
925 | 929 | ||
930 | if (pmd_devmap(pmd)) | ||
931 | return NULL; | ||
926 | if (is_zero_pfn(pfn)) | 932 | if (is_zero_pfn(pfn)) |
927 | return NULL; | 933 | return NULL; |
928 | if (unlikely(pfn > highest_memmap_pfn)) | 934 | if (unlikely(pfn > highest_memmap_pfn)) |
diff --git a/mm/migrate.c b/mm/migrate.c index 8c0af0f7cab1..4a83268e23c2 100644 --- a/mm/migrate.c +++ b/mm/migrate.c | |||
@@ -2951,7 +2951,8 @@ int migrate_vma(const struct migrate_vma_ops *ops, | |||
2951 | /* Sanity check the arguments */ | 2951 | /* Sanity check the arguments */ |
2952 | start &= PAGE_MASK; | 2952 | start &= PAGE_MASK; |
2953 | end &= PAGE_MASK; | 2953 | end &= PAGE_MASK; |
2954 | if (!vma || is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_SPECIAL)) | 2954 | if (!vma || is_vm_hugetlb_page(vma) || (vma->vm_flags & VM_SPECIAL) || |
2955 | vma_is_dax(vma)) | ||
2955 | return -EINVAL; | 2956 | return -EINVAL; |
2956 | if (start < vma->vm_start || start >= vma->vm_end) | 2957 | if (start < vma->vm_start || start >= vma->vm_end) |
2957 | return -EINVAL; | 2958 | return -EINVAL; |
diff --git a/mm/mlock.c b/mm/mlock.c index 74e5a6547c3d..41cc47e28ad6 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
@@ -527,7 +527,8 @@ static int mlock_fixup(struct vm_area_struct *vma, struct vm_area_struct **prev, | |||
527 | vm_flags_t old_flags = vma->vm_flags; | 527 | vm_flags_t old_flags = vma->vm_flags; |
528 | 528 | ||
529 | if (newflags == vma->vm_flags || (vma->vm_flags & VM_SPECIAL) || | 529 | if (newflags == vma->vm_flags || (vma->vm_flags & VM_SPECIAL) || |
530 | is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm)) | 530 | is_vm_hugetlb_page(vma) || vma == get_gate_vma(current->mm) || |
531 | vma_is_dax(vma)) | ||
531 | /* don't set VM_LOCKED or VM_LOCKONFAULT and don't count */ | 532 | /* don't set VM_LOCKED or VM_LOCKONFAULT and don't count */ |
532 | goto out; | 533 | goto out; |
533 | 534 | ||
@@ -1796,11 +1796,12 @@ out: | |||
1796 | 1796 | ||
1797 | vm_stat_account(mm, vm_flags, len >> PAGE_SHIFT); | 1797 | vm_stat_account(mm, vm_flags, len >> PAGE_SHIFT); |
1798 | if (vm_flags & VM_LOCKED) { | 1798 | if (vm_flags & VM_LOCKED) { |
1799 | if (!((vm_flags & VM_SPECIAL) || is_vm_hugetlb_page(vma) || | 1799 | if ((vm_flags & VM_SPECIAL) || vma_is_dax(vma) || |
1800 | vma == get_gate_vma(current->mm))) | 1800 | is_vm_hugetlb_page(vma) || |
1801 | mm->locked_vm += (len >> PAGE_SHIFT); | 1801 | vma == get_gate_vma(current->mm)) |
1802 | else | ||
1803 | vma->vm_flags &= VM_LOCKED_CLEAR_MASK; | 1802 | vma->vm_flags &= VM_LOCKED_CLEAR_MASK; |
1803 | else | ||
1804 | mm->locked_vm += (len >> PAGE_SHIFT); | ||
1804 | } | 1805 | } |
1805 | 1806 | ||
1806 | if (file) | 1807 | if (file) |