
If IPIV is required to be enabled on the virtual machine, must add `-accel kvm,ipiv=on`. Adding the IPIV switch in QEMU ensures that the guest's IPIV can be flexibly disabled in certain scenarios, such as cross-generation live migration. Signed-off-by: Jinqian Yang <yangjinqian1@huawei.com> --- include/sysemu/kvm_int.h | 1 + target/arm/kvm.c | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/sysemu/kvm_int.h b/include/sysemu/kvm_int.h index 9a7bc1a4b8..7b90117a86 100644 --- a/include/sysemu/kvm_int.h +++ b/include/sysemu/kvm_int.h @@ -122,6 +122,7 @@ struct KVMState uint32_t xen_caps; uint16_t xen_gnttab_max_frames; uint16_t xen_evtchn_max_pirq; + bool ipiv; }; void kvm_memory_listener_register(KVMState *s, KVMMemoryListener *kml, diff --git a/target/arm/kvm.c b/target/arm/kvm.c index f45783a9da..599c2c2462 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -263,6 +263,10 @@ static void kvm_update_ipiv_cap(KVMState *s) { int ret; + if (!s->ipiv) { + return; + } + if (!kvm_check_extension(s, KVM_CAP_ARM_HISI_IPIV)) { return; } @@ -1364,6 +1368,20 @@ static void kvm_arch_set_eager_split_size(Object *obj, Visitor *v, s->kvm_eager_split_size = value; } +static bool virt_get_ipiv(Object *obj, Error **errp) +{ + KVMState *s = KVM_STATE(obj); + + return s->ipiv; +} + +static void virt_set_ipiv(Object *obj, bool value, Error **errp) +{ + KVMState *s = KVM_STATE(obj); + + s->ipiv = value; +} + void kvm_arch_accel_class_init(ObjectClass *oc) { object_class_property_add(oc, "eager-split-size", "size", @@ -1372,4 +1390,10 @@ void kvm_arch_accel_class_init(ObjectClass *oc) object_class_property_set_description(oc, "eager-split-size", "Eager Page Split chunk size for hugepages. (default: 0, disabled)"); + + object_class_property_add_bool(oc, "ipiv", + virt_get_ipiv, + virt_set_ipiv); + object_class_property_set_description(oc, "ipiv", + "Set on/off to enable/disable IPIV"); } -- 2.33.0