lkml.org 
[lkml]   [2022]   [Oct]   [25]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH v9 3/8] KVM: Add KVM_EXIT_MEMORY_FAULT exit
    On Tue, Oct 25, 2022, Peter Maydell wrote:
    > On Tue, 25 Oct 2022 at 16:21, Chao Peng <chao.p.peng@linux.intel.com> wrote:
    > > diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
    > > index f3fa75649a78..975688912b8c 100644
    > > --- a/Documentation/virt/kvm/api.rst
    > > +++ b/Documentation/virt/kvm/api.rst
    > > @@ -6537,6 +6537,29 @@ array field represents return values. The userspace should update the return
    > > values of SBI call before resuming the VCPU. For more details on RISC-V SBI
    > > spec refer, https://github.com/riscv/riscv-sbi-doc.
    > >
    > > +::
    > > +
    > > + /* KVM_EXIT_MEMORY_FAULT */
    > > + struct {
    > > + #define KVM_MEMORY_EXIT_FLAG_PRIVATE (1 << 0)
    > > + __u32 flags;
    > > + __u32 padding;
    > > + __u64 gpa;
    > > + __u64 size;
    > > + } memory;
    > > +
    > > +If exit reason is KVM_EXIT_MEMORY_FAULT then it indicates that the VCPU has
    > > +encountered a memory error which is not handled by KVM kernel module and
    > > +userspace may choose to handle it. The 'flags' field indicates the memory
    > > +properties of the exit.
    > > +
    > > + - KVM_MEMORY_EXIT_FLAG_PRIVATE - indicates the memory error is caused by
    > > + private memory access when the bit is set. Otherwise the memory error is
    > > + caused by shared memory access when the bit is clear.
    > > +
    > > +'gpa' and 'size' indicate the memory range the error occurs at. The userspace
    > > +may handle the error and return to KVM to retry the previous memory access.
    > > +
    >
    > What's the difference between this and a plain old MMIO exit ?
    > Just that we can specify a wider size and some flags ?

    KVM_EXIT_MMIO is purely for cases where there is no memslot. KVM_EXIT_MEMORY_FAULT
    will be used for scenarios where there is a valid memslot for a GPA, but for
    whatever reason KVM cannot map the memslot into the guest.

    In this series, the new exit type is use to handle guest-initiated conversions
    between shared and private memory. By design, conversion requires explicit action
    from userspace, and so even though KVM has a valid memslot, KVM needs to exit to
    userspace to effectively forward the conversion request to userspace.

    Long term, I also hope to convert all guest-triggered -EFAULT paths to instead
    return KVM_EXIT_MEMORY_FAULT. At minimum, returning KVM_EXIT_MEMORY_FAULT instead
    of -EFAULT will allow KVM to provide userspace with the "bad" GPA when something
    goes sideways, e.g. if faulting in the page failed because there's no valid
    userspace mapping.

    There have also been two potential use cases[1][2], though they both appear to have
    been abandoned, where userspace would do something more than just kill the guest
    in response to KVM_EXIT_MEMORY_FAULT.

    [1] https://lkml.kernel.org/r/20200617230052.GB27751@linux.intel.com
    [2] https://lore.kernel.org/all/YKxJLcg%2FWomPE422@google.com

    \
     
     \ /
      Last update: 2022-10-25 18:18    [W:3.862 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site