Skip to content
  • Jérôme Glisse's avatar
    4a83bfe9
    mm/mmu_notifier: helper to test if a range invalidation is blockable · 4a83bfe9
    Jérôme Glisse authored
    Patch series "mmu notifier provide context informations", v6.
    
    Here I am not posting users of this, they already have been posted to
    appropriate mailing list [6] and will be merge through the appropriate
    tree once this patchset is upstream.
    
    Note that this serie does not change any behavior for any existing code.
    It just pass down more information to mmu notifier listener.
    
    The rationale for this patchset:
    
    CPU page table update can happens for many reasons, not only as a result
    of a syscall (munmap(), mprotect(), mremap(), madvise(), ...) but also as
    a result of kernel activities (memory compression, reclaim, migration,
    ...).
    
    This patchset introduce a set of enums that can be associated with each of
    the events triggering a mmu notifier:
    
        - UNMAP: munmap() or mremap()
        - CLEAR: page table is cleared (migration, compaction, reclaim, ...)
        - PROTECTION_VMA: change in access protections for the range
        - PROTECTION_PAGE: change in access protections for page in the range
        - SOFT_DIRTY: soft dirtyness tracking
    
    Being able to identify munmap() and mremap() from other reasons why the
    page table is cleared is important to allow user of mmu notifier to update
    their own internal tracking structure accordingly (on munmap or mremap it
    is not longer needed to track range of virtual address as it becomes
    invalid).  Without this serie, driver are force to assume that every
    notification is an munmap which triggers useless trashing within drivers
    that associate structure with range of virtual address.  Each driver is
    force to free up its tracking structure and then restore it on next device
    page fault.  With this series we can also optimize device page table update.  Patches to use this are at
    
    https://lkml.org/lkml/2019/1/23/833
    https://lkml.org/lkml/2019/1/23/834
    https://lkml.org/lkml/2019/1/23/832
    https://lkml.org/lkml/2019/1/23/831
    
    Moreover this can also be used to optimize out some page table updates
    such as for KVM where we can update the secondary MMU directly from the
    callback instead of clearing it.
    
    ACKS AMD/RADEON https://lkml.org/lkml/2019/2/1/395
    ACKS RDMA https://lkml.org/lkml/2018/12/6/1473
    
    This patch (of 8):
    
    Simple helpers to test if range invalidation is blockable.  Latter patches
    use cocinnelle to convert all direct dereference of range-> blockable to
    use this function instead so that we can convert the blockable field to an
    unsigned for more flags.
    
    Link: http://lkml.kernel.org/r/20190326164747.24405-2-jglisse@redhat.com
    
    
    Signed-off-by: default avatarJérôme Glisse <jglisse@redhat.com>
    Reviewed-by: default avatarRalph Campbell <rcampbell@nvidia.com>
    Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Cc: Jani Nikula <jani.nikula@linux.intel.com>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Felix Kuehling <Felix.Kuehling@amd.com>
    Cc: Jason Gunthorpe <jgg@mellanox.com>
    Cc: Ross Zwisler <zwisler@kernel.org>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krcmar <rkrcmar@redhat.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Christian Koenig <christian.koenig@amd.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    4a83bfe9
    mm/mmu_notifier: helper to test if a range invalidation is blockable
    Jérôme Glisse authored
    Patch series "mmu notifier provide context informations", v6.
    
    Here I am not posting users of this, they already have been posted to
    appropriate mailing list [6] and will be merge through the appropriate
    tree once this patchset is upstream.
    
    Note that this serie does not change any behavior for any existing code.
    It just pass down more information to mmu notifier listener.
    
    The rationale for this patchset:
    
    CPU page table update can happens for many reasons, not only as a result
    of a syscall (munmap(), mprotect(), mremap(), madvise(), ...) but also as
    a result of kernel activities (memory compression, reclaim, migration,
    ...).
    
    This patchset introduce a set of enums that can be associated with each of
    the events triggering a mmu notifier:
    
        - UNMAP: munmap() or mremap()
        - CLEAR: page table is cleared (migration, compaction, reclaim, ...)
        - PROTECTION_VMA: change in access protections for the range
        - PROTECTION_PAGE: change in access protections for page in the range
        - SOFT_DIRTY: soft dirtyness tracking
    
    Being able to identify munmap() and mremap() from other reasons why the
    page table is cleared is important to allow user of mmu notifier to update
    their own internal tracking structure accordingly (on munmap or mremap it
    is not longer needed to track range of virtual address as it becomes
    invalid).  Without this serie, driver are force to assume that every
    notification is an munmap which triggers useless trashing within drivers
    that associate structure with range of virtual address.  Each driver is
    force to free up its tracking structure and then restore it on next device
    page fault.  With this series we can also optimize device page table update.  Patches to use this are at
    
    https://lkml.org/lkml/2019/1/23/833
    https://lkml.org/lkml/2019/1/23/834
    https://lkml.org/lkml/2019/1/23/832
    https://lkml.org/lkml/2019/1/23/831
    
    Moreover this can also be used to optimize out some page table updates
    such as for KVM where we can update the secondary MMU directly from the
    callback instead of clearing it.
    
    ACKS AMD/RADEON https://lkml.org/lkml/2019/2/1/395
    ACKS RDMA https://lkml.org/lkml/2018/12/6/1473
    
    This patch (of 8):
    
    Simple helpers to test if range invalidation is blockable.  Latter patches
    use cocinnelle to convert all direct dereference of range-> blockable to
    use this function instead so that we can convert the blockable field to an
    unsigned for more flags.
    
    Link: http://lkml.kernel.org/r/20190326164747.24405-2-jglisse@redhat.com
    
    
    Signed-off-by: default avatarJérôme Glisse <jglisse@redhat.com>
    Reviewed-by: default avatarRalph Campbell <rcampbell@nvidia.com>
    Reviewed-by: default avatarIra Weiny <ira.weiny@intel.com>
    Cc: Christian König <christian.koenig@amd.com>
    Cc: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>
    Cc: Jani Nikula <jani.nikula@linux.intel.com>
    Cc: Rodrigo Vivi <rodrigo.vivi@intel.com>
    Cc: Jan Kara <jack@suse.cz>
    Cc: Andrea Arcangeli <aarcange@redhat.com>
    Cc: Peter Xu <peterx@redhat.com>
    Cc: Felix Kuehling <Felix.Kuehling@amd.com>
    Cc: Jason Gunthorpe <jgg@mellanox.com>
    Cc: Ross Zwisler <zwisler@kernel.org>
    Cc: Dan Williams <dan.j.williams@intel.com>
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krcmar <rkrcmar@redhat.com>
    Cc: Michal Hocko <mhocko@kernel.org>
    Cc: Christian Koenig <christian.koenig@amd.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
Loading