From: Sean Christopherson <seanjc@google.com>
To: "彭浩(Richard)" <richard.peng@oppo.com>
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
"Suravee.Suthikulpanit@amd.com" <Suravee.Suthikulpanit@amd.com>,
"kvm@vger.kernel.org;" <kvm@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [PATCH] kvm/svm: fixed a potential register value inconsistent with variable ldr_reg
Date: Wed, 25 Nov 2020 21:33:20 +0000 [thread overview]
Message-ID: <20201125213320.GB450871@google.com> (raw)
In-Reply-To: <HKAPR02MB429179237547D0B00A2F2C6FE0FA0@HKAPR02MB4291.apcprd02.prod.outlook.com>
On Wed, Nov 25, 2020, 彭浩(Richard) wrote:
> If the ldr value is read out to zero, it does not call avic_ldr_write to update
> the virtual register, but the variable ldr_reg is updated.
Is there a failure associated with this? And/or can you elaborate on why
skipping the svm->ldr_reg is correct?
I'm not familiar with the AVIC spec, and it's not at all clear to me what the
correct behavior should be for the LDR updates. E.g. skipping the svm->ldr_reg
update appears to break avic_handle_apic_id_update(), which will see a stale
svm->ldr_reg and call avic_invalidate_logical_id_entry() when it presumably
should not.
> Fixes: 98d90582be2e ("SVM: Fix AVIC DFR and LDR handling")
> Signed-off-by: Peng Hao <richard.peng@oppo.com>
> ---
> arch/x86/kvm/svm/avic.c | 14 ++++++++------
> 1 file changed, 8 insertions(+), 6 deletions(-)
>
> diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c
> index 8c550999ace0..318735e0f2d0 100644
> --- a/arch/x86/kvm/svm/avic.c
> +++ b/arch/x86/kvm/svm/avic.c
> @@ -417,7 +417,6 @@ static void avic_invalidate_logical_id_entry(struct kvm_vcpu *vcpu)
>
> static int avic_handle_ldr_update(struct kvm_vcpu *vcpu)
> {
> - int ret = 0;
> struct vcpu_svm *svm = to_svm(vcpu);
> u32 ldr = kvm_lapic_get_reg(vcpu->arch.apic, APIC_LDR);
> u32 id = kvm_xapic_id(vcpu->arch.apic);
> @@ -427,13 +426,16 @@ static int avic_handle_ldr_update(struct kvm_vcpu *vcpu)
>
> avic_invalidate_logical_id_entry(vcpu);
>
> - if (ldr)
> + if (ldr) {
> + int ret;
> ret = avic_ldr_write(vcpu, id, ldr);
>
> - if (!ret)
> - svm->ldr_reg = ldr;
> -
> - return ret;
> + if (!ret)
> + svm->ldr_reg = ldr;
> + else
> + return ret;
> + }
> + return 0;
> }
>
> static int avic_handle_apic_id_update(struct kvm_vcpu *vcpu)
> --
> 2.18.4
prev parent reply other threads:[~2020-11-25 21:33 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-25 15:11 [PATCH] kvm/svm: fixed a potential register value inconsistent with variable ldr_reg 彭浩(Richard)
2020-11-25 21:33 ` Sean Christopherson [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201125213320.GB450871@google.com \
--to=seanjc@google.com \
--cc=Suravee.Suthikulpanit@amd.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=richard.peng@oppo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox