From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Suravee Suthikulanit <suravee.suthikulpanit@amd.com>
Cc: pbonzini@redhat.com, joro@8bytes.org, bp@alien8.de,
gleb@kernel.org, alex.williamson@redhat.com, kvm@vger.kernel.org,
linux-kernel@vger.kernel.org, wei@redhat.com,
sherry.hurwitz@amd.com
Subject: Re: [PART1 RFC v4 08/11] svm: Add VMEXIT handlers for AVIC
Date: Fri, 29 Apr 2016 16:56:27 +0200 [thread overview]
Message-ID: <20160429145627.GC15747@potion> (raw)
In-Reply-To: <572289D1.5040901@amd.com>
2016-04-28 17:08-0500, Suravee Suthikulanit:
> On 4/12/2016 11:22 AM, Radim Krčmář wrote:
>> 2016-04-07 03:20-0500, Suravee Suthikulpanit:
>> > From: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
>> >
>> > This patch introduces VMEXIT handlers, avic_incomplete_ipi_interception()
>> > and avic_unaccelerated_access_interception() along with two trace points
>> > (trace_kvm_avic_incomplete_ipi and trace_kvm_avic_unaccelerated_access).
>> >
>> > Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@amd.com>
>> > ---
>> > diff --git a/arch/x86/kvm/svm.c b/arch/x86/kvm/svm.c
>> > @@ -3515,6 +3515,250 @@ static int mwait_interception(struct vcpu_svm *svm)
>> > [...]
>> > + lid = ffs(dlid) - 1;
>> > + ret = avic_handle_ldr_write(&svm->vcpu, svm->vcpu.vcpu_id, lid);
>> > + if (ret)
>> > + return 0;
>>
>> OS can actually change LDR, so the old one should be invalidated.
>>
>> (No OS does, but that is not an important factor for the hypervisor.)
>>
>
> By validating the old one, are you suggesting that we should disable the
> logical APIC table entry previously used by this vcpu? If so, that means we
> would need to cached the previous LDR value since the one in vAPIC backing
> page would already be updated.
Yes, the cache could be used to speed up recalculate_apic_map() too, so
it might not be a total waste.
Which reminds me that physical APIC_ID doesn't use correct cache.
svm->vcpu.vcpu_id is only the initial ID, but APIC_ID could be changed
more than once.
It would be great to make APIC_ID read-only in all cases, because x86
spec allows us to do so, but KVM_SET_LAPIC can set APIC ID too and I
think we don't retroactively modify userspace API ... Paolo?
>> > [...]
>>
>> > + if (vm_data->ldr_mode != mod) {
>> > + clear_page(page_address(vm_data->avic_logical_id_table_page));
>> > + vm_data->ldr_mode = mod;
>> > + }
>> > + break;
>> > + }
>>
>> All these cases need to be called on KVM_SET_LAPIC -- the userspace can
>> provide completely new set of APIC registers and AVIC should build its
>> maps with them. Test with save/restore or migration.
>
> Hm.. This means we might need to introduce a new hook which is called from
> the arch/x86/kvm/lapic.c: kvm_apic_post_state_restore(). Probably something
> like kvm_x86_ops->apic_post_state_restore(), which sets up the new physical
> and logical APIC id tables for AVIC.
Sounds good. I imagine the callback would just call
avic_unaccel_trap_write() for relevant registers.
>> > + return ret;
>>
>> because we should not return, but continue to emulate the access.
>
> Then, this would continue as if we are handling the normal fault access.
Exactly, it is a normal access to an undefined register.
>> > + }
>> > +
>> > + if (trap) {
>> > + /* Handling Trap */
>> > + if (!write) /* Trap read should never happens */
>> > + BUG();
>>
>> (BUG_ON(!write) is shorter, though I would avoid BUG -- only guests are
>> going to fail, so we don't need to kill the host.)
>
> Ok. What about just WARN_ONCE(!write, "svm: Handling trap read.\n");
Sure, it's a hardware bug and calling avic_unaccel_trap_write() on a
read access shouldn't result in a bug. I am slightly inclined towards
'if (trap && write)' and optional 'WARN_ONCE(trap,' in the else branch.
Thanks.
next prev parent reply other threads:[~2016-04-29 14:56 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-04-07 8:20 [PART1 RFC v4 00/11] KVM: x86: Introduce SVM AVIC support Suravee Suthikulpanit
2016-04-07 8:20 ` [PART1 RFC v4 01/11] KVM: x86: Misc LAPIC changes to expose helper functions Suravee Suthikulpanit
2016-04-11 20:34 ` Radim Krčmář
2016-04-18 19:57 ` Suravee Suthikulpanit
2016-04-18 20:29 ` Suravee Suthikulpanit
2016-04-07 8:20 ` [PART1 RFC v4 02/11] KVM: x86: Introducing kvm_x86_ops VM init/uninit hooks Suravee Suthikulpanit
2016-04-11 20:49 ` Radim Krčmář
2016-04-12 21:55 ` Paolo Bonzini
2016-04-18 22:01 ` Suravee Suthikulpanit
2016-04-18 20:40 ` Suravee Suthikulpanit
2016-04-07 8:20 ` [PART1 RFC v4 03/11] KVM: x86: Introducing kvm_x86_ops VCPU blocking/unblocking hooks Suravee Suthikulpanit
2016-04-07 8:20 ` [PART1 RFC v4 04/11] KVM: split kvm_vcpu_wake_up from kvm_vcpu_kick Suravee Suthikulpanit
2016-04-07 8:20 ` [PART1 RFC v4 05/11] svm: Introduce new AVIC VMCB registers Suravee Suthikulpanit
2016-04-07 8:20 ` [PART1 RFC v4 06/11] KVM: x86: Detect and Initialize AVIC support Suravee Suthikulpanit
2016-04-11 20:48 ` Radim Krčmář
2016-04-12 21:54 ` Paolo Bonzini
2016-04-07 8:20 ` [PART1 RFC v4 07/11] svm: Add interrupt injection via AVIC Suravee Suthikulpanit
2016-04-11 20:52 ` Radim Krčmář
2016-04-07 8:20 ` [PART1 RFC v4 08/11] svm: Add VMEXIT handlers for AVIC Suravee Suthikulpanit
2016-04-12 16:22 ` Radim Krčmář
2016-04-12 22:29 ` Paolo Bonzini
2016-04-13 12:37 ` Radim Krčmář
2016-04-28 22:08 ` Suravee Suthikulanit
2016-04-29 14:56 ` Radim Krčmář [this message]
2016-04-07 8:20 ` [PART1 RFC v4 09/11] svm: Do not expose x2APIC when enable AVIC Suravee Suthikulpanit
2016-04-11 20:54 ` Radim Krčmář
2016-04-12 22:09 ` Paolo Bonzini
2016-04-07 8:20 ` [PART1 RFC v4 10/11] svm: Do not intercept CR8 " Suravee Suthikulpanit
2016-04-12 14:18 ` Radim Krčmář
2016-04-12 22:26 ` Paolo Bonzini
2016-04-07 8:20 ` [PART1 RFC v4 11/11] svm: Manage vcpu load/unload " Suravee Suthikulpanit
2016-04-12 14:34 ` Radim Krčmář
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=20160429145627.GC15747@potion \
--to=rkrcmar@redhat.com \
--cc=alex.williamson@redhat.com \
--cc=bp@alien8.de \
--cc=gleb@kernel.org \
--cc=joro@8bytes.org \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=sherry.hurwitz@amd.com \
--cc=suravee.suthikulpanit@amd.com \
--cc=wei@redhat.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