lkml.org 
[lkml]   [2022]   [Dec]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    SubjectRe: [PATCH v10 4/9] KVM: Add KVM_EXIT_MEMORY_FAULT exit
    On Tue, Dec 06, 2022 at 03:47:20PM +0000, Fuad Tabba wrote:
    > Hi,
    >
    > On Fri, Dec 2, 2022 at 6:19 AM Chao Peng <chao.p.peng@linux.intel.com> wrote:
    > >
    > > This new KVM exit allows userspace to handle memory-related errors. It
    > > indicates an error happens in KVM at guest memory range [gpa, gpa+size).
    > > The flags includes additional information for userspace to handle the
    > > error. Currently bit 0 is defined as 'private memory' where '1'
    > > indicates error happens due to private memory access and '0' indicates
    > > error happens due to shared memory access.
    > >
    > > When private memory is enabled, this new exit will be used for KVM to
    > > exit to userspace for shared <-> private memory conversion in memory
    > > encryption usage. In such usage, typically there are two kind of memory
    > > conversions:
    > > - explicit conversion: happens when guest explicitly calls into KVM
    > > to map a range (as private or shared), KVM then exits to userspace
    > > to perform the map/unmap operations.
    > > - implicit conversion: happens in KVM page fault handler where KVM
    > > exits to userspace for an implicit conversion when the page is in a
    > > different state than requested (private or shared).
    > >
    > > Suggested-by: Sean Christopherson <seanjc@google.com>
    > > Co-developed-by: Yu Zhang <yu.c.zhang@linux.intel.com>
    > > Signed-off-by: Yu Zhang <yu.c.zhang@linux.intel.com>
    > > Signed-off-by: Chao Peng <chao.p.peng@linux.intel.com>
    > > Reviewed-by: Fuad Tabba <tabba@google.com>
    > > ---
    > > Documentation/virt/kvm/api.rst | 22 ++++++++++++++++++++++
    > > include/uapi/linux/kvm.h | 8 ++++++++
    > > 2 files changed, 30 insertions(+)
    > >
    > > diff --git a/Documentation/virt/kvm/api.rst b/Documentation/virt/kvm/api.rst
    > > index 99352170c130..d9edb14ce30b 100644
    > > --- a/Documentation/virt/kvm/api.rst
    > > +++ b/Documentation/virt/kvm/api.rst
    > > @@ -6634,6 +6634,28 @@ 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 (1ULL << 0)
    > > + __u64 flags;
    >
    > I see you've removed the padding and increased the flag size.

    Yes Sean suggested this and also looks good to me.

    Chao
    >
    > Reviewed-by: Fuad Tabba <tabba@google.com>
    > Tested-by: Fuad Tabba <tabba@google.com>
    >
    > Cheers,
    > /fuad
    >
    >
    >
    >
    > > + __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.
    > > +
    > > ::
    > >
    > > /* KVM_EXIT_NOTIFY */
    > > diff --git a/include/uapi/linux/kvm.h b/include/uapi/linux/kvm.h
    > > index 13bff963b8b0..c7e9d375a902 100644
    > > --- a/include/uapi/linux/kvm.h
    > > +++ b/include/uapi/linux/kvm.h
    > > @@ -300,6 +300,7 @@ struct kvm_xen_exit {
    > > #define KVM_EXIT_RISCV_SBI 35
    > > #define KVM_EXIT_RISCV_CSR 36
    > > #define KVM_EXIT_NOTIFY 37
    > > +#define KVM_EXIT_MEMORY_FAULT 38
    > >
    > > /* For KVM_EXIT_INTERNAL_ERROR */
    > > /* Emulate instruction failed. */
    > > @@ -541,6 +542,13 @@ struct kvm_run {
    > > #define KVM_NOTIFY_CONTEXT_INVALID (1 << 0)
    > > __u32 flags;
    > > } notify;
    > > + /* KVM_EXIT_MEMORY_FAULT */
    > > + struct {
    > > +#define KVM_MEMORY_EXIT_FLAG_PRIVATE (1ULL << 0)
    > > + __u64 flags;
    > > + __u64 gpa;
    > > + __u64 size;
    > > + } memory;
    > > /* Fix the size of the union. */
    > > char padding[256];
    > > };
    > > --
    > > 2.25.1
    > >

    \
     
     \ /
      Last update: 2022-12-07 16:17    [W:3.711 / U:0.180 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site