* Linux in VirtualPC in KVM fails
@ 2009-01-09 15:43 Kevin Wolf
2009-01-09 17:50 ` Avi Kivity
0 siblings, 1 reply; 12+ messages in thread
From: Kevin Wolf @ 2009-01-09 15:43 UTC (permalink / raw)
To: kvm; +Cc: Alexander Graf
Hi,
let's start with the scenario I tried to use: I have two levels of
virtualization. On the physical hardware I run a Linux with KVM. The KVM
guest is a Win2k3 VM which runs VirtualPC. In VirtualPC I try to run a
Linux again (openSUSE 11.1 to be specific, but that shouldn't matter).
The boot menu comes up nicely and so on, but early in the kernel boot it
crashes:
EIP is at kvm_deferred_mmu_op+0x46/0xbf
Call Trace:
[<c0117f79>] kvm_mmu_write+0x59/0x61
[<c011bad9>] set_pte_vaddr+0x95/0xec
[<c011b3b2>] __native_set_fixmap+0x1d/0x24
[<c054ae5b>] test_wp_bit+0x24/0x6c
[<c054b6b1>] mem_init+0x295/0x2b8
[<c053a8a3>] start_kernel+0x262/0x31f
Now obviously this is a KVM function where there should be none. The
problem seems to be that VirtualPC doesn't intercept cpuid and thus the
VirtualPC guest sees the KVM cpuid values where it better wouldn't.
Consequently, it turns on the paravirt support for KVM which is exactly
wrong and leads to the crash on the first hypercall.
The guest has no chance to detect correctly if it's running directly on
KVM or if there is another virtualization layer which can't emulate
cpuid. So the fix must involve the mechanism itself. Alex has suggested
to change the interface to use a KVM-specific MSR instead of cpuid as
these should be handled by any virtualization software. I'm copying him
so he can take over for the details, I just want to get the discussion
started.
So... Comments? Suggestions? Patches? ;-)
Kevin
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 15:43 Linux in VirtualPC in KVM fails Kevin Wolf
@ 2009-01-09 17:50 ` Avi Kivity
2009-01-09 19:00 ` Alexander Graf
2009-01-09 19:05 ` Anthony Liguori
0 siblings, 2 replies; 12+ messages in thread
From: Avi Kivity @ 2009-01-09 17:50 UTC (permalink / raw)
To: Kevin Wolf; +Cc: kvm, Alexander Graf
Kevin Wolf wrote:
> Hi,
>
> let's start with the scenario I tried to use: I have two levels of
> virtualization. On the physical hardware I run a Linux with KVM. The KVM
> guest is a Win2k3 VM which runs VirtualPC. In VirtualPC I try to run a
> Linux again (openSUSE 11.1 to be specific, but that shouldn't matter).
>
> The boot menu comes up nicely and so on, but early in the kernel boot it
> crashes:
>
> EIP is at kvm_deferred_mmu_op+0x46/0xbf
> Call Trace:
> [<c0117f79>] kvm_mmu_write+0x59/0x61
> [<c011bad9>] set_pte_vaddr+0x95/0xec
> [<c011b3b2>] __native_set_fixmap+0x1d/0x24
> [<c054ae5b>] test_wp_bit+0x24/0x6c
> [<c054b6b1>] mem_init+0x295/0x2b8
> [<c053a8a3>] start_kernel+0x262/0x31f
>
> Now obviously this is a KVM function where there should be none. The
> problem seems to be that VirtualPC doesn't intercept cpuid and thus the
> VirtualPC guest sees the KVM cpuid values where it better wouldn't.
> Consequently, it turns on the paravirt support for KVM which is exactly
> wrong and leads to the crash on the first hypercall.
>
> The guest has no chance to detect correctly if it's running directly on
> KVM or if there is another virtualization layer which can't emulate
> cpuid. So the fix must involve the mechanism itself. Alex has suggested
> to change the interface to use a KVM-specific MSR instead of cpuid as
> these should be handled by any virtualization software. I'm copying him
> so he can take over for the details, I just want to get the discussion
> started.
>
> So... Comments? Suggestions? Patches? ;-)
>
Gaa. Looks like cpuid is totally broken by first-generation
virtualization products.
We're in a nice compatibility mess. We can't just switch paravirt
detection methods since that will break older guests _and_ older hosts
on non-nested virtualization (which is the common case).
So I suggest:
- add a new cpuid bit, for 'paravirt verification'
- if the new bit is present, the guest verifies that paravirt is truly
enabled by reading an msr (and checking a signature).
Older guests or newer guests running on older hosts will still be
broken, but there's a command line parameter for disabling paravirt on
the guest, and we can add one for the host as well.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 17:50 ` Avi Kivity
@ 2009-01-09 19:00 ` Alexander Graf
2009-01-09 19:04 ` Anthony Liguori
2009-01-09 19:34 ` Avi Kivity
2009-01-09 19:05 ` Anthony Liguori
1 sibling, 2 replies; 12+ messages in thread
From: Alexander Graf @ 2009-01-09 19:00 UTC (permalink / raw)
To: Avi Kivity; +Cc: Kevin Wolf, kvm
On 09.01.2009, at 18:50, Avi Kivity wrote:
> Kevin Wolf wrote:
>> Hi,
>>
>> let's start with the scenario I tried to use: I have two levels of
>> virtualization. On the physical hardware I run a Linux with KVM.
>> The KVM
>> guest is a Win2k3 VM which runs VirtualPC. In VirtualPC I try to
>> run a
>> Linux again (openSUSE 11.1 to be specific, but that shouldn't
>> matter).
>>
>> The boot menu comes up nicely and so on, but early in the kernel
>> boot it
>> crashes:
>>
>> EIP is at kvm_deferred_mmu_op+0x46/0xbf
>> Call Trace:
>> [<c0117f79>] kvm_mmu_write+0x59/0x61
>> [<c011bad9>] set_pte_vaddr+0x95/0xec
>> [<c011b3b2>] __native_set_fixmap+0x1d/0x24
>> [<c054ae5b>] test_wp_bit+0x24/0x6c
>> [<c054b6b1>] mem_init+0x295/0x2b8
>> [<c053a8a3>] start_kernel+0x262/0x31f
>>
>> Now obviously this is a KVM function where there should be none. The
>> problem seems to be that VirtualPC doesn't intercept cpuid and thus
>> the
>> VirtualPC guest sees the KVM cpuid values where it better wouldn't.
>> Consequently, it turns on the paravirt support for KVM which is
>> exactly
>> wrong and leads to the crash on the first hypercall.
>>
>> The guest has no chance to detect correctly if it's running
>> directly on
>> KVM or if there is another virtualization layer which can't emulate
>> cpuid. So the fix must involve the mechanism itself. Alex has
>> suggested
>> to change the interface to use a KVM-specific MSR instead of cpuid as
>> these should be handled by any virtualization software. I'm copying
>> him
>> so he can take over for the details, I just want to get the
>> discussion
>> started.
>>
>> So... Comments? Suggestions? Patches? ;-)
>>
>
> Gaa. Looks like cpuid is totally broken by first-generation
> virtualization products.
>
> We're in a nice compatibility mess. We can't just switch paravirt
> detection methods since that will break older guests _and_ older
> hosts on non-nested virtualization (which is the common case).
Shouldn't it be ok to push patches to linux-stable to use the CPUID
and MSR information and simply not expose the CPUID identification in
newer KVM versions? That way older guests on newer KVM don't use KVM
paravirt (which should still be ok), but everything else runs as
smoothly as possible.
Alex
> So I suggest:
> - add a new cpuid bit, for 'paravirt verification'
> - if the new bit is present, the guest verifies that paravirt is
> truly enabled by reading an msr (and checking a signature).
>
> Older guests or newer guests running on older hosts will still be
> broken, but there's a command line parameter for disabling paravirt
> on the guest, and we can add one for the host as well.
>
> --
> I have a truly marvellous patch that fixes the bug which this
> signature is too narrow to contain.
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 19:00 ` Alexander Graf
@ 2009-01-09 19:04 ` Anthony Liguori
2009-01-09 19:32 ` Avi Kivity
2009-01-09 19:34 ` Avi Kivity
1 sibling, 1 reply; 12+ messages in thread
From: Anthony Liguori @ 2009-01-09 19:04 UTC (permalink / raw)
To: Alexander Graf; +Cc: Avi Kivity, Kevin Wolf, kvm
Alexander Graf wrote:
>
> Shouldn't it be ok to push patches to linux-stable to use the CPUID
> and MSR information and simply not expose the CPUID identification in
> newer KVM versions? That way older guests on newer KVM don't use KVM
> paravirt (which should still be ok), but everything else runs as
> smoothly as possible.
I'd say that VirtualPC is broken and leave it at that.
All modern hypervisors use CPUID to expose themselves to the guests.
VirtualPC is totally capable of rewriting CPUID instructions. Shame on
it for not doing so. I don't think we should change anything.
Regards,
Anthony Liguori
> Alex
>
>> So I suggest:
>> - add a new cpuid bit, for 'paravirt verification'
>> - if the new bit is present, the guest verifies that paravirt is
>> truly enabled by reading an msr (and checking a signature).
>>
>> Older guests or newer guests running on older hosts will still be
>> broken, but there's a command line parameter for disabling paravirt
>> on the guest, and we can add one for the host as well.
>>
>> --
>> I have a truly marvellous patch that fixes the bug which this
>> signature is too narrow to contain.
>>
>
> --
> To unsubscribe from this list: send the line "unsubscribe kvm" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 19:04 ` Anthony Liguori
@ 2009-01-09 19:32 ` Avi Kivity
2009-01-09 20:10 ` Anthony Liguori
0 siblings, 1 reply; 12+ messages in thread
From: Avi Kivity @ 2009-01-09 19:32 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Alexander Graf, Kevin Wolf, kvm
Anthony Liguori wrote:
> Alexander Graf wrote:
>>
>> Shouldn't it be ok to push patches to linux-stable to use the CPUID
>> and MSR information and simply not expose the CPUID identification in
>> newer KVM versions? That way older guests on newer KVM don't use KVM
>> paravirt (which should still be ok), but everything else runs as
>> smoothly as possible.
>
> I'd say that VirtualPC is broken and leave it at that.
>
> All modern hypervisors use CPUID to expose themselves to the guests.
> VirtualPC is totally capable of rewriting CPUID instructions.
Apparently it isn't. I know of one other fullvirt product that does not
jit kernel code. Or maybe they wanted to preserve consistency between
kernel cpuid and host cpuid.
> Shame on it for not doing so. I don't think we should change anything.
PC hardware and software are full of examples of such brokenness. One
of the most painful examples is Linux using the tsc for time of day
despite the fact that the tsc was explicitly advertised not to be fit
for that role.
If there's an easy and backwards compatible way to support Virtual PC,
we should implement it.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 19:32 ` Avi Kivity
@ 2009-01-09 20:10 ` Anthony Liguori
2009-01-11 7:16 ` Avi Kivity
0 siblings, 1 reply; 12+ messages in thread
From: Anthony Liguori @ 2009-01-09 20:10 UTC (permalink / raw)
To: Avi Kivity; +Cc: Alexander Graf, Kevin Wolf, kvm
Avi Kivity wrote:
> Anthony Liguori wrote:
>> Alexander Graf wrote:
>>>
>>> Shouldn't it be ok to push patches to linux-stable to use the CPUID
>>> and MSR information and simply not expose the CPUID identification
>>> in newer KVM versions? That way older guests on newer KVM don't use
>>> KVM paravirt (which should still be ok), but everything else runs as
>>> smoothly as possible.
>>
>> I'd say that VirtualPC is broken and leave it at that.
>>
>> All modern hypervisors use CPUID to expose themselves to the guests.
>> VirtualPC is totally capable of rewriting CPUID instructions.
>
> Apparently it isn't. I know of one other fullvirt product that does
> not jit kernel code. Or maybe they wanted to preserve consistency
> between kernel cpuid and host cpuid.
How can you get away with not jitting kernel code?
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 19:00 ` Alexander Graf
2009-01-09 19:04 ` Anthony Liguori
@ 2009-01-09 19:34 ` Avi Kivity
1 sibling, 0 replies; 12+ messages in thread
From: Avi Kivity @ 2009-01-09 19:34 UTC (permalink / raw)
To: Alexander Graf; +Cc: Kevin Wolf, kvm
Alexander Graf wrote:
>> We're in a nice compatibility mess. We can't just switch paravirt
>> detection methods since that will break older guests _and_ older
>> hosts on non-nested virtualization (which is the common case).
>
> Shouldn't it be ok to push patches to linux-stable to use the CPUID
> and MSR information and simply not expose the CPUID identification in
> newer KVM versions? That way older guests on newer KVM don't use KVM
> paravirt (which should still be ok), but everything else runs as
> smoothly as possible.
No. It's a regression (esp. kvmclock).
It's perfectly legitimate to say we support Virtual PC beginning some
kvm version (and to supply the command line workaround for older
versions). But we shouldn't knowingly break existing setups.
--
I have a truly marvellous patch that fixes the bug which this
signature is too narrow to contain.
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 17:50 ` Avi Kivity
2009-01-09 19:00 ` Alexander Graf
@ 2009-01-09 19:05 ` Anthony Liguori
2009-01-09 19:24 ` Alexander Graf
1 sibling, 1 reply; 12+ messages in thread
From: Anthony Liguori @ 2009-01-09 19:05 UTC (permalink / raw)
To: Avi Kivity; +Cc: Kevin Wolf, kvm, Alexander Graf
Avi Kivity wrote:
> Kevin Wolf wrote:
>> Hi,
>>
>> let's start with the scenario I tried to use: I have two levels of
>> virtualization. On the physical hardware I run a Linux with KVM. The KVM
>> guest is a Win2k3 VM which runs VirtualPC. In VirtualPC I try to run a
>> Linux again (openSUSE 11.1 to be specific, but that shouldn't matter).
>>
>> The boot menu comes up nicely and so on, but early in the kernel boot it
>> crashes:
>>
>> EIP is at kvm_deferred_mmu_op+0x46/0xbf
>> Call Trace:
>> [<c0117f79>] kvm_mmu_write+0x59/0x61
>> [<c011bad9>] set_pte_vaddr+0x95/0xec
>> [<c011b3b2>] __native_set_fixmap+0x1d/0x24
>> [<c054ae5b>] test_wp_bit+0x24/0x6c
>> [<c054b6b1>] mem_init+0x295/0x2b8
>> [<c053a8a3>] start_kernel+0x262/0x31f
>>
>> Now obviously this is a KVM function where there should be none. The
>> problem seems to be that VirtualPC doesn't intercept cpuid and thus the
>> VirtualPC guest sees the KVM cpuid values where it better wouldn't.
>> Consequently, it turns on the paravirt support for KVM which is exactly
>> wrong and leads to the crash on the first hypercall.
>>
>> The guest has no chance to detect correctly if it's running directly on
>> KVM or if there is another virtualization layer which can't emulate
>> cpuid. So the fix must involve the mechanism itself. Alex has suggested
>> to change the interface to use a KVM-specific MSR instead of cpuid as
>> these should be handled by any virtualization software. I'm copying him
>> so he can take over for the details, I just want to get the discussion
>> started.
>>
>> So... Comments? Suggestions? Patches? ;-)
>>
>
> Gaa. Looks like cpuid is totally broken by first-generation
> virtualization products.
Not at all. There's no reason that a JIT'ing virtualization product
can't rewrite CPUID to a function call and then mask off unsupported
bits. It's a bug in the virtualization product if it doesn't do this.
Regards,
Anthony Liguori
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 19:05 ` Anthony Liguori
@ 2009-01-09 19:24 ` Alexander Graf
2009-01-09 20:09 ` Anthony Liguori
0 siblings, 1 reply; 12+ messages in thread
From: Alexander Graf @ 2009-01-09 19:24 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Avi Kivity, Kevin Wolf, kvm
On 09.01.2009, at 20:05, Anthony Liguori wrote:
> Avi Kivity wrote:
>> Kevin Wolf wrote:
>>> Hi,
>>>
>>> let's start with the scenario I tried to use: I have two levels of
>>> virtualization. On the physical hardware I run a Linux with KVM.
>>> The KVM
>>> guest is a Win2k3 VM which runs VirtualPC. In VirtualPC I try to
>>> run a
>>> Linux again (openSUSE 11.1 to be specific, but that shouldn't
>>> matter).
>>>
>>> The boot menu comes up nicely and so on, but early in the kernel
>>> boot it
>>> crashes:
>>>
>>> EIP is at kvm_deferred_mmu_op+0x46/0xbf
>>> Call Trace:
>>> [<c0117f79>] kvm_mmu_write+0x59/0x61
>>> [<c011bad9>] set_pte_vaddr+0x95/0xec
>>> [<c011b3b2>] __native_set_fixmap+0x1d/0x24
>>> [<c054ae5b>] test_wp_bit+0x24/0x6c
>>> [<c054b6b1>] mem_init+0x295/0x2b8
>>> [<c053a8a3>] start_kernel+0x262/0x31f
>>>
>>> Now obviously this is a KVM function where there should be none. The
>>> problem seems to be that VirtualPC doesn't intercept cpuid and
>>> thus the
>>> VirtualPC guest sees the KVM cpuid values where it better wouldn't.
>>> Consequently, it turns on the paravirt support for KVM which is
>>> exactly
>>> wrong and leads to the crash on the first hypercall.
>>>
>>> The guest has no chance to detect correctly if it's running
>>> directly on
>>> KVM or if there is another virtualization layer which can't emulate
>>> cpuid. So the fix must involve the mechanism itself. Alex has
>>> suggested
>>> to change the interface to use a KVM-specific MSR instead of cpuid
>>> as
>>> these should be handled by any virtualization software. I'm
>>> copying him
>>> so he can take over for the details, I just want to get the
>>> discussion
>>> started.
>>>
>>> So... Comments? Suggestions? Patches? ;-)
>>>
>>
>> Gaa. Looks like cpuid is totally broken by first-generation
>> virtualization products.
>
> Not at all. There's no reason that a JIT'ing virtualization product
> can't rewrite CPUID to a function call and then mask off unsupported
> bits. It's a bug in the virtualization product if it doesn't do this.
Isn't one of the great things about virtualization the fact that you
can do things you can on real hardware in the virtual machine? While
I'm not exactly a fan of VirtualPC, I would still like it to work in
KVM, as that's what real hardware is capable of.
Alex
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 19:24 ` Alexander Graf
@ 2009-01-09 20:09 ` Anthony Liguori
2009-01-11 7:17 ` Avi Kivity
0 siblings, 1 reply; 12+ messages in thread
From: Anthony Liguori @ 2009-01-09 20:09 UTC (permalink / raw)
To: Alexander Graf; +Cc: Avi Kivity, Kevin Wolf, kvm
Alexander Graf wrote:
>
> Isn't one of the great things about virtualization the fact that you
> can do things you can on real hardware in the virtual machine? While
> I'm not exactly a fan of VirtualPC, I would still like it to work in
> KVM, as that's what real hardware is capable of.
Paravirtualization support is advertised in userspace, just add a flag
to QEMU to disable KVM paravirt support.
Regards,
Anthony Liguori
> Alex
>
^ permalink raw reply [flat|nested] 12+ messages in thread
* Re: Linux in VirtualPC in KVM fails
2009-01-09 20:09 ` Anthony Liguori
@ 2009-01-11 7:17 ` Avi Kivity
0 siblings, 0 replies; 12+ messages in thread
From: Avi Kivity @ 2009-01-11 7:17 UTC (permalink / raw)
To: Anthony Liguori; +Cc: Alexander Graf, Kevin Wolf, kvm
Anthony Liguori wrote:
> Alexander Graf wrote:
>>
>> Isn't one of the great things about virtualization the fact that you
>> can do things you can on real hardware in the virtual machine? While
>> I'm not exactly a fan of VirtualPC, I would still like it to work in
>> KVM, as that's what real hardware is capable of.
>
> Paravirtualization support is advertised in userspace, just add a flag
> to QEMU to disable KVM paravirt support.
That's helpful. But I would like (in addition) a fix that does not
require administrative involvement.
The host admin should not need to know anything about what the guest
runs. That's not achievable in practice, but where it is, we want it.
--
error compiling committee.c: too many arguments to function
^ permalink raw reply [flat|nested] 12+ messages in thread
end of thread, other threads:[~2009-01-11 7:17 UTC | newest]
Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2009-01-09 15:43 Linux in VirtualPC in KVM fails Kevin Wolf
2009-01-09 17:50 ` Avi Kivity
2009-01-09 19:00 ` Alexander Graf
2009-01-09 19:04 ` Anthony Liguori
2009-01-09 19:32 ` Avi Kivity
2009-01-09 20:10 ` Anthony Liguori
2009-01-11 7:16 ` Avi Kivity
2009-01-09 19:34 ` Avi Kivity
2009-01-09 19:05 ` Anthony Liguori
2009-01-09 19:24 ` Alexander Graf
2009-01-09 20:09 ` Anthony Liguori
2009-01-11 7:17 ` Avi Kivity
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox