From: Alyssa Ross <hi@alyssa.is>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Paolo Bonzini <pbonzini@redhat.com>,
qemu-arm@nongnu.org, qemu-devel@nongnu.org, kvm@vger.kernel.org,
Eric Auger <eric.auger@redhat.com>,
Miguel Luis <miguel.luis@oracle.com>
Subject: Re: [PATCH] target/arm/kvm: fall back if nested unsupported
Date: Sun, 15 Mar 2026 10:25:33 +0100 [thread overview]
Message-ID: <87ms09v3zm.fsf@alyssa.is> (raw)
In-Reply-To: <CAFEAcA8ycT250JaECAYTKF+U2a4m6jauLPLbD8PVx2atd70A7g@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 3710 bytes --]
Peter Maydell <peter.maydell@linaro.org> writes:
> On Wed, 11 Mar 2026 at 09:54, Alyssa Ross <hi@alyssa.is> wrote:
>>
>> If I create a machine with more CPUs than KVM supports, but specify
>> multiple accelerator options, QEMU will fall back to the next
>> accelerator. This is great, because if I've explicitly specified
>> multiple accelerators, I've told QEMU I'm fine with any of them being
>> used to provide the machine I want.
>>
>> When I create a machine with nested virtualization enabled, though,
>> this doesn't happen. KVM often doesn't support it, but TCG always
>> does. The nice thing to do would be for QEMU to fall back to TCG if
>> KVM can't provide, like it does when too many CPUs are requested.
>> This patch adjusts the behaviour to do that.
>>
>> This is very helpful for OS development scripts that run an OS in QEMU
>> — I want everybody to be able to run the script, always with
>> virtualization enabled because the OS requires it, but for it to take
>> advantage of KVM acceleration when available.
>>
>> Signed-off-by: Alyssa Ross <hi@alyssa.is>
>> ---
>> hw/arm/virt.c | 6 ------
>> target/arm/kvm.c | 8 ++++++++
>> 2 files changed, 8 insertions(+), 6 deletions(-)
>>
>> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
>> index 7456614d05..0b63b2eac3 100644
>> --- a/hw/arm/virt.c
>> +++ b/hw/arm/virt.c
>> @@ -2372,12 +2372,6 @@ static void machvirt_init(MachineState *machine)
>> exit(1);
>> }
>>
>> - if (vms->virt && kvm_enabled() && !kvm_arm_el2_supported()) {
>> - error_report("mach-virt: host kernel KVM does not support providing "
>> - "Virtualization extensions to the guest CPU");
>> - exit(1);
>> - }
>> -
>> if (vms->virt && !kvm_enabled() && !tcg_enabled() && !qtest_enabled()) {
>> error_report("mach-virt: %s does not support providing "
>> "Virtualization extensions to the guest CPU",
>> diff --git a/target/arm/kvm.c b/target/arm/kvm.c
>> index d4a68874b8..20dcc6a820 100644
>> --- a/target/arm/kvm.c
>> +++ b/target/arm/kvm.c
>> @@ -615,6 +615,14 @@ int kvm_arch_init(MachineState *ms, KVMState *s)
>> ret = -EINVAL;
>> }
>>
>> + if (object_property_find(OBJECT(ms), "virtualization") &&
>> + object_property_get_bool(OBJECT(ms), "virtualization", NULL) &&
>> + !kvm_arm_el2_supported()) {
>> + error_report("Using ARM nested virtualization with KVM requires "
>> + "a host kernel with KVM_CAP_ARM_EL2");
>> + ret = -EINVAL;
>> + }
>
> Looking a bit closer at this, it's a bit awkward that we're
> looking at a machine property in generic target/arm code.
> There is no guarantee that the machine is "virt" or that every
> KVM-supporting machine has a "virtualization" property, and
> the target/ code isn't really supposed to do board-specific stuff.
>
> The board-independent way to say "are we trying to enable EL2" is
> to look at the CPU property has_el2. But the CPU isn't created at
> this point, so it's too early to do that here.
>
> Similar things where the early accelerator code wants information
> from the board we have handled with a method in MachineClass,
> like get_physical_address_range. We could do that here, but
> maybe it's a bit over-engineered? IDK.
What do you envisage this looking like for other platforms? Something I
considered when working on this patch was moving "virtualization" from a
machine to an accelerator property, but I ran into the problem that such
a property isn't exposed on e.g. x86_64 as far as I can tell. This
MachineState method would have the same problem.
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 227 bytes --]
prev parent reply other threads:[~2026-03-15 9:25 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-03-11 9:54 [PATCH] target/arm/kvm: fall back if nested unsupported Alyssa Ross
2026-03-11 16:08 ` Paolo Bonzini
2026-03-11 17:03 ` Peter Maydell
2026-03-11 17:18 ` Paolo Bonzini
2026-03-12 7:36 ` Alyssa Ross
2026-03-13 9:54 ` Peter Maydell
2026-03-13 11:47 ` Alyssa Ross
2026-03-13 12:33 ` Peter Maydell
2026-03-13 13:59 ` Mohamed Mediouni
2026-03-15 9:25 ` Alyssa Ross [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=87ms09v3zm.fsf@alyssa.is \
--to=hi@alyssa.is \
--cc=eric.auger@redhat.com \
--cc=kvm@vger.kernel.org \
--cc=miguel.luis@oracle.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.