• David Woodhouse's avatar
    KVM: x86/xen: Fix runstate updates to be atomic when preempting vCPU · fcb732d8
    David Woodhouse authored
    There are circumstances whem kvm_xen_update_runstate_guest() should not
    sleep because it ends up being called from __schedule() when the vCPU
    is preempted:
    
    [  222.830825]  kvm_xen_update_runstate_guest+0x24/0x100
    [  222.830878]  kvm_arch_vcpu_put+0x14c/0x200
    [  222.830920]  kvm_sched_out+0x30/0x40
    [  222.830960]  __schedule+0x55c/0x9f0
    
    To handle this, make it use the same trick as __kvm_xen_has_interrupt(),
    of using the hva from the gfn_to_hva_cache directly. Then it can use
    pagefault_disable() around the accesses and just bail out if the page
    is absent (which is unlikely).
    
    I almost switched to using a gfn_to_pfn_cache here and bailing out if
    kvm_map_gfn() fails, like kvm_steal_time_set_preempted() does — but on
    closer inspection it looks like kvm_map_gfn() will *always* fail in
    atomic context for a page in IOMEM, which means it will silently fail
    to make the update every single time for such guests, AFAICT. So I
    didn't do it that way after all. And will probably fix that one too.
    
    Cc: stable@vger.kernel.org
    Fixes: 30b5c851 ("KVM: x86/xen: Add support for vCPU runstate information")
    Signed-off-by: default avatarDavid Woodhouse <dwmw@amazon.co.uk>
    Message-Id: <b17a93e5ff4561e57b1238e3e7ccd0b613eb827e.camel@infradead.org>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    fcb732d8
xen.c 28.5 KB