Paravirtualized sched support for arm64¶
KVM/arm64 provides some hypervisor service calls to support a paravirtualized sched.
Some SMCCC compatible hypercalls are defined:
PV_SCHED_FEATURES: 0xC5000090
PV_SCHED_IPA_INIT: 0xC5000091
PV_SCHED_IPA_RELEASE: 0xC5000092
PV_SCHED_KICK_CPU: 0xC5000093
The existence of the PV_SCHED hypercall should be probed using the SMCCC 1.1 ARCH_FEATURES mechanism before calling it.
- PV_SCHED_FEATURES
Function ID:
(uint32)
0xC5000090
PV_call_id:
(uint32)
The function to query for support.
Return value:
(int64)
NOT_SUPPORTED (-1) or SUCCESS (0) if the relevant PV-sched feature is supported by the hypervisor.
- PV_SCHED_IPA_INIT
Function ID:
(uint32)
0xC5000091
Return value:
(int64)
NOT_SUPPORTED (-1) or SUCCESS (0) if the IPA of this vCPU’s PV data structure is shared to the hypervisor.
- PV_SCHED_IPA_RELEASE
Function ID:
(uint32)
0xC5000092
Return value:
(int64)
NOT_SUPPORTED (-1) or SUCCESS (0) if the IPA of this vCPU’s PV data structure is released.
- PV_SCHED_KICK_CPU
Function ID:
(uint32)
0xC5000093
Return value:
(int64)
NOT_SUPPORTED (-1) or SUCCESS (0) if the vCPU is kicked by the hypervisor.
PV sched state¶
The structure pointed to by the PV_SCHED_IPA hypercall is as follows:
Field |
Byte Length |
Byte Offset |
Description |
---|---|---|---|
preempted |
4 |
0 |
Indicates that the vCPU that owns this struct is running or not. Non-zero values mean the vCPU has been preempted. Zero means the vCPU is not preempted. |
The preempted field will be updated to 0 by the hypervisor prior to scheduling a vCPU. When the vCPU is scheduled out, the preempted field will be updated to 1 by the hypervisor.
A vCPU of a paravirtualized guest that is busywaiting in guest kernel mode for an event to occur (ex: a spinlock to become available) can execute WFI instruction once it has busy-waited for more than a threshold time-interval. Execution of WFI instruction would cause the hypervisor to put the vCPU to sleep until occurrence of an appropriate event. Another vCPU of the same guest can wakeup the sleeping vCPU by issuing PV_SCHED_KICK_CPU hypercall, specifying CPU id (reg1) of the vCPU to be woken up.