From 6aff077901021d9a0075c446dfe281b2487e1487 Mon Sep 17 00:00:00 2001 From: Liam Merwick Date: Fri, 24 Apr 2020 12:14:10 +0000 Subject: [PATCH] virtcontainers: x86: Support microvm machine type With the addition of support to govmm for multiple transports (intel/govmm#111) and microvm (intel/govmm#121) we can now enable support for the 'microvm' machine type in kata-runtime. Fixes: #2360 Signed-off-by: Liam Merwick --- pkg/katautils/config.go | 9 +++++++++ virtcontainers/qemu_amd64.go | 17 ++++++++++++++--- virtcontainers/qemu_amd64_test.go | 23 +++++++++++++++++++++++ virtcontainers/qemu_arch_base.go | 3 +++ 4 files changed, 49 insertions(+), 3 deletions(-) diff --git a/pkg/katautils/config.go b/pkg/katautils/config.go index 14794a24ff..d4a4ee3111 100644 --- a/pkg/katautils/config.go +++ b/pkg/katautils/config.go @@ -14,6 +14,7 @@ import ( "strings" "github.com/BurntSushi/toml" + govmmQemu "github.com/intel/govmm/qemu" vc "github.com/kata-containers/runtime/virtcontainers" "github.com/kata-containers/runtime/virtcontainers/device/config" exp "github.com/kata-containers/runtime/virtcontainers/experimental" @@ -595,6 +596,14 @@ func newQemuHypervisorConfig(h hypervisor) (vc.HypervisorConfig, error) { kernelParams := h.kernelParams() machineType := h.machineType() + // The "microvm" machine type doesn't support NVDIMM so override the + // config setting to explicitly disable it (i.e. don't require the + // user to add 'disable_image_nvdimm = true' in the .toml file). + if machineType == govmmQemu.MachineTypeMicrovm && !h.DisableImageNvdimm { + h.DisableImageNvdimm = true + kataUtilsLogger.Info("Setting 'disable_image_nvdimm = true' as microvm does not support NVDIMM") + } + blockDriver, err := h.blockDeviceDriver() if err != nil { return vc.HypervisorConfig{}, err diff --git a/virtcontainers/qemu_amd64.go b/virtcontainers/qemu_amd64.go index 1a5b266937..0e0d04a73c 100644 --- a/virtcontainers/qemu_amd64.go +++ b/virtcontainers/qemu_amd64.go @@ -31,9 +31,10 @@ const ( ) var qemuPaths = map[string]string{ - QemuPCLite: "/usr/bin/qemu-lite-system-x86_64", - QemuPC: defaultQemuPath, - QemuQ35: defaultQemuPath, + QemuPCLite: "/usr/bin/qemu-lite-system-x86_64", + QemuPC: defaultQemuPath, + QemuQ35: defaultQemuPath, + QemuMicrovm: defaultQemuPath, } var kernelParams = []Param{ @@ -71,6 +72,10 @@ var supportedQemuMachines = []govmmQemu.Machine{ Type: QemuVirt, Options: defaultQemuMachineOptions, }, + { + Type: QemuMicrovm, + Options: defaultQemuMachineOptions, + }, } // MaxQemuVCPUs returns the maximum number of vCPUs supported @@ -148,6 +153,12 @@ func (q *qemuAmd64) memoryTopology(memoryMb, hostMemoryMb uint64, slots uint8) g return genericMemoryTopology(memoryMb, hostMemoryMb, slots, q.memoryOffset) } +// 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.machineType != govmmQemu.MachineTypeMicrovm +} + func (q *qemuAmd64) appendImage(devices []govmmQemu.Device, path string) ([]govmmQemu.Device, error) { if !q.disableNvdimm { return q.appendNvdimmImage(devices, path) diff --git a/virtcontainers/qemu_amd64_test.go b/virtcontainers/qemu_amd64_test.go index f9d477edc5..86be8fe0fe 100644 --- a/virtcontainers/qemu_amd64_test.go +++ b/virtcontainers/qemu_amd64_test.go @@ -37,6 +37,10 @@ func TestQemuAmd64Capabilities(t *testing.T) { amd64 = newTestQemu(QemuQ35) caps = amd64.capabilities() assert.True(caps.IsBlockDeviceHotplugSupported()) + + amd64 = newTestQemu(QemuMicrovm) + caps = amd64.capabilities() + assert.False(caps.IsBlockDeviceHotplugSupported()) } func TestQemuAmd64Bridges(t *testing.T) { @@ -67,6 +71,11 @@ func TestQemuAmd64Bridges(t *testing.T) { assert.NotNil(b.Devices) } + amd64 = newTestQemu(QemuMicrovm) + amd64.bridges(uint32(len)) + bridges = amd64.getBridges() + assert.Nil(bridges) + amd64 = newTestQemu(QemuQ35 + QemuPC) amd64.bridges(uint32(len)) bridges = amd64.getBridges() @@ -239,3 +248,17 @@ func TestQemuAmd64WithInitrd(t *testing.T) { assert.NotContains(m.Options, qemuNvdimmOption) } } + +func TestQemuAmd64Microvm(t *testing.T) { + assert := assert.New(t) + + cfg := qemuConfig(QemuMicrovm) + amd64 := newQemuArch(cfg) + assert.False(cfg.DisableImageNvdimm) + + for _, m := range amd64.(*qemuAmd64).supportedQemuMachines { + assert.NotContains(m.Options, qemuNvdimmOption) + } + + assert.False(amd64.supportGuestMemoryHotplug()) +} diff --git a/virtcontainers/qemu_arch_base.go b/virtcontainers/qemu_arch_base.go index 9d72dd09f2..5ea1abb7d7 100644 --- a/virtcontainers/qemu_arch_base.go +++ b/virtcontainers/qemu_arch_base.go @@ -175,6 +175,9 @@ const ( // QemuQ35 is the QEMU Q35 machine type for amd64 QemuQ35 = "q35" + // QemuMicrovm is the QEMU microvm machine type for amd64 + QemuMicrovm = "microvm" + // QemuVirt is the QEMU virt machine type for aarch64 or amd64 QemuVirt = "virt"