• Ralph Campbell's avatar
    mm/migrate.c: optimize migrate_vma_pages() mmu notifier · 5e5dda81
    Ralph Campbell authored
    When migrating a zero page or pte_none() anonymous page to device private
    memory, migrate_vma_setup() will initialize the src[] array with a NULL
    PFN.  This lets the device driver allocate device private memory and clear
    it instead of DMAing a page of zeros over the device bus.
    
    Since the source page didn't exist at the time, no struct page was locked
    nor a migration PTE inserted into the CPU page tables.  The actual PTE
    insertion happens in migrate_vma_pages() when it tries to insert the
    device private struct page PTE into the CPU page tables.
    migrate_vma_pages() has to call the mmu notifiers again since another
    device could fault on the same page before the page table locks are
    acquired.
    
    Allow device drivers to optimize the invalidation similar to
    migrate_vma_setup() by calling mmu_notifier_range_init() which sets struct
    mmu_notifier_range event type to MMU_NOTIFY_MIGRATE and the
    migrate_pgmap_owner field.
    
    Link: https://lkml.kernel.org/r/20201021191335.10916-1-rcampbell@nvidia.comSigned-off-by: default avatarRalph Campbell <rcampbell@nvidia.com>
    Cc: Jerome Glisse <jglisse@redhat.com>
    Cc: John Hubbard <jhubbard@nvidia.com>
    Cc: Alistair Popple <apopple@nvidia.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Jason Gunthorpe <jgg@nvidia.com>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    5e5dda81
migrate.c 80.8 KB