^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) .. SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) Paravirt_ops
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) ============
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) Linux provides support for different hypervisor virtualization technologies.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) Historically different binary kernels would be required in order to support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) different hypervisors, this restriction was removed with pv_ops.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) Linux pv_ops is a virtualization API which enables support for different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) hypervisors. It allows each hypervisor to override critical operations and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) allows a single kernel binary to run on all supported execution environments
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) including native machine -- without any hypervisors.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) pv_ops provides a set of function pointers which represent operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) corresponding to low level critical instructions and high level
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) functionalities in various areas. pv-ops allows for optimizations at run
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) time by enabling binary patching of the low-ops critical operations
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) at boot time.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) pv_ops operations are classified into three categories:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) - simple indirect call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) These operations correspond to high level functionality where it is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) known that the overhead of indirect call isn't very important.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) - indirect call which allows optimization with binary patch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) Usually these operations correspond to low level critical instructions. They
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) are called frequently and are performance critical. The overhead is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) very important.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) - a set of macros for hand written assembly code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) Hand written assembly codes (.S files) also need paravirtualization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) because they include sensitive instructions or some of code paths in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) them are very performance critical.