75 lines
3.2 KiB
ReStructuredText
75 lines
3.2 KiB
ReStructuredText
.. SPDX-License-Identifier: GPL-2.0
|
|
|
|
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.
|