[PATCH v5 00/11] KVM: PPC: Nested APIv2 guest support

Michal Suchánek msuchanek at suse.de
Thu Sep 26 03:27:55 AEST 2024


On Thu, Sep 14, 2023 at 01:05:49PM +1000, Jordan Niethe wrote:
> 
> A nested-HV API for PAPR has been developed based on the KVM-specific
> nested-HV API that is upstream in Linux/KVM and QEMU. The PAPR API had
> to break compatibility to accommodate implementation in other
> hypervisors and partitioning firmware. The existing KVM-specific API
> will be known as the Nested APIv1 and the PAPR API will be known as the
> Nested APIv2. 
> 
> The control flow and interrupt processing between L0, L1, and L2 in
> the Nested APIv2 are conceptually unchanged. Where Nested APIv1 is almost
> stateless, the Nested APIv2 is stateful, with the L1 registering L2 virtual
> machines and vCPUs with the L0. Supervisor-privileged register switching
> duty is now the responsibility for the L0, which holds canonical L2
> register state and handles all switching. This new register handling
> motivates the "getters and setters" wrappers to assist in syncing the
> L2s state in the L1 and the L0.

Hello,

are there any machines on which this is supposed to work?

On a 9105-22A with ML1050_fw1050.20 (78) and
Linux 6.11.0-lp155.4.gce149d2-default I get:

[   29.228161] kvm-hv: nestedv2 get capabilities hcall failed, falling back to nestedv1 (rc=-2)
[   29.228168] kvm-hv: Parent hypervisor does not support nesting (rc=-2)

Can the hardware requirements be clarified?

Thanks

Michal


> 
> Broadly, the new hcalls will be used for  creating and managing guests
> by a regular partition in the following way:
> 
>   - L1 and L0 negotiate capabilities with
>     H_GUEST_{G,S}ET_CAPABILITIES
> 
>   - L1 requests the L0 create a L2 with
>     H_GUEST_CREATE and receives a handle to use in future hcalls
> 
>   - L1 requests the L0 create a L2 vCPU with
>     H_GUEST_CREATE_VCPU
> 
>   - L1 sets up the L2 using H_GUEST_SET and the
>     H_GUEST_VCPU_RUN input buffer
> 
>   - L1 requests the L0 runs the L2 vCPU using H_GUEST_VCPU_RUN
> 
>   - L2 returns to L1 with an exit reason and L1 reads the
>     H_GUEST_VCPU_RUN output buffer populated by the L0
> 
>   - L1 handles the exit using H_GET_STATE if necessary
> 
>   - L1 reruns L2 vCPU with H_GUEST_VCPU_RUN
> 
>   - L1 frees the L2 in the L0 with H_GUEST_DELETE
> 
> Further details are available in Documentation/powerpc/kvm-nested.rst.
> 
> This series adds KVM support for using this hcall interface as a regular
> PAPR partition, i.e. the L1. It does not add support for running as the
> L0.
> 
> The new hcalls have been implemented in the spapr qemu model for
> testing.
> 
> This is available at https://github.com/planetharsh/qemu/tree/upstream-0714-kop
> 
> There are scripts available to assist in setting up an environment for
> testing nested guests at https://github.com/iamjpn/kvm-powervm-test
> 
> A tree with this series is available at
> https://github.com/iamjpn/linux/tree/features/kvm-nestedv2-v5
> 
> Thanks to Amit Machhiwal, Kautuk Consul, Vaibhav Jain, Michael Neuling,
> Shivaprasad Bhat, Harsh Prateek Bora, Paul Mackerras and Nicholas
> Piggin.
> 
> Change overview in v5:
>   - KVM: PPC: Add helper library for Guest State Buffers:
>     - Fix mismatched function comments
>   - KVM: PPC: Add support for nestedv2 guests:
>     - Check H_BUSY for {g,s}etting capabilities
>     - Message if plpar_guest_get_capabilities() fails and nestedv1
>       support will be attempted.
>     - Remove unused amor variable
>   - KVM: PPC: Book3S HV: Use accessors for VCPU registers:
>     - Remove unneeded trailing comment for line length
> 
> 
> Change overview in v4:
>   - Split previous "KVM: PPC: Use getters and setters for vcpu register
>     state" into a number of seperate patches
>     - Remove _hv suffix from VCORE wrappers
>     - Do not create arch_compat and lpcr setters, use the existing ones
>     - Use #ifdef ALTIVEC
>   - KVM: PPC: Rename accessor generator macros
>     - Fix typo
>   - KVM: PPC: Book3s HV: Hold LPIDs in an unsigned long
>     - Use u64
>     - Change format strings instead of casting
>   - KVM: PPC: Add support for nestedv2 guests
>     - Batch H_GUEST_GET calls in kvmhv_nestedv2_reload_ptregs()
>     - Fix compile without CONFIG_PSERIES
>     - Fix maybe uninitialized 'trap' in kvmhv_p9_guest_entry()
>     - Extend existing setters for arch_compat and lpcr
> 
> 
> Change overview in v3:
>   - KVM: PPC: Use getters and setters for vcpu register state
>       - Do not add a helper for pvr
>       - Use an expression when declaring variable in case
>       - Squash in all getters and setters
>       - Pass vector registers by reference
>   - KVM: PPC: Rename accessor generator macros
>       - New to series
>   - KVM: PPC: Add helper library for Guest State Buffers
>       - Use EXPORT_SYMBOL_GPL()
>       - Use the kvmppc namespace
>       - Move kvmppc_gsb_reset() out of kvmppc_gsm_fill_info()
>       - Comments for GSID elements
>       - Pass vector elements by reference
>       - Remove generic put and get functions
>   - KVM: PPC: Book3s HV: Hold LPIDs in an unsigned long
>       - New to series
>   - KVM: PPC: Add support for nestedv2 guests
>       - Use EXPORT_SYMBOL_GPL()
>       - Change to kvmhv_nestedv2 namespace
>       - Make kvmhv_enable_nested() return -ENODEV on NESTEDv2 L1 hosts
>       - s/kvmhv_on_papr/kvmhv_is_nestedv2/
>       - mv book3s_hv_papr.c book3s_hv_nestedv2.c
>       - Handle shared regs without a guest state id in the same wrapper
>       - Use a static key for API version
>       - Add a positive test for NESTEDv1
>       - Give the amor a static value
>       - s/struct kvmhv_nestedv2_host/struct kvmhv_nestedv2_io/
>       - Propagate failure in kvmhv_vcpu_entry_nestedv2()
>       - WARN if getters and setters fail
>       - Progagate failure from kvmhv_nestedv2_parse_output()
>       - Replace delay with sleep in plpar_guest_{create,delete,create_vcpu}()
>       - Add logical PVR handling
>       - Replace kvmppc_gse_{get,put} with specific version
>   - docs: powerpc: Document nested KVM on POWER
>       - Fix typos
> 
> 
> Change overview in v2:
>   - Rebase on top of kvm ppc prefix instruction support
>   - Make documentation an individual patch
>   - Move guest state buffer files from arch/powerpc/lib/ to
>     arch/powerpc/kvm/
>   - Use kunit for testing guest state buffer
>   - Fix some build errors
>   - Change HEIR element from 4 bytes to 8 bytes
> 
> Previous revisions:
> 
>   - v1: https://lore.kernel.org/linuxppc-dev/20230508072332.2937883-1-jpn@linux.vnet.ibm.com/
>   - v2: https://lore.kernel.org/linuxppc-dev/20230605064848.12319-1-jpn@linux.vnet.ibm.com/
>   - v3: https://lore.kernel.org/linuxppc-dev/20230807014553.1168699-1-jniethe5@gmail.com/
>   - v4: https://lore.kernel.org/linuxppc-dev/20230905034658.82835-1-jniethe5@gmail.com/
> 
> Jordan Niethe (10):
>   KVM: PPC: Always use the GPR accessors
>   KVM: PPC: Introduce FPR/VR accessor functions
>   KVM: PPC: Rename accessor generator macros
>   KVM: PPC: Use accessors for VCPU registers
>   KVM: PPC: Use accessors for VCORE registers
>   KVM: PPC: Book3S HV: Use accessors for VCPU registers
>   KVM: PPC: Book3S HV: Introduce low level MSR accessor
>   KVM: PPC: Add helper library for Guest State Buffers
>   KVM: PPC: Book3s HV: Hold LPIDs in an unsigned long
>   KVM: PPC: Add support for nestedv2 guests
> 
> Michael Neuling (1):
>   docs: powerpc: Document nested KVM on POWER
> 
>  Documentation/powerpc/index.rst               |   1 +
>  Documentation/powerpc/kvm-nested.rst          | 636 +++++++++++
>  arch/powerpc/Kconfig.debug                    |  12 +
>  arch/powerpc/include/asm/guest-state-buffer.h | 995 ++++++++++++++++++
>  arch/powerpc/include/asm/hvcall.h             |  30 +
>  arch/powerpc/include/asm/kvm_book3s.h         | 220 +++-
>  arch/powerpc/include/asm/kvm_book3s_64.h      |   8 +-
>  arch/powerpc/include/asm/kvm_booke.h          |  10 +
>  arch/powerpc/include/asm/kvm_host.h           |  22 +-
>  arch/powerpc/include/asm/kvm_ppc.h            | 102 +-
>  arch/powerpc/include/asm/plpar_wrappers.h     | 267 ++++-
>  arch/powerpc/kvm/Makefile                     |   4 +
>  arch/powerpc/kvm/book3s.c                     |  38 +-
>  arch/powerpc/kvm/book3s_64_mmu_hv.c           |   7 +-
>  arch/powerpc/kvm/book3s_64_mmu_radix.c        |  31 +-
>  arch/powerpc/kvm/book3s_64_vio.c              |   4 +-
>  arch/powerpc/kvm/book3s_hv.c                  | 358 +++++--
>  arch/powerpc/kvm/book3s_hv.h                  |  76 ++
>  arch/powerpc/kvm/book3s_hv_builtin.c          |  11 +-
>  arch/powerpc/kvm/book3s_hv_nested.c           |  44 +-
>  arch/powerpc/kvm/book3s_hv_nestedv2.c         | 994 +++++++++++++++++
>  arch/powerpc/kvm/book3s_hv_p9_entry.c         |   4 +-
>  arch/powerpc/kvm/book3s_hv_ras.c              |   4 +-
>  arch/powerpc/kvm/book3s_hv_rm_mmu.c           |   8 +-
>  arch/powerpc/kvm/book3s_hv_rm_xics.c          |   4 +-
>  arch/powerpc/kvm/book3s_hv_uvmem.c            |   2 +-
>  arch/powerpc/kvm/book3s_xive.c                |  12 +-
>  arch/powerpc/kvm/emulate_loadstore.c          |   6 +-
>  arch/powerpc/kvm/guest-state-buffer.c         | 621 +++++++++++
>  arch/powerpc/kvm/powerpc.c                    |  76 +-
>  arch/powerpc/kvm/test-guest-state-buffer.c    | 328 ++++++
>  31 files changed, 4672 insertions(+), 263 deletions(-)
>  create mode 100644 Documentation/powerpc/kvm-nested.rst
>  create mode 100644 arch/powerpc/include/asm/guest-state-buffer.h
>  create mode 100644 arch/powerpc/kvm/book3s_hv_nestedv2.c
>  create mode 100644 arch/powerpc/kvm/guest-state-buffer.c
>  create mode 100644 arch/powerpc/kvm/test-guest-state-buffer.c
> 
> -- 
> 2.39.3
> 


More information about the Linuxppc-dev mailing list