Re: [PATCH 02/11] KVM: SVM: Fix wrong interrupt injection inenable_irq_windows
From: Joerg Roedel
Date: Mon Feb 22 2010 - 05:29:25 EST
Hi Avi,
forgot this one? I did not find it in your tree.
Joerg
On Fri, Feb 19, 2010 at 04:23:01PM +0100, Joerg Roedel wrote:
> The nested_svm_intr() function does not execute the vmexit
> anymore. Therefore we may still be in the nested state after
> that function ran. This patch changes the nested_svm_intr()
> function to return wether the irq window could be enabled.
>
> Cc: stable@xxxxxxxxxx
> Signed-off-by: Joerg Roedel <joerg.roedel@xxxxxxx>
> ---
> arch/x86/kvm/svm.c | 17 ++++++++---------
> 1 files changed, 8 insertions(+), 9 deletions(-)
>
> diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
> index 63ecd4d..f87fc98 100644
> --- a/arch/x86/kvm/svm.c
> +++ b/arch/x86/kvm/svm.c
> @@ -1389,16 +1389,17 @@ static int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
> return nested_svm_exit_handled(svm);
> }
>
> -static inline int nested_svm_intr(struct vcpu_svm *svm)
> +/* This function returns true if it is save to enable the irq window */
> +static inline bool nested_svm_intr(struct vcpu_svm *svm)
> {
> if (!is_nested(svm))
> - return 0;
> + return true;
>
> if (!(svm->vcpu.arch.hflags & HF_VINTR_MASK))
> - return 0;
> + return true;
>
> if (!(svm->vcpu.arch.hflags & HF_HIF_MASK))
> - return 0;
> + return false;
>
> svm->vmcb->control.exit_code = SVM_EXIT_INTR;
>
> @@ -1411,10 +1412,10 @@ static inline int nested_svm_intr(struct vcpu_svm *svm)
> */
> svm->nested.exit_required = true;
> trace_kvm_nested_intr_vmexit(svm->vmcb->save.rip);
> - return 1;
> + return false;
> }
>
> - return 0;
> + return true;
> }
>
> static void *nested_svm_map(struct vcpu_svm *svm, u64 gpa, struct page **_page)
> @@ -2563,13 +2564,11 @@ static void enable_irq_window(struct kvm_vcpu *vcpu)
> {
> struct vcpu_svm *svm = to_svm(vcpu);
>
> - nested_svm_intr(svm);
> -
> /* In case GIF=0 we can't rely on the CPU to tell us when
> * GIF becomes 1, because that's a separate STGI/VMRUN intercept.
> * The next time we get that intercept, this function will be
> * called again though and we'll get the vintr intercept. */
> - if (gif_set(svm)) {
> + if (gif_set(svm) && nested_svm_intr(svm)) {
> svm_set_vintr(svm);
> svm_inject_irq(svm, 0x0);
> }
> --
> 1.6.6
>
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/