From d1de06c9ea2f78f5676b1e9f62591ebfdee3f098 Mon Sep 17 00:00:00 2001 From: Jakob Naucke Date: Wed, 16 Jun 2021 11:55:13 +0200 Subject: [PATCH] virtcontainers: Don't fail memory hotplug Architectures that do not support memory hotplugging will fail when memory limits are set because that amount is hotplugged. Issue a warning instead. The long-term solution is virtio-mem. Fixes: #1412 Signed-off-by: Jakob Naucke --- src/runtime/virtcontainers/qemu.go | 4 +++- src/runtime/virtcontainers/sandbox.go | 6 +++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/runtime/virtcontainers/qemu.go b/src/runtime/virtcontainers/qemu.go index c5b26facfc..9e1c4af5a1 100644 --- a/src/runtime/virtcontainers/qemu.go +++ b/src/runtime/virtcontainers/qemu.go @@ -126,6 +126,8 @@ const ( qemuStopSandboxTimeoutSecs = 15 ) +var noGuestMemHotplugErr error = errors.New("guest memory hotplug not supported") + // agnostic list of kernel parameters var defaultKernelParameters = []Param{ {"panic", "1"}, @@ -1785,7 +1787,7 @@ func (q *qemu) hotplugRemoveCPUs(amount uint32) (uint32, error) { func (q *qemu) hotplugMemory(memDev *memoryDevice, op operation) (int, error) { if !q.arch.supportGuestMemoryHotplug() { - return 0, fmt.Errorf("guest memory hotplug not supported") + return 0, noGuestMemHotplugErr } if memDev.sizeMB < 0 { return 0, fmt.Errorf("cannot hotplug negative size (%d) memory", memDev.sizeMB) diff --git a/src/runtime/virtcontainers/sandbox.go b/src/runtime/virtcontainers/sandbox.go index 5f2bd56d57..95f68bfeb8 100644 --- a/src/runtime/virtcontainers/sandbox.go +++ b/src/runtime/virtcontainers/sandbox.go @@ -1836,7 +1836,11 @@ func (s *Sandbox) updateResources(ctx context.Context) error { s.Logger().WithField("memory-sandbox-size-byte", sandboxMemoryByte).Debugf("Request to hypervisor to update memory") newMemory, updatedMemoryDevice, err := s.hypervisor.resizeMemory(ctx, uint32(sandboxMemoryByte>>utils.MibToBytesShift), s.state.GuestMemoryBlockSizeMB, s.state.GuestMemoryHotplugProbe) if err != nil { - return err + if err == noGuestMemHotplugErr { + s.Logger().Warnf("%s, memory specifications cannot be guaranteed", err) + } else { + return err + } } s.Logger().Debugf("Sandbox memory size: %d MB", newMemory) if s.state.GuestMemoryHotplugProbe && updatedMemoryDevice.addr != 0 {