[PATCH v9 0/5] ARM Nested Virt Support

Eric Auger posted 5 patches 5 months, 1 week ago
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20250707164129.1167837-1-eric.auger@redhat.com
Maintainers: Peter Maydell <peter.maydell@linaro.org>, Paolo Bonzini <pbonzini@redhat.com>
include/hw/intc/arm_gicv3_common.h |  1 +
target/arm/kvm_arm.h               |  7 +++++++
hw/arm/virt.c                      | 17 ++++++++++++++++-
hw/intc/arm_gicv3_common.c         |  1 +
hw/intc/arm_gicv3_kvm.c            | 29 +++++++++++++++++++++++++++++
target/arm/kvm-stub.c              |  5 +++++
target/arm/kvm.c                   | 21 +++++++++++++++++++++
7 files changed, 80 insertions(+), 1 deletion(-)
[PATCH v9 0/5] ARM Nested Virt Support
Posted by Eric Auger 5 months, 1 week ago
This is candidate for 10.1.

For gaining virt functionality in KVM accelerated L1, The host needs to
be booted with "kvm-arm.mode=nested" option and qemu needs to be invoked
with: -machine virt,virtualization=on.

This series can be found at:
https://github.com/eauger/qemu/tree/v10.0.0-nv-v9
previous:
https://github.com/eauger/qemu/tree/v10.0.0-nv-v8

Original version from Miguel:
[1] https://lore.kernel.org/all/20230227163718.62003-1-miguel.luis@oracle.com/
version from Haibo:
[2] https://lore.kernel.org/qemu-devel/cover.1617281290.git.haibo.xu@linaro.org/

History:
v8 -> v9:
- Move the migration blocker to the GIC code

v7 -> v8
- add migration blocker when virt is set along with kvm enabled
- test virt is not set with -cpu host,aarch64=off
- s/only is/is only

v6 -> v7:
- rebase on Peter's target-arm.next. as a result linux header update could be
  dropped. Faced a small conflict in hw/arm/virt: Allow virt extensions with KVM
  due to recently landed hw/arm/virt: Make EL2 accelerator check an accept-list.
  I dared to keep Richard's R-b though.

v5 -> v6:
- linux header update against v6.16-rc2

v4 -> v5:
- rebase on top of v10.0.0

v3 -> v4:
- fix: only set maint_irq if vms->virt

v2 -> v3:
- KVM EL2 only is set if virtualization option is set
- fixes regression with virtualization=off
- Add checks against unsupported GIC configs until the kernel does


Eric Auger (1):
  hw/arm/arm_gicv3_kvm: Add a migration blocker with kvm nested virt

Haibo Xu (4):
  hw/arm: Allow setting KVM vGIC maintenance IRQ
  target/arm/kvm: Add helper to detect EL2 when using KVM
  target/arm: Enable feature ARM_FEATURE_EL2 if EL2 is supported
  hw/arm/virt: Allow virt extensions with KVM

 include/hw/intc/arm_gicv3_common.h |  1 +
 target/arm/kvm_arm.h               |  7 +++++++
 hw/arm/virt.c                      | 17 ++++++++++++++++-
 hw/intc/arm_gicv3_common.c         |  1 +
 hw/intc/arm_gicv3_kvm.c            | 29 +++++++++++++++++++++++++++++
 target/arm/kvm-stub.c              |  5 +++++
 target/arm/kvm.c                   | 21 +++++++++++++++++++++
 7 files changed, 80 insertions(+), 1 deletion(-)

-- 
2.49.0
Re: [PATCH v9 0/5] ARM Nested Virt Support
Posted by Peter Maydell 5 months ago
On Mon, 7 Jul 2025 at 17:41, Eric Auger <eric.auger@redhat.com> wrote:
>
> This is candidate for 10.1.
>
> For gaining virt functionality in KVM accelerated L1, The host needs to
> be booted with "kvm-arm.mode=nested" option and qemu needs to be invoked
> with: -machine virt,virtualization=on.
>
> This series can be found at:
> https://github.com/eauger/qemu/tree/v10.0.0-nv-v9
> previous:
> https://github.com/eauger/qemu/tree/v10.0.0-nv-v8


Applied to target-arm.next, thanks. I'm going to squash in
this change

--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -2248,8 +2248,13 @@ static void machvirt_init(MachineState *machine)
         exit(1);
     }

-    if (vms->virt && !(kvm_enabled() && kvm_arm_el2_supported()) &&
-                     !tcg_enabled() && !qtest_enabled()) {
+    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",
                      current_accel_name());

so we can distinguish "QEMU doesn't support KVM EL2" from
"QEMU supports it but the kernel does not".

-- PMM
Re: [PATCH v9 0/5] ARM Nested Virt Support
Posted by Eric Auger 5 months ago
Hi Peter,

On 7/10/25 12:42 PM, Peter Maydell wrote:
> On Mon, 7 Jul 2025 at 17:41, Eric Auger <eric.auger@redhat.com> wrote:
>> This is candidate for 10.1.
>>
>> For gaining virt functionality in KVM accelerated L1, The host needs to
>> be booted with "kvm-arm.mode=nested" option and qemu needs to be invoked
>> with: -machine virt,virtualization=on.
>>
>> This series can be found at:
>> https://github.com/eauger/qemu/tree/v10.0.0-nv-v9
>> previous:
>> https://github.com/eauger/qemu/tree/v10.0.0-nv-v8
>
> Applied to target-arm.next, thanks. I'm going to squash in
> this change
>
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -2248,8 +2248,13 @@ static void machvirt_init(MachineState *machine)
>          exit(1);
>      }
>
> -    if (vms->virt && !(kvm_enabled() && kvm_arm_el2_supported()) &&
> -                     !tcg_enabled() && !qtest_enabled()) {
> +    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",
>                       current_accel_name());
>
> so we can distinguish "QEMU doesn't support KVM EL2" from
> "QEMU supports it but the kernel does not".

Sure.

Thanks!

Eric
>
> -- PMM
>