aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/dax/device.c2
-rw-r--r--fs/ext2/file.c1
-rw-r--r--fs/ext4/file.c2
-rw-r--r--fs/xfs/xfs_file.c2
-rw-r--r--mm/hmm.c6
-rw-r--r--mm/huge_memory.c4
-rw-r--r--mm/ksm.c3
-rw-r--r--mm/memory.c6
-rw-r--r--mm/migrate.c3
-rw-r--r--mm/mlock.c3
-rw-r--r--mm/mmap.c9
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
diff --git a/mm/hmm.c b/mm/hmm.c
index de7b6bf77201..f40e8add84b5 100644
--- a/mm/hmm.c
+++ b/mm/hmm.c
@@ -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;
diff --git a/mm/ksm.c b/mm/ksm.c
index a6d43cf9a982..9b855a8b0f2d 100644
--- a/mm/ksm.c
+++ b/mm/ksm.c
@@ -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
diff --git a/mm/mmap.c b/mm/mmap.c
index 17bbf4d3e24f..8d6449e74431 100644
--- a/mm/mmap.c
+++ b/mm/mmap.c
@@ -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)