diff options
author | Matthew Wilcox <willy@linux.intel.com> | 2015-09-08 17:59:06 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2015-09-08 18:35:28 -0400 |
commit | acd76e74d80f961553861d9cf49a62cbcf496d28 (patch) | |
tree | 3e4428231ab14b1293335019c43b8b9c839923ce /fs/xfs | |
parent | 11bd1a9ecdd687b8a4b9b360b7e4b74a1a5e2bd5 (diff) |
xfs: huge page fault support
Use DAX to provide support for huge pages.
Signed-off-by: Matthew Wilcox <willy@linux.intel.com>
Cc: Hillf Danton <dhillf@gmail.com>
Cc: "Kirill A. Shutemov" <kirill.shutemov@linux.intel.com>
Cc: Theodore Ts'o <tytso@mit.edu>
Cc: Jan Kara <jack@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/xfs_file.c | 30 | ||||
-rw-r--r-- | fs/xfs/xfs_trace.h | 1 |
2 files changed, 30 insertions, 1 deletions
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c index de2c2376242b..e78feb400e22 100644 --- a/fs/xfs/xfs_file.c +++ b/fs/xfs/xfs_file.c | |||
@@ -1546,8 +1546,36 @@ xfs_filemap_fault( | |||
1546 | return ret; | 1546 | return ret; |
1547 | } | 1547 | } |
1548 | 1548 | ||
1549 | STATIC int | ||
1550 | xfs_filemap_pmd_fault( | ||
1551 | struct vm_area_struct *vma, | ||
1552 | unsigned long addr, | ||
1553 | pmd_t *pmd, | ||
1554 | unsigned int flags) | ||
1555 | { | ||
1556 | struct inode *inode = file_inode(vma->vm_file); | ||
1557 | struct xfs_inode *ip = XFS_I(inode); | ||
1558 | int ret; | ||
1559 | |||
1560 | if (!IS_DAX(inode)) | ||
1561 | return VM_FAULT_FALLBACK; | ||
1562 | |||
1563 | trace_xfs_filemap_pmd_fault(ip); | ||
1564 | |||
1565 | sb_start_pagefault(inode->i_sb); | ||
1566 | file_update_time(vma->vm_file); | ||
1567 | xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); | ||
1568 | ret = __dax_pmd_fault(vma, addr, pmd, flags, xfs_get_blocks_direct, | ||
1569 | xfs_end_io_dax_write); | ||
1570 | xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); | ||
1571 | sb_end_pagefault(inode->i_sb); | ||
1572 | |||
1573 | return ret; | ||
1574 | } | ||
1575 | |||
1549 | static const struct vm_operations_struct xfs_file_vm_ops = { | 1576 | static const struct vm_operations_struct xfs_file_vm_ops = { |
1550 | .fault = xfs_filemap_fault, | 1577 | .fault = xfs_filemap_fault, |
1578 | .pmd_fault = xfs_filemap_pmd_fault, | ||
1551 | .map_pages = filemap_map_pages, | 1579 | .map_pages = filemap_map_pages, |
1552 | .page_mkwrite = xfs_filemap_page_mkwrite, | 1580 | .page_mkwrite = xfs_filemap_page_mkwrite, |
1553 | }; | 1581 | }; |
@@ -1560,7 +1588,7 @@ xfs_file_mmap( | |||
1560 | file_accessed(filp); | 1588 | file_accessed(filp); |
1561 | vma->vm_ops = &xfs_file_vm_ops; | 1589 | vma->vm_ops = &xfs_file_vm_ops; |
1562 | if (IS_DAX(file_inode(filp))) | 1590 | if (IS_DAX(file_inode(filp))) |
1563 | vma->vm_flags |= VM_MIXEDMAP; | 1591 | vma->vm_flags |= VM_MIXEDMAP | VM_HUGEPAGE; |
1564 | return 0; | 1592 | return 0; |
1565 | } | 1593 | } |
1566 | 1594 | ||
diff --git a/fs/xfs/xfs_trace.h b/fs/xfs/xfs_trace.h index 9aeeb21bc3d0..5ed36b1e04c1 100644 --- a/fs/xfs/xfs_trace.h +++ b/fs/xfs/xfs_trace.h | |||
@@ -687,6 +687,7 @@ DEFINE_INODE_EVENT(xfs_inode_clear_eofblocks_tag); | |||
687 | DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); | 687 | DEFINE_INODE_EVENT(xfs_inode_free_eofblocks_invalid); |
688 | 688 | ||
689 | DEFINE_INODE_EVENT(xfs_filemap_fault); | 689 | DEFINE_INODE_EVENT(xfs_filemap_fault); |
690 | DEFINE_INODE_EVENT(xfs_filemap_pmd_fault); | ||
690 | DEFINE_INODE_EVENT(xfs_filemap_page_mkwrite); | 691 | DEFINE_INODE_EVENT(xfs_filemap_page_mkwrite); |
691 | 692 | ||
692 | DECLARE_EVENT_CLASS(xfs_iref_class, | 693 | DECLARE_EVENT_CLASS(xfs_iref_class, |