lkml.org 
[lkml]   [2022]   [Jun]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    From
    Subject[PATCH 0/4] kvm/mm: Allow GUP to respond to non fatal signals
    Date
    rfc->v1:
    - Fix non-x86 build reported by syzbot
    - Removing RFC tag

    One issue was reported that libvirt won't be able to stop the virtual
    machine using QMP command "stop" during a paused postcopy migration [1].

    It won't work because "stop the VM" operation requires the hypervisor to
    kick all the vcpu threads out using SIG_IPI in QEMU (which is translated to
    a SIGUSR1). However since during a paused postcopy, the vcpu threads are
    hang death at handle_userfault() so there're simply not responding to the
    kicks. Further, the "stop" command will further hang the QMP channel.

    The mm has facility to process generic signal (FAULT_FLAG_INTERRUPTIBLE),
    however it's only used in the PF handlers only, not in GUP. Unluckily, KVM
    is a heavy GUP user on guest page faults. It means we won't be able to
    interrupt a long page fault for KVM fetching guest pages with what we have
    right now.

    I think it's reasonable for GUP to only listen to fatal signals, as most of
    the GUP users are not really ready to handle such case. But actually KVM
    is not such an user, and KVM actually has rich infrastructure to handle
    even generic signals, and properly deliver the signal to the userspace.
    Then the page fault can be retried in the next KVM_RUN.

    This patchset added FOLL_INTERRUPTIBLE to enable FAULT_FLAG_INTERRUPTIBLE,
    and let KVM be the first one to use it.

    One thing to mention is that this is not allowing all KVM paths to be able
    to respond to non fatal signals, but only on x86 slow page faults. In the
    future when more code is ready for handling signal interruptions, we can
    explore possibility to have more gup callers using FOLL_INTERRUPTIBLE.

    Tests
    =====

    I created a postcopy environment, pause the migration by shutting down the
    network to emulate a network failure (so the handle_userfault() will stuck
    for a long time), then I tried three things:

    (1) Sending QMP command "stop" to QEMU monitor,
    (2) Hitting Ctrl-C from QEMU cmdline,
    (3) GDB attach to the dest QEMU process.

    Before this patchset, all three use case hang. After the patchset, all
    work just like when there's not network failure at all.

    Please have a look, thanks.

    [1] https://gitlab.com/qemu-project/qemu/-/issues/1052

    Peter Xu (4):
    mm/gup: Add FOLL_INTERRUPTIBLE
    kvm: Merge "atomic" and "write" in __gfn_to_pfn_memslot()
    kvm: Add new pfn error KVM_PFN_ERR_INTR
    kvm/x86: Allow to respond to generic signals during slow page faults

    arch/arm64/kvm/mmu.c | 5 ++--
    arch/powerpc/kvm/book3s_64_mmu_hv.c | 5 ++--
    arch/powerpc/kvm/book3s_64_mmu_radix.c | 5 ++--
    arch/x86/kvm/mmu/mmu.c | 19 ++++++++----
    include/linux/kvm_host.h | 21 ++++++++++++-
    include/linux/mm.h | 1 +
    mm/gup.c | 33 ++++++++++++++++++---
    virt/kvm/kvm_main.c | 41 ++++++++++++++++----------
    virt/kvm/kvm_mm.h | 6 ++--
    virt/kvm/pfncache.c | 2 +-
    10 files changed, 104 insertions(+), 34 deletions(-)

    --
    2.32.0

    \
     
     \ /
      Last update: 2022-06-22 23:39    [W:4.581 / U:0.424 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site