Loading Documentation/admin-guide/kernel-parameters.txt +3 −3 Original line number Diff line number Diff line Loading @@ -3083,9 +3083,9 @@ [X86,PV_OPS] Disable paravirtualized VMware scheduler clock and use the default one. no-steal-acc [X86,KVM] Disable paravirtualized steal time accounting. steal time is computed, but won't influence scheduler behaviour no-steal-acc [X86,KVM,ARM64] Disable paravirtualized steal time accounting. steal time is computed, but won't influence scheduler behaviour nolapic [X86-32,APIC] Do not enable or use the local APIC. Loading Documentation/virt/kvm/arm/pvtime.rst 0 → 100644 +80 −0 Original line number Diff line number Diff line .. SPDX-License-Identifier: GPL-2.0 Paravirtualized time support for arm64 ====================================== Arm specification DEN0057/A defines a standard for paravirtualised time support for AArch64 guests: https://developer.arm.com/docs/den0057/a KVM/arm64 implements the stolen time part of this specification by providing some hypervisor service calls to support a paravirtualized guest obtaining a view of the amount of time stolen from its execution. Two new SMCCC compatible hypercalls are defined: * PV_TIME_FEATURES: 0xC5000020 * PV_TIME_ST: 0xC5000021 These are only available in the SMC64/HVC64 calling convention as paravirtualized time is not available to 32 bit Arm guests. The existence of the PV_FEATURES hypercall should be probed using the SMCCC 1.1 ARCH_FEATURES mechanism before calling it. PV_TIME_FEATURES ============= ======== ========== Function ID: (uint32) 0xC5000020 PV_call_id: (uint32) The function to query for support. Currently only PV_TIME_ST is supported. Return value: (int64) NOT_SUPPORTED (-1) or SUCCESS (0) if the relevant PV-time feature is supported by the hypervisor. ============= ======== ========== PV_TIME_ST ============= ======== ========== Function ID: (uint32) 0xC5000021 Return value: (int64) IPA of the stolen time data structure for this VCPU. On failure: NOT_SUPPORTED (-1) ============= ======== ========== The IPA returned by PV_TIME_ST should be mapped by the guest as normal memory with inner and outer write back caching attributes, in the inner shareable domain. A total of 16 bytes from the IPA returned are guaranteed to be meaningfully filled by the hypervisor (see structure below). PV_TIME_ST returns the structure for the calling VCPU. Stolen Time ----------- The structure pointed to by the PV_TIME_ST hypercall is as follows: +-------------+-------------+-------------+----------------------------+ | Field | Byte Length | Byte Offset | Description | +=============+=============+=============+============================+ | Revision | 4 | 0 | Must be 0 for version 1.0 | +-------------+-------------+-------------+----------------------------+ | Attributes | 4 | 4 | Must be 0 | +-------------+-------------+-------------+----------------------------+ | Stolen time | 8 | 8 | Stolen time in unsigned | | | | | nanoseconds indicating how | | | | | much time this VCPU thread | | | | | was involuntarily not | | | | | running on a physical CPU. | +-------------+-------------+-------------+----------------------------+ All values in the structure are stored little-endian. The structure will be updated by the hypervisor prior to scheduling a VCPU. It will be present within a reserved region of the normal memory given to the guest. The guest should not attempt to write into this memory. There is a structure per VCPU of the guest. It is advisable that one or more 64k pages are set aside for the purpose of these structures and not used for other purposes, this enables the guest to map the region using 64k pages and avoids conflicting attributes with other memory. For the user space interface see Documentation/virt/kvm/devices/vcpu.txt section "3. GROUP: KVM_ARM_VCPU_PVTIME_CTRL". Documentation/virt/kvm/devices/vcpu.txt +14 −0 Original line number Diff line number Diff line Loading @@ -60,3 +60,17 @@ time to use the number provided for a given timer, overwriting any previously configured values on other VCPUs. Userspace should configure the interrupt numbers on at least one VCPU after creating all VCPUs and before running any VCPUs. 3. GROUP: KVM_ARM_VCPU_PVTIME_CTRL Architectures: ARM64 3.1 ATTRIBUTE: KVM_ARM_VCPU_PVTIME_IPA Parameters: 64-bit base address Returns: -ENXIO: Stolen time not implemented -EEXIST: Base address already set for this VCPU -EINVAL: Base address not 64 byte aligned Specifies the base address of the stolen time structure for this VCPU. The base address must be 64 byte aligned and exist within a valid guest memory region. See Documentation/virt/kvm/arm/pvtime.txt for more information including the layout of the stolen time structure. arch/arm/include/asm/kvm_host.h +25 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #ifndef __ARM_KVM_HOST_H__ #define __ARM_KVM_HOST_H__ #include <linux/arm-smccc.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/kvm_types.h> Loading Loading @@ -38,6 +39,7 @@ KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) #define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1) #define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2) #define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3) DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use); Loading Loading @@ -331,6 +333,29 @@ static inline int kvm_arch_vm_ioctl_check_extension(struct kvm *kvm, long ext) int kvm_perf_init(void); int kvm_perf_teardown(void); static inline long kvm_hypercall_pv_features(struct kvm_vcpu *vcpu) { return SMCCC_RET_NOT_SUPPORTED; } static inline gpa_t kvm_init_stolen_time(struct kvm_vcpu *vcpu) { return GPA_INVALID; } static inline void kvm_update_stolen_time(struct kvm_vcpu *vcpu) { } static inline void kvm_arm_pvtime_vcpu_init(struct kvm_vcpu_arch *vcpu_arch) { } static inline bool kvm_arm_is_pvtime_enabled(struct kvm_vcpu_arch *vcpu_arch) { return false; } void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot); struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr); Loading arch/arm/kvm/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ obj-y += kvm-arm.o init.o interrupts.o obj-y += handle_exit.o guest.o emulate.o reset.o obj-y += coproc.o coproc_a15.o coproc_a7.o vgic-v3-coproc.o obj-y += $(KVM)/arm/arm.o $(KVM)/arm/mmu.o $(KVM)/arm/mmio.o obj-y += $(KVM)/arm/psci.o $(KVM)/arm/perf.o obj-y += $(KVM)/arm/psci.o $(KVM)/arm/perf.o $(KVM)/arm/hypercalls.o obj-y += $(KVM)/arm/aarch32.o obj-y += $(KVM)/arm/vgic/vgic.o Loading Loading
Documentation/admin-guide/kernel-parameters.txt +3 −3 Original line number Diff line number Diff line Loading @@ -3083,9 +3083,9 @@ [X86,PV_OPS] Disable paravirtualized VMware scheduler clock and use the default one. no-steal-acc [X86,KVM] Disable paravirtualized steal time accounting. steal time is computed, but won't influence scheduler behaviour no-steal-acc [X86,KVM,ARM64] Disable paravirtualized steal time accounting. steal time is computed, but won't influence scheduler behaviour nolapic [X86-32,APIC] Do not enable or use the local APIC. Loading
Documentation/virt/kvm/arm/pvtime.rst 0 → 100644 +80 −0 Original line number Diff line number Diff line .. SPDX-License-Identifier: GPL-2.0 Paravirtualized time support for arm64 ====================================== Arm specification DEN0057/A defines a standard for paravirtualised time support for AArch64 guests: https://developer.arm.com/docs/den0057/a KVM/arm64 implements the stolen time part of this specification by providing some hypervisor service calls to support a paravirtualized guest obtaining a view of the amount of time stolen from its execution. Two new SMCCC compatible hypercalls are defined: * PV_TIME_FEATURES: 0xC5000020 * PV_TIME_ST: 0xC5000021 These are only available in the SMC64/HVC64 calling convention as paravirtualized time is not available to 32 bit Arm guests. The existence of the PV_FEATURES hypercall should be probed using the SMCCC 1.1 ARCH_FEATURES mechanism before calling it. PV_TIME_FEATURES ============= ======== ========== Function ID: (uint32) 0xC5000020 PV_call_id: (uint32) The function to query for support. Currently only PV_TIME_ST is supported. Return value: (int64) NOT_SUPPORTED (-1) or SUCCESS (0) if the relevant PV-time feature is supported by the hypervisor. ============= ======== ========== PV_TIME_ST ============= ======== ========== Function ID: (uint32) 0xC5000021 Return value: (int64) IPA of the stolen time data structure for this VCPU. On failure: NOT_SUPPORTED (-1) ============= ======== ========== The IPA returned by PV_TIME_ST should be mapped by the guest as normal memory with inner and outer write back caching attributes, in the inner shareable domain. A total of 16 bytes from the IPA returned are guaranteed to be meaningfully filled by the hypervisor (see structure below). PV_TIME_ST returns the structure for the calling VCPU. Stolen Time ----------- The structure pointed to by the PV_TIME_ST hypercall is as follows: +-------------+-------------+-------------+----------------------------+ | Field | Byte Length | Byte Offset | Description | +=============+=============+=============+============================+ | Revision | 4 | 0 | Must be 0 for version 1.0 | +-------------+-------------+-------------+----------------------------+ | Attributes | 4 | 4 | Must be 0 | +-------------+-------------+-------------+----------------------------+ | Stolen time | 8 | 8 | Stolen time in unsigned | | | | | nanoseconds indicating how | | | | | much time this VCPU thread | | | | | was involuntarily not | | | | | running on a physical CPU. | +-------------+-------------+-------------+----------------------------+ All values in the structure are stored little-endian. The structure will be updated by the hypervisor prior to scheduling a VCPU. It will be present within a reserved region of the normal memory given to the guest. The guest should not attempt to write into this memory. There is a structure per VCPU of the guest. It is advisable that one or more 64k pages are set aside for the purpose of these structures and not used for other purposes, this enables the guest to map the region using 64k pages and avoids conflicting attributes with other memory. For the user space interface see Documentation/virt/kvm/devices/vcpu.txt section "3. GROUP: KVM_ARM_VCPU_PVTIME_CTRL".
Documentation/virt/kvm/devices/vcpu.txt +14 −0 Original line number Diff line number Diff line Loading @@ -60,3 +60,17 @@ time to use the number provided for a given timer, overwriting any previously configured values on other VCPUs. Userspace should configure the interrupt numbers on at least one VCPU after creating all VCPUs and before running any VCPUs. 3. GROUP: KVM_ARM_VCPU_PVTIME_CTRL Architectures: ARM64 3.1 ATTRIBUTE: KVM_ARM_VCPU_PVTIME_IPA Parameters: 64-bit base address Returns: -ENXIO: Stolen time not implemented -EEXIST: Base address already set for this VCPU -EINVAL: Base address not 64 byte aligned Specifies the base address of the stolen time structure for this VCPU. The base address must be 64 byte aligned and exist within a valid guest memory region. See Documentation/virt/kvm/arm/pvtime.txt for more information including the layout of the stolen time structure.
arch/arm/include/asm/kvm_host.h +25 −0 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ #ifndef __ARM_KVM_HOST_H__ #define __ARM_KVM_HOST_H__ #include <linux/arm-smccc.h> #include <linux/errno.h> #include <linux/types.h> #include <linux/kvm_types.h> Loading Loading @@ -38,6 +39,7 @@ KVM_ARCH_REQ_FLAGS(0, KVM_REQUEST_WAIT | KVM_REQUEST_NO_WAKEUP) #define KVM_REQ_IRQ_PENDING KVM_ARCH_REQ(1) #define KVM_REQ_VCPU_RESET KVM_ARCH_REQ(2) #define KVM_REQ_RECORD_STEAL KVM_ARCH_REQ(3) DECLARE_STATIC_KEY_FALSE(userspace_irqchip_in_use); Loading Loading @@ -331,6 +333,29 @@ static inline int kvm_arch_vm_ioctl_check_extension(struct kvm *kvm, long ext) int kvm_perf_init(void); int kvm_perf_teardown(void); static inline long kvm_hypercall_pv_features(struct kvm_vcpu *vcpu) { return SMCCC_RET_NOT_SUPPORTED; } static inline gpa_t kvm_init_stolen_time(struct kvm_vcpu *vcpu) { return GPA_INVALID; } static inline void kvm_update_stolen_time(struct kvm_vcpu *vcpu) { } static inline void kvm_arm_pvtime_vcpu_init(struct kvm_vcpu_arch *vcpu_arch) { } static inline bool kvm_arm_is_pvtime_enabled(struct kvm_vcpu_arch *vcpu_arch) { return false; } void kvm_mmu_wp_memory_region(struct kvm *kvm, int slot); struct kvm_vcpu *kvm_mpidr_to_vcpu(struct kvm *kvm, unsigned long mpidr); Loading
arch/arm/kvm/Makefile +1 −1 Original line number Diff line number Diff line Loading @@ -24,7 +24,7 @@ obj-y += kvm-arm.o init.o interrupts.o obj-y += handle_exit.o guest.o emulate.o reset.o obj-y += coproc.o coproc_a15.o coproc_a7.o vgic-v3-coproc.o obj-y += $(KVM)/arm/arm.o $(KVM)/arm/mmu.o $(KVM)/arm/mmio.o obj-y += $(KVM)/arm/psci.o $(KVM)/arm/perf.o obj-y += $(KVM)/arm/psci.o $(KVM)/arm/perf.o $(KVM)/arm/hypercalls.o obj-y += $(KVM)/arm/aarch32.o obj-y += $(KVM)/arm/vgic/vgic.o Loading