The sev-snp-guest object is currently used to provide confidential guest by using guest_memfd for private GPA ranges, and for shared GPA ranges the normal memory backend is used, i.e. "out-of-place" conversion between shared/private. Now that "in-place" conversion support is available in QEMU, add a parameter to select between these 2 modes of utilizing guest_memfd (it cannot be enabled transparently due to noticeable differences in behavior (e.g. memory usage accounting and lack of hugetlb support for shared GPA ranges) that userspace needs to be aware of when selecting the mode). Note that the actual capability checks for in-place conversion support in the host kernel will happen later in kvm_arch_init(). Signed-off-by: Michael Roth --- qapi/qom.json | 8 +++++++- target/i386/sev.c | 17 +++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/qapi/qom.json b/qapi/qom.json index 49f222796a..84166c2457 100644 --- a/qapi/qom.json +++ b/qapi/qom.json @@ -1099,6 +1099,11 @@ # @tsc-frequency: set secure TSC frequency. Only valid if Secure TSC # is enabled (default: zero) (since 11.1) # +# @convert-in-place: If true, the same physical pages are reused +# when memory is converted between shared and private states. +# If false (default), separate allocations are used depending +# on whether the page is private or shared. (since 11.2) +# # Since: 9.1 ## { 'struct': 'SevSnpGuestProperties', @@ -1112,7 +1117,8 @@ '*host-data': 'str', '*vcek-disabled': 'bool', '*secure-tsc': 'bool', - '*tsc-frequency': 'uint32' } } + '*tsc-frequency': 'uint32', + '*convert-in-place': 'bool'} } ## # @TdxGuestProperties: diff --git a/target/i386/sev.c b/target/i386/sev.c index e15e23c78d..e77ca12fc7 100644 --- a/target/i386/sev.c +++ b/target/i386/sev.c @@ -3270,6 +3270,20 @@ sev_snp_guest_set_tsc_frequency(Object *obj, Visitor *v, const char *name, SEV_SNP_GUEST(obj)->tsc_khz = value / 1000; } +static bool +sev_snp_guest_get_convert_in_place(Object *obj, Error **errp) +{ + return CONFIDENTIAL_GUEST_SUPPORT(obj)->convert_in_place; +} + +static void +sev_snp_guest_set_convert_in_place(Object *obj, bool value, Error **errp) +{ + ConfidentialGuestSupport *cgs = CONFIDENTIAL_GUEST_SUPPORT(obj); + + cgs->convert_in_place = value; +} + static void sev_snp_guest_class_init(ObjectClass *oc, const void *data) { @@ -3311,6 +3325,9 @@ sev_snp_guest_class_init(ObjectClass *oc, const void *data) object_class_property_add(oc, "tsc-frequency", "uint32", sev_snp_guest_get_tsc_frequency, sev_snp_guest_set_tsc_frequency, NULL, NULL); + object_class_property_add_bool(oc, "convert-in-place", + sev_snp_guest_get_convert_in_place, + sev_snp_guest_set_convert_in_place); } static void -- 2.43.0