From f50ff9f7987ce7e0156b3ea183f6fc3678f8d07c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabiano=20Fid=C3=AAncio?= Date: Thu, 24 Feb 2022 21:39:54 +0100 Subject: [PATCH] hypervisors: Confidential Guests do not support Memory hotplug MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Similarly to VCPUs and Device hotplug, Confidential Guests also do not support Memory hotplug. Let's make it clear in the documentation and guard the code on both QEMU and Cloud Hypervisor side to ensure we don't advertise Memory hotplug as being supported when running Confidential Guests. Signed-off-by: Fabiano FidĂȘncio --- src/runtime/config/configuration-clh.toml.in | 1 + src/runtime/config/configuration-qemu.toml.in | 1 + src/runtime/virtcontainers/clh.go | 12 +++++++----- src/runtime/virtcontainers/qemu_amd64.go | 6 +++++- src/runtime/virtcontainers/qemu_arch_base.go | 2 +- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/src/runtime/config/configuration-clh.toml.in b/src/runtime/config/configuration-clh.toml.in index dc7f1f9f5..c2522cba6 100644 --- a/src/runtime/config/configuration-clh.toml.in +++ b/src/runtime/config/configuration-clh.toml.in @@ -25,6 +25,7 @@ image = "@IMAGEPATH@" # * Does not work by design: # - CPU Hotplug # - Device Hotplug +# - Memory Hotplug # # Default false # confidential_guest = true diff --git a/src/runtime/config/configuration-qemu.toml.in b/src/runtime/config/configuration-qemu.toml.in index 1282be310..0f2198432 100644 --- a/src/runtime/config/configuration-qemu.toml.in +++ b/src/runtime/config/configuration-qemu.toml.in @@ -26,6 +26,7 @@ machine_type = "@MACHINETYPE@" # * Does not work by design: # - CPU Hotplug # - Device Hotplug +# - Memory Hotplug # # Default false # confidential_guest = true diff --git a/src/runtime/virtcontainers/clh.go b/src/runtime/virtcontainers/clh.go index f463d1744..7833d4093 100644 --- a/src/runtime/virtcontainers/clh.go +++ b/src/runtime/virtcontainers/clh.go @@ -258,12 +258,14 @@ func (clh *cloudHypervisor) CreateVM(ctx context.Context, id string, network Net clh.vmconfig.Memory.Shared = func(b bool) *bool { return &b }(true) // Enable hugepages if needed clh.vmconfig.Memory.Hugepages = func(b bool) *bool { return &b }(clh.config.HugePages) - hostMemKb, err := GetHostMemorySizeKb(procMemInfo) - if err != nil { - return nil + if !clh.config.ConfidentialGuest { + hostMemKb, err := GetHostMemorySizeKb(procMemInfo) + if err != nil { + return nil + } + // OpenAPI only supports int64 values + clh.vmconfig.Memory.HotplugSize = func(i int64) *int64 { return &i }(int64((utils.MemUnit(hostMemKb) * utils.KiB).ToBytes())) } - // OpenAPI only supports int64 values - clh.vmconfig.Memory.HotplugSize = func(i int64) *int64 { return &i }(int64((utils.MemUnit(hostMemKb) * utils.KiB).ToBytes())) // Set initial amount of cpu's for the virtual machine clh.vmconfig.Cpus = chclient.NewCpusConfig(int32(clh.config.NumVCPUs), int32(clh.config.DefaultMaxVCPUs)) diff --git a/src/runtime/virtcontainers/qemu_amd64.go b/src/runtime/virtcontainers/qemu_amd64.go index 067a55503..c32c5025d 100644 --- a/src/runtime/virtcontainers/qemu_amd64.go +++ b/src/runtime/virtcontainers/qemu_amd64.go @@ -189,7 +189,11 @@ func (q *qemuAmd64) memoryTopology(memoryMb, hostMemoryMb uint64, slots uint8) g // Is Memory Hotplug supported by this architecture/machine type combination? func (q *qemuAmd64) supportGuestMemoryHotplug() bool { // true for all amd64 machine types except for microvm. - return q.qemuMachine.Type != govmmQemu.MachineTypeMicrovm + if q.qemuMachine.Type == govmmQemu.MachineTypeMicrovm { + return false + } + + return q.protection == noneProtection } func (q *qemuAmd64) appendImage(ctx context.Context, devices []govmmQemu.Device, path string) ([]govmmQemu.Device, error) { diff --git a/src/runtime/virtcontainers/qemu_arch_base.go b/src/runtime/virtcontainers/qemu_arch_base.go index 6601a74d8..8820fd655 100644 --- a/src/runtime/virtcontainers/qemu_arch_base.go +++ b/src/runtime/virtcontainers/qemu_arch_base.go @@ -692,7 +692,7 @@ func (q *qemuArchBase) handleImagePath(config HypervisorConfig) { } func (q *qemuArchBase) supportGuestMemoryHotplug() bool { - return true + return q.protection == noneProtection } func (q *qemuArchBase) setIgnoreSharedMemoryMigrationCaps(ctx context.Context, qmp *govmmQemu.QMP) error {