lkml.org 
[lkml]   [2009]   [Jun]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    SubjectRe: patch kvm-add-vt-x-machine-check-support.patch added to 2.6.30-stable tree
    Date
    Hi

    On Wednesday 01 July 2009, gregkh@suse.de wrote:
    > This is a note to let you know that we have just queued up the patch titled
    >
    > Subject: KVM: Add VT-x machine check support
    >
    > to the 2.6.30-stable tree. Its filename is
    >
    > kvm-add-vt-x-machine-check-support.patch
    >
    > A git repo of this tree can be found at
    > http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
    >
    >
    > From a0861c02a981c943573478ea13b29b1fb958ee5b Mon Sep 17 00:00:00 2001
    > From: Andi Kleen <ak@linux.intel.com>
    > Date: Mon, 8 Jun 2009 17:37:09 +0800
    > Subject: KVM: Add VT-x machine check support

    This patch fails to compile if applied to 2.6.30 + current stable queue.

    arch/x86/kvm/vmx.c: In function 'vmx_vcpu_run':
    arch/x86/kvm/vmx.c:3573: error: 'exit_intr_info' undeclared (first use in this function)
    arch/x86/kvm/vmx.c:3573: error: (Each undeclared identifier is reported only once
    arch/x86/kvm/vmx.c:3573: error: for each function it appears in.)
    make[4]: *** [arch/x86/kvm/vmx.o] Error 1
    make[3]: *** [arch/x86/kvm] Error 2
    make[3]: *** Waiting for unfinished jobs....

    It seems to depend on the code refactoring introduced by

    From 7b4a25cb296e2a73d2e87a4af65361d45d450a27 Mon Sep 17 00:00:00 2001
    From: Gleb Natapov <gleb@redhat.com>
    Date: Mon, 30 Mar 2009 16:03:08 +0300
    Subject: KVM: VMX: Fix handling of a fault during NMI unblocked due to IRET

    Bit 12 is undefined in any of the following cases:
    If the VM exit sets the valid bit in the IDT-vectoring information field.
    If the VM exit is due to a double fault.

    Signed-off-by: Gleb Natapov <gleb@redhat.com>
    Signed-off-by: Avi Kivity <avi@redhat.com>

    and followed up by the code movement in

    From 20f65983e30f222e5383f77206e3f571d1d64610 Mon Sep 17 00:00:00 2001
    From: Gleb Natapov <gleb@redhat.com>
    Date: Mon, 11 May 2009 13:35:55 +0300
    Subject: KVM: Move "exit due to NMI" handling into vmx_complete_interrupts()

    To save us one reading of VM_EXIT_INTR_INFO.

    Signed-off-by: Gleb Natapov <gleb@redhat.com>
    Signed-off-by: Avi Kivity <avi@redhat.com>

    Regards
    Stefan Lippers-Hollmann

    > From: Andi Kleen <ak@linux.intel.com>
    >
    > commit a0861c02a981c943573478ea13b29b1fb958ee5b upstream.
    >
    > VT-x needs an explicit MC vector intercept to handle machine checks in the
    > hyper visor.
    >
    > It also has a special option to catch machine checks that happen
    > during VT entry.
    >
    > Do these interceptions and forward them to the Linux machine check
    > handler. Make it always look like user space is interrupted because
    > the machine check handler treats kernel/user space differently.
    >
    > Thanks to Jiang Yunhong for help and testing.
    >
    > Signed-off-by: Andi Kleen <ak@linux.intel.com>
    > Signed-off-by: Huang Ying <ying.huang@intel.com>
    > Signed-off-by: Avi Kivity <avi@redhat.com>
    > Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
    >
    > ---
    > arch/x86/include/asm/vmx.h | 1
    > arch/x86/kernel/cpu/mcheck/mce_64.c | 1
    > arch/x86/kvm/vmx.c | 50 ++++++++++++++++++++++++++++++++++--
    > 3 files changed, 50 insertions(+), 2 deletions(-)

    --

    > --- a/arch/x86/include/asm/vmx.h
    > +++ b/arch/x86/include/asm/vmx.h
    > @@ -247,6 +247,7 @@ enum vmcs_field {
    > #define EXIT_REASON_MSR_READ 31
    > #define EXIT_REASON_MSR_WRITE 32
    > #define EXIT_REASON_MWAIT_INSTRUCTION 36
    > +#define EXIT_REASON_MCE_DURING_VMENTRY 41
    > #define EXIT_REASON_TPR_BELOW_THRESHOLD 43
    > #define EXIT_REASON_APIC_ACCESS 44
    > #define EXIT_REASON_EPT_VIOLATION 48
    > --- a/arch/x86/kernel/cpu/mcheck/mce_64.c
    > +++ b/arch/x86/kernel/cpu/mcheck/mce_64.c
    > @@ -420,6 +420,7 @@ void do_machine_check(struct pt_regs * r
    > out2:
    > atomic_dec(&mce_entry);
    > }
    > +EXPORT_SYMBOL_GPL(do_machine_check);
    >
    > #ifdef CONFIG_X86_MCE_INTEL
    > /***
    > --- a/arch/x86/kvm/vmx.c
    > +++ b/arch/x86/kvm/vmx.c
    > @@ -32,6 +32,7 @@
    > #include <asm/desc.h>
    > #include <asm/vmx.h>
    > #include <asm/virtext.h>
    > +#include <asm/mce.h>
    >
    > #define __ex(x) __kvm_handle_fault_on_reboot(x)
    >
    > @@ -97,6 +98,7 @@ struct vcpu_vmx {
    > int soft_vnmi_blocked;
    > ktime_t entry_time;
    > s64 vnmi_blocked_time;
    > + u32 exit_reason;
    > };
    >
    > static inline struct vcpu_vmx *to_vmx(struct kvm_vcpu *vcpu)
    > @@ -213,6 +215,13 @@ static inline int is_external_interrupt(
    > == (INTR_TYPE_EXT_INTR | INTR_INFO_VALID_MASK);
    > }
    >
    > +static inline int is_machine_check(u32 intr_info)
    > +{
    > + return (intr_info & (INTR_INFO_INTR_TYPE_MASK | INTR_INFO_VECTOR_MASK |
    > + INTR_INFO_VALID_MASK)) ==
    > + (INTR_TYPE_HARD_EXCEPTION | MC_VECTOR | INTR_INFO_VALID_MASK);
    > +}
    > +
    > static inline int cpu_has_vmx_msr_bitmap(void)
    > {
    > return (vmcs_config.cpu_based_exec_ctrl & CPU_BASED_USE_MSR_BITMAPS);
    > @@ -478,7 +487,7 @@ static void update_exception_bitmap(stru
    > {
    > u32 eb;
    >
    > - eb = (1u << PF_VECTOR) | (1u << UD_VECTOR);
    > + eb = (1u << PF_VECTOR) | (1u << UD_VECTOR) | (1u << MC_VECTOR);
    > if (!vcpu->fpu_active)
    > eb |= 1u << NM_VECTOR;
    > if (vcpu->guest_debug & KVM_GUESTDBG_ENABLE) {
    > @@ -2585,6 +2594,31 @@ static int handle_rmode_exception(struct
    > return 0;
    > }
    >
    > +/*
    > + * Trigger machine check on the host. We assume all the MSRs are already set up
    > + * by the CPU and that we still run on the same CPU as the MCE occurred on.
    > + * We pass a fake environment to the machine check handler because we want
    > + * the guest to be always treated like user space, no matter what context
    > + * it used internally.
    > + */
    > +static void kvm_machine_check(void)
    > +{
    > +#if defined(CONFIG_X86_MCE) && defined(CONFIG_X86_64)
    > + struct pt_regs regs = {
    > + .cs = 3, /* Fake ring 3 no matter what the guest ran on */
    > + .flags = X86_EFLAGS_IF,
    > + };
    > +
    > + do_machine_check(&regs, 0);
    > +#endif
    > +}
    > +
    > +static int handle_machine_check(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
    > +{
    > + /* already handled by vcpu_run */
    > + return 1;
    > +}
    > +
    > static int handle_exception(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
    > {
    > struct vcpu_vmx *vmx = to_vmx(vcpu);
    > @@ -2596,6 +2630,9 @@ static int handle_exception(struct kvm_v
    > vect_info = vmx->idt_vectoring_info;
    > intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
    >
    > + if (is_machine_check(intr_info))
    > + return handle_machine_check(vcpu, kvm_run);
    > +
    > if ((vect_info & VECTORING_INFO_VALID_MASK) &&
    > !is_page_fault(intr_info))
    > printk(KERN_ERR "%s: unexpected, vectoring info 0x%x "
    > @@ -3150,6 +3187,7 @@ static int (*kvm_vmx_exit_handlers[])(st
    > [EXIT_REASON_WBINVD] = handle_wbinvd,
    > [EXIT_REASON_TASK_SWITCH] = handle_task_switch,
    > [EXIT_REASON_EPT_VIOLATION] = handle_ept_violation,
    > + [EXIT_REASON_MCE_DURING_VMENTRY] = handle_machine_check,
    > };
    >
    > static const int kvm_vmx_max_exit_handlers =
    > @@ -3161,8 +3199,8 @@ static const int kvm_vmx_max_exit_handle
    > */
    > static int kvm_handle_exit(struct kvm_run *kvm_run, struct kvm_vcpu *vcpu)
    > {
    > - u32 exit_reason = vmcs_read32(VM_EXIT_REASON);
    > struct vcpu_vmx *vmx = to_vmx(vcpu);
    > + u32 exit_reason = vmx->exit_reason;
    > u32 vectoring_info = vmx->idt_vectoring_info;
    >
    > KVMTRACE_3D(VMEXIT, vcpu, exit_reason, (u32)kvm_rip_read(vcpu),
    > @@ -3512,6 +3550,14 @@ static void vmx_vcpu_run(struct kvm_vcpu
    >
    > intr_info = vmcs_read32(VM_EXIT_INTR_INFO);
    >
    > + vmx->exit_reason = vmcs_read32(VM_EXIT_REASON);
    > +
    > + /* Handle machine checks before interrupts are enabled */
    > + if ((vmx->exit_reason == EXIT_REASON_MCE_DURING_VMENTRY)
    > + || (vmx->exit_reason == EXIT_REASON_EXCEPTION_NMI
    > + && is_machine_check(exit_intr_info)))
    > + kvm_machine_check();
    > +
    > /* We need to handle NMIs before interrupts are enabled */
    > if ((intr_info & INTR_INFO_INTR_TYPE_MASK) == INTR_TYPE_NMI_INTR &&
    > (intr_info & INTR_INFO_VALID_MASK)) {
    >
    >
    > Patches currently in stable-queue which might be from ak@linux.intel.com are
    >
    > queue-2.6.30/kvm-add-vt-x-machine-check-support.patch


    \
     
     \ /
      Last update: 2009-07-01 00:57    [W:0.039 / U:0.604 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site