• Jason Gunthorpe's avatar
    mm/hmm: reorganize how !pte_present is handled in hmm_vma_handle_pte() · 76612d6c
    Jason Gunthorpe authored
    The intention with this code is to determine if the caller required the
    pages to be valid, and if so, then take some action to make them valid.
    The action varies depending on the page type.
    
    In all cases, if the caller doesn't ask for the page, then
    hmm_range_fault() should not return an error.
    
    Revise the implementation to be clearer, and fix some bugs:
    
     - hmm_pte_need_fault() must always be called before testing fault or
       write_fault otherwise the defaults of false apply and the if()'s don't
       work. This was missed on the is_migration_entry() branch
    
     - -EFAULT should not be returned unless hmm_pte_need_fault() indicates
       fault is required - ie snapshotting should not fail.
    
     - For !pte_present() the cpu_flags are always 0, except in the special
       case of is_device_private_entry(), calling pte_to_hmm_pfn_flags() is
       confusing.
    
    Reorganize the flow so that it always follows the pattern of calling
    hmm_pte_need_fault() and then checking fault || write_fault.
    
    Fixes: 2aee09d8 ("mm/hmm: change hmm_vma_fault() to allow write fault on page basis")
    Reviewed-by: default avatarRalph Campbell <rcampbell@nvidia.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarJason Gunthorpe <jgg@mellanox.com>
    76612d6c
hmm.c 19.1 KB