• Wanpeng Li's avatar
    KVM: async_pf: Fix #DF due to inject "Page not Present" and "Page Ready" exceptions simultaneously · 5f753713
    Wanpeng Li authored
    commit 9a6e7c39 upstream.
    
    qemu-system-x86-8600  [004] d..1  7205.687530: kvm_entry: vcpu 2
    qemu-system-x86-8600  [004] ....  7205.687532: kvm_exit: reason EXCEPTION_NMI rip 0xffffffffa921297d info ffffeb2c0e44e018 80000b0e
    qemu-system-x86-8600  [004] ....  7205.687532: kvm_page_fault: address ffffeb2c0e44e018 error_code 0
    qemu-system-x86-8600  [004] ....  7205.687620: kvm_try_async_get_page: gva = 0xffffeb2c0e44e018, gfn = 0x427e4e
    qemu-system-x86-8600  [004] .N..  7205.687628: kvm_async_pf_not_present: token 0x8b002 gva 0xffffeb2c0e44e018
        kworker/4:2-7814  [004] ....  7205.687655: kvm_async_pf_completed: gva 0xffffeb2c0e44e018 address 0x7fcc30c4e000
    qemu-system-x86-8600  [004] ....  7205.687703: kvm_async_pf_ready: token 0x8b002 gva 0xffffeb2c0e44e018
    qemu-system-x86-8600  [004] d..1  7205.687711: kvm_entry: vcpu 2
    
    After running some memory intensive workload in guest, I catch the kworker
    which completes the GUP too quickly, and queues an "Page Ready" #PF exception
    after the "Page not Present" exception before the next vmentry as the above
    trace which will result in #DF injected to guest.
    
    This patch fixes it by clearing the queue for "Page not Present" if "Page Ready"
    occurs before the next vmentry since the GUP has already got the required page
    and shadow page table has already been fixed by "Page Ready" handler.
    
    Cc: Paolo Bonzini <pbonzini@redhat.com>
    Cc: Radim Krčmář <rkrcmar@redhat.com>
    Signed-off-by: default avatarWanpeng Li <wanpeng.li@hotmail.com>
    Fixes: 7c90705b ("KVM: Inject asynchronous page fault into a PV guest if page is swapped out.")
    [Changed indentation and added clearing of injected. - Radim]
    Signed-off-by: default avatarRadim Krčmář <rkrcmar@redhat.com>
    [port from upstream v4.14-rc1, Don't assign to kvm_queued_exception::injected or
     x86_exception::async_page_fault]
    Signed-off-by: default avatarJack Wang <jinpu.wang@profitbricks.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    5f753713
x86.c 214 KB