From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paolo Bonzini <pbonzini@redhat.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
"Radim Krčmář" <rkrcmar@redhat.com>,
stable@vger.kernel.org
Subject: Re: [PATCH] kvm: x86: disable KVM_FAST_MMIO_BUS
Date: Wed, 16 Aug 2017 17:03:20 +0300 [thread overview]
Message-ID: <20170816165719-mutt-send-email-mst@kernel.org> (raw)
In-Reply-To: <fb384aa5-6b8a-4d70-98bb-2ce2adbcaab4@redhat.com>
On Wed, Aug 16, 2017 at 03:30:31PM +0200, Paolo Bonzini wrote:
> On 16/08/2017 15:16, Michael S. Tsirkin wrote:
> > On Wed, Aug 16, 2017 at 03:05:51PM +0200, Paolo Bonzini wrote:
> >> On 16/08/2017 14:58, Michael S. Tsirkin wrote:
> >>> On Wed, Aug 16, 2017 at 01:22:49PM +0200, Paolo Bonzini wrote:
> >>>> Microsoft pointed out privately to me that KVM's handling of
> >>>> KVM_FAST_MMIO_BUS is invalid. Using skip_emulation_instruction is invalid
> >>>> in EPT misconfiguration vmexit handlers, because neither EPT violations
> >>>> nor misconfigurations are listed in the manual among the VM exits that
> >>>> set the VM-exit instruction length field.
> >>>>
> >>>> While physical processors seem to set the field, this is not architectural
> >>>> and is just a side effect of the implementation. I couldn't convince
> >>>> myself of any condition on the exit qualification where VM-exit
> >>>> instruction length "has" to be defined; there are no trap-like VM-exits
> >>>> that can be repurposed; and fault-like VM-exits such as descriptor-table
> >>>> exits provide no decoding information. So I don't really see any elegant
> >>>> way to fix it except by disabling KVM_FAST_MMIO_BUS, which means virtio
> >>>> 1 will go slower.
> >>>
> >>> How about I will try asking Intel about it? If they can commit to length
> >>> being there in the future, we are all set.
> >>
> >> Nope, "I couldn't convince myself of any condition on the exit
> >> qualification where VM-exit instruction length "has" to be defined". So
> >> assuming Intel can do it, it would only apply to future processors (2
> >> years+ for server SKUs).
> >
> > Well maybe there's a reason it's actually working. Let's see what can
> > be done.
>
> Sure there is. It just happens that the actual condition for VM-exit
> instruction length being set correctly is "the fault was taken after the
> accessing instruction has been decoded". But there's no way according
> to the spec to detect whether that has happened.
>
> While you can filter out instruction fetches, that's not enough. A data
> read could happen because someone pointed the IDT to MMIO area, and who
> knows what the VM-exit instruction length points to in that case.
Interesting. We use it with MMIO so this kind of hack is not supposed to
work anyway. Does not seem to be worth slowing virtio for.
> >> Plus of course it wouldn't be guaranteed to work on nested.
> >
> > Not sure I got this one.
>
> Not all nested hypervisors are setting the VM-exit instruction length
> field on EPT violations, since it's documented not to be set.
I see. We could special case this by testing the hypervisor leaf
if we wanted to.
> >>>> Adding a hypercall or MSR write that does a fast MMIO write to a physical
> >>>> address would do it, but it adds hypervisor knowledge in virtio, including
> >>>> CPUID handling.
> >>>
> >>> Another issue is that it will break DPDK on virtio.
> >>
> >> Not break, just make it slower.
> >
> > I thought hypercalls can only be triggered from ring 0, userspace can't call them.
> > Dod I get it wrong?
>
> That's just a limitation that KVM makes on currently-defined hypercalls.
>
> VMCALL causes a vmexit if executed from ring 3.
>
> Paolo
OK but we will have to build our own protection mechanism then. With
MMIO we just used pagetables.
--
MST
next prev parent reply other threads:[~2017-08-16 14:03 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-08-16 11:22 [PATCH] kvm: x86: disable KVM_FAST_MMIO_BUS Paolo Bonzini
2017-08-16 12:07 ` Radim Krčmář
2017-08-16 13:37 ` Paolo Bonzini
2017-08-16 14:06 ` Michael S. Tsirkin
2017-08-16 14:17 ` Paolo Bonzini
2017-08-17 8:15 ` David Hildenbrand
2017-08-16 12:58 ` Michael S. Tsirkin
2017-08-16 13:05 ` Paolo Bonzini
2017-08-16 13:16 ` Michael S. Tsirkin
2017-08-16 13:30 ` Paolo Bonzini
2017-08-16 14:03 ` Michael S. Tsirkin [this message]
2017-08-16 16:50 ` Michael S. Tsirkin
2017-08-16 17:19 ` Paolo Bonzini
2017-08-16 19:03 ` Radim Krčmář
2017-08-16 19:59 ` Michael S. Tsirkin
2017-08-16 21:25 ` Paolo Bonzini
2017-08-16 22:31 ` Michael S. Tsirkin
2017-08-17 9:00 ` Paolo Bonzini
2017-08-17 12:14 ` Paolo Bonzini
2017-08-17 13:23 ` Radim Krčmář
2017-08-17 15:15 ` Michael S. Tsirkin
2017-08-17 13:51 ` Radim Krčmář
2017-08-17 15:27 ` Michael S. Tsirkin
2017-08-16 19:47 ` Michael S. Tsirkin
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=20170816165719-mutt-send-email-mst@kernel.org \
--to=mst@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=rkrcmar@redhat.com \
--cc=stable@vger.kernel.org \
/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