Skip to content
  • Jan Kara's avatar
    mm: Fix warning in insert_pfn() · f2c57d91
    Jan Kara authored
    In DAX mode a write pagefault can race with write(2) in the following
    way:
    
    CPU0                            CPU1
                                    write fault for mapped zero page (hole)
    dax_iomap_rw()
      iomap_apply()
        xfs_file_iomap_begin()
          - allocates blocks
        dax_iomap_actor()
          invalidate_inode_pages2_range()
            - invalidates radix tree entries in given range
                                    dax_iomap_pte_fault()
                                      grab_mapping_entry()
                                        - no entry found, creates empty
                                      ...
                                      xfs_file_iomap_begin()
                                        - finds already allocated block
                                      ...
                                      vmf_insert_mixed_mkwrite()
                                        - WARNs and does nothing because there
                                          is still zero page mapped in PTE
            unmap_mapping_pages()
    
    This race results in WARN_ON from insert_pfn() and is occasionally
    triggered by fstest generic/344. Note that the race is otherwise
    harmless as before write(2) on CPU0 is finished, we will invalidate page
    tables properly and thus user of mmap will see modified data from
    write(2) from that point on. So just restrict the warning only to the
    case when the PFN in PTE is not zero page.
    
    Link: http://lkml.kernel.org/r/20180824154542.26872-1-jack@suse.cz
    
    
    Signed-off-by: default avatarJan Kara <jack@suse.cz>
    Reviewed-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Cc: Ross Zwisler <ross.zwisler@linux.intel.com>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Dave Jiang <dave.jiang@intel.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    f2c57d91