• David Vrabel's avatar
    xen/mm: do direct hypercall in xen_set_pte() if batching is unavailable · d095d43e
    David Vrabel authored
    In xen_set_pte() if batching is unavailable (because the caller is in
    an interrupt context such as handling a page fault) it would fall back
    to using native_set_pte() and trapping and emulating the PTE write.
    
    On 32-bit guests this requires two traps for each PTE write (one for
    each dword of the PTE).  Instead, do one mmu_update hypercall
    directly.
    
    During construction of the initial page tables, continue to use
    native_set_pte() because most of the PTEs being set are in writable
    and unpinned pages (see phys_pmd_init() in arch/x86/mm/init_64.c) and
    using a hypercall for this is very expensive.
    
    This significantly improves page fault performance in 32-bit PV
    guests.
    
    lmbench3 test  Before    After     Improvement
    ----------------------------------------------
    lat_pagefault  3.18 us   2.32 us   27%
    lat_proc fork  356 us    313.3 us  11%
    Signed-off-by: default avatarDavid Vrabel <david.vrabel@citrix.com>
    Signed-off-by: default avatarKonrad Rzeszutek Wilk <konrad.wilk@oracle.com>
    d095d43e
mmu.c 57.8 KB