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.