If we have to call get_block with the create argument set to 1, then the filesystem almost certainly had to zero the block. which is an I/O, which should be reported as a major fault. Note that major faults on XIP files happen for different reasons than major faults on non-XIP files. XIP files behave as if everything except file holes is already cached. That's all the more reason to report major faults when we do have to do I/O; it may be a valuable resource for sysadmins trying to diagnose performance problems. Signed-off-by: Matthew Wilcox <matthew.r.wilcox@xxxxxxxxx> --- fs/xip.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/fs/xip.c b/fs/xip.c index 9087e0f..88a516b 100644 --- a/fs/xip.c +++ b/fs/xip.c @@ -19,10 +19,12 @@ #include <linux/fs.h> #include <linux/genhd.h> #include <linux/highmem.h> +#include <linux/memcontrol.h> #include <linux/mm.h> #include <linux/mutex.h> #include <linux/sched.h> #include <linux/uio.h> +#include <linux/vmstat.h> int xip_clear_blocks(struct inode *inode, sector_t block, long size) { @@ -250,6 +252,7 @@ static int do_xip_fault(struct vm_area_struct *vma, struct vm_fault *vmf, pgoff_t size; unsigned long pfn; int error; + int major = 0; size = (i_size_read(inode) + PAGE_SIZE - 1) >> PAGE_SHIFT; if (vmf->pgoff >= size) @@ -265,6 +268,9 @@ static int do_xip_fault(struct vm_area_struct *vma, struct vm_fault *vmf, if (!buffer_mapped(&bh) && !vmf->cow_page) { if (vmf->flags & FAULT_FLAG_WRITE) { error = get_block(inode, block, &bh, 1); + count_vm_event(PGMAJFAULT); + mem_cgroup_count_vm_event(vma->vm_mm, PGMAJFAULT); + major = VM_FAULT_MAJOR; if (error || bh.b_size < PAGE_SIZE) return VM_FAULT_SIGBUS; } else { @@ -296,7 +302,7 @@ static int do_xip_fault(struct vm_area_struct *vma, struct vm_fault *vmf, /* -EBUSY is fine, somebody else faulted on the same PTE */ if (error != -EBUSY) BUG_ON(error); - return VM_FAULT_NOPAGE; + return VM_FAULT_NOPAGE | major; } /** -- 1.8.5.2 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>