From d0bccabbe133ad25f3bd0297b383baf58eef3c27 Mon Sep 17 00:00:00 2001 From: Nitesh Konkar Date: Tue, 19 Jun 2018 19:48:18 +0530 Subject: [PATCH] virtcontainers: Set ppc64le maxmem depending on qemu version The "Failed to allocate HTAB of requested size, try with smaller maxmem" error in ppc64le occurs when maxmem allocated is very high. This got fixed in qemu 2.10 and kernel 4.11. Hence put a maxmem restriction of 32GB per kata-container if qemu version less than 2.10 Fixes: #415 Signed-off-by: Nitesh Konkar --- virtcontainers/qemu.go | 5 +++++ virtcontainers/qemu_ppc64le.go | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/virtcontainers/qemu.go b/virtcontainers/qemu.go index efb1699b7..53207051a 100644 --- a/virtcontainers/qemu.go +++ b/virtcontainers/qemu.go @@ -64,6 +64,9 @@ const qmpCapErrMsg = "Failed to negoatiate QMP capabilities" const defaultConsole = "console.sock" +var qemuMajorVersion int +var qemuMinorVersion int + // agnostic list of kernel parameters var defaultKernelParameters = []Param{ {"panic", "1"}, @@ -509,6 +512,8 @@ func (q *qemu) waitSandbox(timeout int) error { } q.qmpMonitorCh.qmp = qmp + qemuMajorVersion = ver.Major + qemuMinorVersion = ver.Minor q.Logger().WithFields(logrus.Fields{ "qmp-major-version": ver.Major, diff --git a/virtcontainers/qemu_ppc64le.go b/virtcontainers/qemu_ppc64le.go index 930cc3fe9..ba259389e 100644 --- a/virtcontainers/qemu_ppc64le.go +++ b/virtcontainers/qemu_ppc64le.go @@ -12,6 +12,7 @@ import ( govmmQemu "github.com/intel/govmm/qemu" "github.com/kata-containers/runtime/virtcontainers/device/drivers" "github.com/kata-containers/runtime/virtcontainers/utils" + "github.com/sirupsen/logrus" ) type qemuPPC64le struct { @@ -54,6 +55,11 @@ var supportedQemuMachines = []govmmQemu.Machine{ }, } +// Logger returns a logrus logger appropriate for logging qemu messages +func (q *qemuPPC64le) Logger() *logrus.Entry { + return virtLog.WithField("subsystem", "qemu") +} + // MaxQemuVCPUs returns the maximum number of vCPUs supported func MaxQemuVCPUs() uint32 { return uint32(128) @@ -105,12 +111,14 @@ func (q *qemuPPC64le) cpuModel() string { func (q *qemuPPC64le) memoryTopology(memoryMb, hostMemoryMb uint64) govmmQemu.Memory { - if hostMemoryMb > defaultMemMaxPPC64le { - hostMemoryMb = defaultMemMaxPPC64le - } else { - // align hostMemoryMb to 256MB multiples + if qemuMajorVersion >= 2 && qemuMinorVersion >= 10 { + q.Logger().Debug("Aligning maxmem to multiples of 256MB. Assumption: Kernel Version >= 4.11") hostMemoryMb -= (hostMemoryMb % 256) + } else { + q.Logger().Debug("Restricting maxmem to 32GB as Qemu Version < 2.10, Assumption: Kernel Version >= 4.11") + hostMemoryMb = defaultMemMaxPPC64le } + return genericMemoryTopology(memoryMb, hostMemoryMb) }