Instead of passing in multiple parameters in the pmd_fault() handler, a vmf can be passed in just like a fault() handler. This will simplify code and remove the need for the actual pmd fault handlers to allocate a vmf. Related functions are also modified to do the same. [dave.jiang@intel.com: fix issue with xfs_tests stall when DAX option is off] Link: http://lkml.kernel.org/r/148469861071.195597.3619476895250028518.stgit@djiang5-desk3.ch.intel.com Link: http://lkml.kernel.org/r/1484085142-2297-7-git-send-email-ross.zwisler@linux.intel.com Signed-off-by: Dave Jiang <dave.jiang@intel.com> Reviewed-by: Ross Zwisler <ross.zwisler@linux.intel.com> Reviewed-by: Jan Kara <jack@suse.cz> Cc: Dave Chinner <david@fromorbit.com> Cc: Matthew Wilcox <mawilcox@microsoft.com> Cc: Steven Rostedt <rostedt@goodmis.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Unified · Split
| @@ -473,10 +473,9 @@ static int dax_dev_fault(struct vm_area_struct *vma, struct vm_fault *vmf) · 472 unmodified lines | ||
| 473 | 473 | } |
| 474 | 474 | |
| 475 | 475 | static int __dax_dev_pmd_fault(struct dax_dev *dax_dev, |
| 476 | − struct vm_area_struct *vma, unsigned long addr, pmd_t *pmd, | |
| 477 | − unsigned int flags) | |
| 476 | + struct vm_area_struct *vma, struct vm_fault *vmf) | |
| 478 | 477 | { |
| 479 | − unsigned long pmd_addr = addr & PMD_MASK; | |
| 478 | + unsigned long pmd_addr = vmf->address & PMD_MASK; | |
| 480 | 479 | struct device *dev = &dax_dev->dev; |
| 481 | 480 | struct dax_region *dax_region; |
| 482 | 481 | phys_addr_t phys; |
| @@ -508,23 +507,22 @@ static int __dax_dev_pmd_fault(struct dax_dev *dax_dev, · 25 unmodified lines | ||
| 508 | 507 | |
| 509 | 508 | pfn = phys_to_pfn_t(phys, dax_region->pfn_flags); |
| 510 | 509 | |
| 511 | − return vmf_insert_pfn_pmd(vma, addr, pmd, pfn, | |
| 512 | − flags & FAULT_FLAG_WRITE); | |
| 510 | + return vmf_insert_pfn_pmd(vma, vmf->address, vmf->pmd, pfn, | |
| 511 | + vmf->flags & FAULT_FLAG_WRITE); | |
| 513 | 512 | } |
| 514 | 513 | |
| 515 | −static int dax_dev_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | |
| 516 | − pmd_t *pmd, unsigned int flags) | |
| 514 | +static int dax_dev_pmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |
| 517 | 515 | { |
| 518 | 516 | int rc; |
| 519 | 517 | struct file *filp = vma->vm_file; |
| 520 | 518 | struct dax_dev *dax_dev = filp->private_data; |
| 521 | 519 | |
| 522 | 520 | dev_dbg(&dax_dev->dev, "%s: %s: %s (%#lx - %#lx)\n", __func__, |
| 523 | − current->comm, (flags & FAULT_FLAG_WRITE) | |
| 521 | + current->comm, (vmf->flags & FAULT_FLAG_WRITE) | |
| 524 | 522 | ? "write" : "read", vma->vm_start, vma->vm_end); |
| 525 | 523 | |
| 526 | 524 | rcu_read_lock(); |
| 527 | − rc = __dax_dev_pmd_fault(dax_dev, vma, addr, pmd, flags); | |
| 525 | + rc = __dax_dev_pmd_fault(dax_dev, vma, vmf); | |
| 528 | 526 | rcu_read_unlock(); |
| 529 | 527 | |
| 530 | 528 | return rc; |
| @@ -1340,18 +1340,17 @@ fallback: · 1339 unmodified lines | ||
| 1340 | 1340 | return VM_FAULT_FALLBACK; |
| 1341 | 1341 | } |
| 1342 | 1342 | |
| 1343 | −int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address, | |
| 1344 | − pmd_t *pmd, unsigned int flags, struct iomap_ops *ops) | |
| 1343 | +int dax_iomap_pmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | |
| 1344 | + struct iomap_ops *ops) | |
| 1345 | 1345 | { |
| 1346 | 1346 | struct address_space *mapping = vma->vm_file->f_mapping; |
| 1347 | − unsigned long pmd_addr = address & PMD_MASK; | |
| 1348 | − bool write = flags & FAULT_FLAG_WRITE; | |
| 1347 | + unsigned long pmd_addr = vmf->address & PMD_MASK; | |
| 1348 | + bool write = vmf->flags & FAULT_FLAG_WRITE; | |
| 1349 | 1349 | unsigned int iomap_flags = (write ? IOMAP_WRITE : 0) | IOMAP_FAULT; |
| 1350 | 1350 | struct inode *inode = mapping->host; |
| 1351 | 1351 | int result = VM_FAULT_FALLBACK; |
| 1352 | 1352 | struct iomap iomap = { 0 }; |
| 1353 | 1353 | pgoff_t max_pgoff, pgoff; |
| 1354 | − struct vm_fault vmf; | |
| 1355 | 1354 | void *entry; |
| 1356 | 1355 | loff_t pos; |
| 1357 | 1356 | int error; |
| @@ -1364,7 +1363,7 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address, · 6 unmodified lines | ||
| 1364 | 1363 | pgoff = linear_page_index(vma, pmd_addr); |
| 1365 | 1364 | max_pgoff = (i_size_read(inode) - 1) >> PAGE_SHIFT; |
| 1366 | 1365 | |
| 1367 | − trace_dax_pmd_fault(inode, vma, address, flags, pgoff, max_pgoff, 0); | |
| 1366 | + trace_dax_pmd_fault(inode, vma, vmf, max_pgoff, 0); | |
| 1368 | 1367 | |
| 1369 | 1368 | /* Fall back to PTEs if we're going to COW */ |
| 1370 | 1369 | if (write && !(vma->vm_flags & VM_SHARED)) |
| @@ -1408,21 +1407,17 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address, · 37 unmodified lines | ||
| 1408 | 1407 | if (IS_ERR(entry)) |
| 1409 | 1408 | goto finish_iomap; |
| 1410 | 1409 | |
| 1411 | − vmf.pgoff = pgoff; | |
| 1412 | − vmf.flags = flags; | |
| 1413 | − vmf.gfp_mask = mapping_gfp_mask(mapping) | __GFP_IO; | |
| 1414 | − | |
| 1415 | 1410 | switch (iomap.type) { |
| 1416 | 1411 | case IOMAP_MAPPED: |
| 1417 | − result = dax_pmd_insert_mapping(vma, pmd, &vmf, address, | |
| 1418 | − &iomap, pos, write, &entry); | |
| 1412 | + result = dax_pmd_insert_mapping(vma, vmf->pmd, vmf, | |
| 1413 | + vmf->address, &iomap, pos, write, &entry); | |
| 1419 | 1414 | break; |
| 1420 | 1415 | case IOMAP_UNWRITTEN: |
| 1421 | 1416 | case IOMAP_HOLE: |
| 1422 | 1417 | if (WARN_ON_ONCE(write)) |
| 1423 | 1418 | goto unlock_entry; |
| 1424 | − result = dax_pmd_load_hole(vma, pmd, &vmf, address, &iomap, | |
| 1425 | − &entry); | |
| 1419 | + result = dax_pmd_load_hole(vma, vmf->pmd, vmf, vmf->address, | |
| 1420 | + &iomap, &entry); | |
| 1426 | 1421 | break; |
| 1427 | 1422 | default: |
| 1428 | 1423 | WARN_ON_ONCE(1); |
| @@ -1448,12 +1443,11 @@ int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address, · 19 unmodified lines | ||
| 1448 | 1443 | } |
| 1449 | 1444 | fallback: |
| 1450 | 1445 | if (result == VM_FAULT_FALLBACK) { |
| 1451 | − split_huge_pmd(vma, pmd, address); | |
| 1446 | + split_huge_pmd(vma, vmf->pmd, vmf->address); | |
| 1452 | 1447 | count_vm_event(THP_FAULT_FALLBACK); |
| 1453 | 1448 | } |
| 1454 | 1449 | out: |
| 1455 | − trace_dax_pmd_fault_done(inode, vma, address, flags, pgoff, max_pgoff, | |
| 1456 | − result); | |
| 1450 | + trace_dax_pmd_fault_done(inode, vma, vmf, max_pgoff, result); | |
| 1457 | 1451 | return result; |
| 1458 | 1452 | } |
| 1459 | 1453 | EXPORT_SYMBOL_GPL(dax_iomap_pmd_fault); |
| @@ -273,21 +273,20 @@ static int ext4_dax_fault(struct vm_area_struct *vma, struct vm_fault *vmf) · 272 unmodified lines | ||
| 273 | 273 | return result; |
| 274 | 274 | } |
| 275 | 275 | |
| 276 | −static int ext4_dax_pmd_fault(struct vm_area_struct *vma, unsigned long addr, | |
| 277 | − pmd_t *pmd, unsigned int flags) | |
| 276 | +static int | |
| 277 | +ext4_dax_pmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf) | |
| 278 | 278 | { |
| 279 | 279 | int result; |
| 280 | 280 | struct inode *inode = file_inode(vma->vm_file); |
| 281 | 281 | struct super_block *sb = inode->i_sb; |
| 282 | − bool write = flags & FAULT_FLAG_WRITE; | |
| 282 | + bool write = vmf->flags & FAULT_FLAG_WRITE; | |
| 283 | 283 | |
| 284 | 284 | if (write) { |
| 285 | 285 | sb_start_pagefault(sb); |
| 286 | 286 | file_update_time(vma->vm_file); |
| 287 | 287 | } |
| 288 | 288 | down_read(&EXT4_I(inode)->i_mmap_sem); |
| 289 | − result = dax_iomap_pmd_fault(vma, addr, pmd, flags, | |
| 290 | − &ext4_iomap_ops); | |
| 289 | + result = dax_iomap_pmd_fault(vma, vmf, &ext4_iomap_ops); | |
| 291 | 290 | up_read(&EXT4_I(inode)->i_mmap_sem); |
| 292 | 291 | if (write) |
| 293 | 292 | sb_end_pagefault(sb); |
| @@ -1432,9 +1432,7 @@ xfs_filemap_fault( · 1431 unmodified lines | ||
| 1432 | 1432 | STATIC int |
| 1433 | 1433 | xfs_filemap_pmd_fault( |
| 1434 | 1434 | struct vm_area_struct *vma, |
| 1435 | − unsigned long addr, | |
| 1436 | − pmd_t *pmd, | |
| 1437 | − unsigned int flags) | |
| 1435 | + struct vm_fault *vmf) | |
| 1438 | 1436 | { |
| 1439 | 1437 | struct inode *inode = file_inode(vma->vm_file); |
| 1440 | 1438 | struct xfs_inode *ip = XFS_I(inode); |
| @@ -1445,16 +1443,16 @@ xfs_filemap_pmd_fault( · 4 unmodified lines | ||
| 1445 | 1443 | |
| 1446 | 1444 | trace_xfs_filemap_pmd_fault(ip); |
| 1447 | 1445 | |
| 1448 | − if (flags & FAULT_FLAG_WRITE) { | |
| 1446 | + if (vmf->flags & FAULT_FLAG_WRITE) { | |
| 1449 | 1447 | sb_start_pagefault(inode->i_sb); |
| 1450 | 1448 | file_update_time(vma->vm_file); |
| 1451 | 1449 | } |
| 1452 | 1450 | |
| 1453 | 1451 | xfs_ilock(XFS_I(inode), XFS_MMAPLOCK_SHARED); |
| 1454 | − ret = dax_iomap_pmd_fault(vma, addr, pmd, flags, &xfs_iomap_ops); | |
| 1452 | + ret = dax_iomap_pmd_fault(vma, vmf, &xfs_iomap_ops); | |
| 1455 | 1453 | xfs_iunlock(XFS_I(inode), XFS_MMAPLOCK_SHARED); |
| 1456 | 1454 | |
| 1457 | − if (flags & FAULT_FLAG_WRITE) | |
| 1455 | + if (vmf->flags & FAULT_FLAG_WRITE) | |
| 1458 | 1456 | sb_end_pagefault(inode->i_sb); |
| 1459 | 1457 | |
| 1460 | 1458 | return ret; |
| @@ -71,16 +71,15 @@ static inline unsigned int dax_radix_order(void *entry) · 70 unmodified lines | ||
| 71 | 71 | return PMD_SHIFT - PAGE_SHIFT; |
| 72 | 72 | return 0; |
| 73 | 73 | } |
| 74 | −int dax_iomap_pmd_fault(struct vm_area_struct *vma, unsigned long address, | |
| 75 | − pmd_t *pmd, unsigned int flags, struct iomap_ops *ops); | |
| 74 | +int dax_iomap_pmd_fault(struct vm_area_struct *vma, struct vm_fault *vmf, | |
| 75 | + struct iomap_ops *ops); | |
| 76 | 76 | #else |
| 77 | 77 | static inline unsigned int dax_radix_order(void *entry) |
| 78 | 78 | { |
| 79 | 79 | return 0; |
| 80 | 80 | } |
| 81 | 81 | static inline int dax_iomap_pmd_fault(struct vm_area_struct *vma, |
| 82 | − unsigned long address, pmd_t *pmd, unsigned int flags, | |
| 83 | − struct iomap_ops *ops) | |
| 82 | + struct vm_fault *vmf, struct iomap_ops *ops) | |
| 84 | 83 | { |
| 85 | 84 | return VM_FAULT_FALLBACK; |
| 86 | 85 | } |
| @@ -351,8 +351,7 @@ struct vm_operations_struct { · 350 unmodified lines | ||
| 351 | 351 | void (*close)(struct vm_area_struct * area); |
| 352 | 352 | int (*mremap)(struct vm_area_struct * area); |
| 353 | 353 | int (*fault)(struct vm_area_struct *vma, struct vm_fault *vmf); |
| 354 | − int (*pmd_fault)(struct vm_area_struct *, unsigned long address, | |
| 355 | − pmd_t *, unsigned int flags); | |
| 354 | + int (*pmd_fault)(struct vm_area_struct *vma, struct vm_fault *vmf); | |
| 356 | 355 | void (*map_pages)(struct vm_fault *vmf, |
| 357 | 356 | pgoff_t start_pgoff, pgoff_t end_pgoff); |
| 358 | 357 | |
| @@ -8,9 +8,8 @@ · 7 unmodified lines | ||
| 8 | 8 | |
| 9 | 9 | DECLARE_EVENT_CLASS(dax_pmd_fault_class, |
| 10 | 10 | TP_PROTO(struct inode *inode, struct vm_area_struct *vma, |
| 11 | − unsigned long address, unsigned int flags, pgoff_t pgoff, | |
| 12 | − pgoff_t max_pgoff, int result), | |
| 13 | − TP_ARGS(inode, vma, address, flags, pgoff, max_pgoff, result), | |
| 11 | + struct vm_fault *vmf, pgoff_t max_pgoff, int result), | |
| 12 | + TP_ARGS(inode, vma, vmf, max_pgoff, result), | |
| 14 | 13 | TP_STRUCT__entry( |
| 15 | 14 | __field(unsigned long, ino) |
| 16 | 15 | __field(unsigned long, vm_start) |
| @@ -29,9 +28,9 @@ DECLARE_EVENT_CLASS(dax_pmd_fault_class, · 12 unmodified lines | ||
| 29 | 28 | __entry->vm_start = vma->vm_start; |
| 30 | 29 | __entry->vm_end = vma->vm_end; |
| 31 | 30 | __entry->vm_flags = vma->vm_flags; |
| 32 | − __entry->address = address; | |
| 33 | − __entry->flags = flags; | |
| 34 | − __entry->pgoff = pgoff; | |
| 31 | + __entry->address = vmf->address; | |
| 32 | + __entry->flags = vmf->flags; | |
| 33 | + __entry->pgoff = vmf->pgoff; | |
| 35 | 34 | __entry->max_pgoff = max_pgoff; |
| 36 | 35 | __entry->result = result; |
| 37 | 36 | ), |
| @@ -54,9 +53,9 @@ DECLARE_EVENT_CLASS(dax_pmd_fault_class, · 16 unmodified lines | ||
| 54 | 53 | #define DEFINE_PMD_FAULT_EVENT(name) \ |
| 55 | 54 | DEFINE_EVENT(dax_pmd_fault_class, name, \ |
| 56 | 55 | TP_PROTO(struct inode *inode, struct vm_area_struct *vma, \ |
| 57 | − unsigned long address, unsigned int flags, pgoff_t pgoff, \ | |
| 56 | + struct vm_fault *vmf, \ | |
| 58 | 57 | pgoff_t max_pgoff, int result), \ |
| 59 | − TP_ARGS(inode, vma, address, flags, pgoff, max_pgoff, result)) | |
| 58 | + TP_ARGS(inode, vma, vmf, max_pgoff, result)) | |
| 60 | 59 | |
| 61 | 60 | DEFINE_PMD_FAULT_EVENT(dax_pmd_fault); |
| 62 | 61 | DEFINE_PMD_FAULT_EVENT(dax_pmd_fault_done); |
| @@ -3475,8 +3475,7 @@ static int create_huge_pmd(struct vm_fault *vmf) · 3474 unmodified lines | ||
| 3475 | 3475 | if (vma_is_anonymous(vma)) |
| 3476 | 3476 | return do_huge_pmd_anonymous_page(vmf); |
| 3477 | 3477 | if (vma->vm_ops->pmd_fault) |
| 3478 | − return vma->vm_ops->pmd_fault(vma, vmf->address, vmf->pmd, | |
| 3479 | − vmf->flags); | |
| 3478 | + return vma->vm_ops->pmd_fault(vma, vmf); | |
| 3480 | 3479 | return VM_FAULT_FALLBACK; |
| 3481 | 3480 | } |
| 3482 | 3481 | |
| @@ -3485,8 +3484,7 @@ static int wp_huge_pmd(struct vm_fault *vmf, pmd_t orig_pmd) · 2 unmodified lines | ||
| 3485 | 3484 | if (vma_is_anonymous(vmf->vma)) |
| 3486 | 3485 | return do_huge_pmd_wp_page(vmf, orig_pmd); |
| 3487 | 3486 | if (vmf->vma->vm_ops->pmd_fault) |
| 3488 | − return vmf->vma->vm_ops->pmd_fault(vmf->vma, vmf->address, | |
| 3489 | − vmf->pmd, vmf->flags); | |
| 3487 | + return vmf->vma->vm_ops->pmd_fault(vmf->vma, vmf); | |
| 3490 | 3488 | |
| 3491 | 3489 | /* COW handled on pte level: split pmd */ |
| 3492 | 3490 | VM_BUG_ON_VMA(vmf->vma->vm_flags & VM_SHARED, vmf->vma); |