PING: [PATCH] qemu: support kvm-pv-ipi off
zhenwei pi
pizhenwei at bytedance.com
Mon Nov 1 01:18:08 UTC 2021
PING
On 10/27/21 3:04 PM, zhenwei pi wrote:
> QEMU version 3.1 introduced PV_SEND_IPI CPUID feature bit under
> commit 7f710c32bb8 (target-i386: adds PV_SEND_IPI CPUID feature bit).
>
> This patch adds a new KVM feature 'pv-ipi' to disable this feature
> (enabled by default). Newer CPU platform (Ex, AMD Zen2) supports
> hardware accelation for IPI in guest, to use this feature to get
> better performance in some scenarios. Detailed about the discussion:
> https://lkml.org/lkml/2021/10/20/423
>
> To disable kvm-pv-ipi and have libvirt add "-cpu host,kvm-pv-ipi=off"
> to the QEMU command line, the following XML code needs to be added to the
> guest's domain description:
>
> <features>
> <kvm>
> <pv-ipi state='off'/>
> </kvm>
> </features>
>
> Signed-off-by: zhenwei pi <pizhenwei at bytedance.com>
> ---
> docs/formatdomain.rst | 2 ++
> docs/schemas/domaincommon.rng | 5 +++++
> src/conf/domain_conf.c | 3 +++
> src/conf/domain_conf.h | 1 +
> src/qemu/qemu_command.c | 5 +++++
> 5 files changed, 16 insertions(+)
>
> diff --git a/docs/formatdomain.rst b/docs/formatdomain.rst
> index 58768f7e5e..8ff833bbd2 100644
> --- a/docs/formatdomain.rst
> +++ b/docs/formatdomain.rst
> @@ -1842,6 +1842,7 @@ Hypervisors may allow certain CPU / machine features to be toggled on/off.
> <hidden state='on'/>
> <hint-dedicated state='on'/>
> <poll-control state='on'/>
> + <pv-ipi state='off'/>
> </kvm>
> <xen>
> <e820_host state='on'/>
> @@ -1930,6 +1931,7 @@ are:
> hidden Hide the KVM hypervisor from standard MSR based discovery on, off :since:`1.2.8 (QEMU 2.1.0)`
> hint-dedicated Allows a guest to enable optimizations when running on dedicated vCPUs on, off :since:`5.7.0 (QEMU 2.12.0)`
> poll-control Decrease IO completion latency by introducing a grace period of busy waiting on, off :since:`6.10.0 (QEMU 4.2)`
> + pv-ipi Paravirtualized send IPIs on, off :since:`7.10.0 (QEMU 3.1)`
> ============== ============================================================================ ======= ============================
>
> ``xen``
> diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
> index f71e375a33..67df13d90d 100644
> --- a/docs/schemas/domaincommon.rng
> +++ b/docs/schemas/domaincommon.rng
> @@ -7177,6 +7177,11 @@
> <ref name="featurestate"/>
> </element>
> </optional>
> + <optional>
> + <element name="pv-ipi">
> + <ref name="featurestate"/>
> + </element>
> + </optional>
> </interleave>
> </element>
> </define>
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 48c6ee9865..c8868de577 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -204,6 +204,7 @@ VIR_ENUM_IMPL(virDomainKVM,
> "hidden",
> "hint-dedicated",
> "poll-control",
> + "pv-ipi",
> );
>
> VIR_ENUM_IMPL(virDomainXen,
> @@ -21789,6 +21790,7 @@ virDomainDefFeaturesCheckABIStability(virDomainDef *src,
> case VIR_DOMAIN_KVM_HIDDEN:
> case VIR_DOMAIN_KVM_DEDICATED:
> case VIR_DOMAIN_KVM_POLLCONTROL:
> + case VIR_DOMAIN_KVM_PVIPI:
> if (src->kvm_features[i] != dst->kvm_features[i]) {
> virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> _("State of KVM feature '%s' differs: "
> @@ -27821,6 +27823,7 @@ virDomainDefFormatFeatures(virBuffer *buf,
> case VIR_DOMAIN_KVM_HIDDEN:
> case VIR_DOMAIN_KVM_DEDICATED:
> case VIR_DOMAIN_KVM_POLLCONTROL:
> + case VIR_DOMAIN_KVM_PVIPI:
> if (def->kvm_features[j])
> virBufferAsprintf(&childBuf, "<%s state='%s'/>\n",
> virDomainKVMTypeToString(j),
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index f4be5c84f0..cb6d8975b8 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -2073,6 +2073,7 @@ typedef enum {
> VIR_DOMAIN_KVM_HIDDEN = 0,
> VIR_DOMAIN_KVM_DEDICATED,
> VIR_DOMAIN_KVM_POLLCONTROL,
> + VIR_DOMAIN_KVM_PVIPI,
>
> VIR_DOMAIN_KVM_LAST
> } virDomainKVM;
> diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
> index 7374b2beca..f7c19246d8 100644
> --- a/src/qemu/qemu_command.c
> +++ b/src/qemu/qemu_command.c
> @@ -6848,6 +6848,11 @@ qemuBuildCpuCommandLine(virCommand *cmd,
> virBufferAddLit(&buf, ",kvm-poll-control=on");
> break;
>
> + case VIR_DOMAIN_KVM_PVIPI:
> + if (def->kvm_features[i] == VIR_TRISTATE_SWITCH_OFF)
> + virBufferAddLit(&buf, ",kvm-pv-ipi=off");
> + break;
> +
> case VIR_DOMAIN_KVM_LAST:
> break;
> }
>
--
zhenwei pi
More information about the libvir-list
mailing list