QEMU: do not require nvdimm machine option with initrd

Do not add the "nvdimm" machine option to QEMU when the config specifies
a initrd file.
For arm64, this allows using a vanilla QEMU, where "virt" machine does
not support the "nvdimm" option.

Fixes: #2088

Signed-off-by: Marco Vedovati <mvedovati@suse.com>
This commit is contained in:
Marco Vedovati 2019-09-25 13:02:51 +02:00
parent d3f480dc4c
commit 8b843c5229
4 changed files with 86 additions and 10 deletions

View File

@ -7,6 +7,7 @@ package virtcontainers
import (
"os"
"strings"
"time"
"github.com/kata-containers/runtime/virtcontainers/types"
@ -25,7 +26,9 @@ const defaultQemuPath = "/usr/bin/qemu-system-x86_64"
const defaultQemuMachineType = QemuPC
const defaultQemuMachineOptions = "accel=kvm,kernel_irqchip,nvdimm"
const qemuNvdimmOption = "nvdimm"
const defaultQemuMachineOptions = "accel=kvm,kernel_irqchip"
const qmpMigrationWaitTimeout = 5 * time.Second
@ -103,6 +106,15 @@ func newQemuArch(config HypervisorConfig) qemuArch {
vmFactory: factory,
}
if config.ImagePath != "" {
for i := range q.supportedQemuMachines {
q.supportedQemuMachines[i].Options = strings.Join([]string{
q.supportedQemuMachines[i].Options,
qemuNvdimmOption,
}, ",")
}
}
q.handleImagePath(config)
return q

View File

@ -16,10 +16,14 @@ import (
"github.com/stretchr/testify/assert"
)
func newTestQemu(machineType string) qemuArch {
config := HypervisorConfig{
func qemuConfig(machineType string) HypervisorConfig {
return HypervisorConfig{
HypervisorMachineType: machineType,
}
}
func newTestQemu(machineType string) qemuArch {
config := qemuConfig(machineType)
return newQemuArch(config)
}
@ -112,7 +116,6 @@ func TestQemuAmd64MemoryTopology(t *testing.T) {
func TestQemuAmd64AppendImage(t *testing.T) {
var devices []govmmQemu.Device
assert := assert.New(t)
amd64 := newTestQemu(QemuPC)
f, err := ioutil.TempFile("", "img")
assert.NoError(err)
@ -122,6 +125,17 @@ func TestQemuAmd64AppendImage(t *testing.T) {
imageStat, err := f.Stat()
assert.NoError(err)
// save default supportedQemuMachines options
machinesCopy := make([]govmmQemu.Machine, len(supportedQemuMachines))
assert.Equal(len(supportedQemuMachines), copy(machinesCopy, supportedQemuMachines))
cfg := qemuConfig(QemuPC)
cfg.ImagePath = f.Name()
amd64 := newQemuArch(cfg)
for _, m := range amd64.(*qemuAmd64).supportedQemuMachines {
assert.Contains(m.Options, qemuNvdimmOption)
}
expectedOut := []govmmQemu.Device{
govmmQemu.Object{
Driver: govmmQemu.NVDIMM,
@ -135,8 +149,10 @@ func TestQemuAmd64AppendImage(t *testing.T) {
devices, err = amd64.appendImage(devices, f.Name())
assert.NoError(err)
assert.Equal(expectedOut, devices)
// restore default supportedQemuMachines options
assert.Equal(len(supportedQemuMachines), copy(supportedQemuMachines, machinesCopy))
}
func TestQemuAmd64AppendBridges(t *testing.T) {
@ -190,3 +206,15 @@ func TestQemuAmd64AppendBridges(t *testing.T) {
assert.Equal(expectedOut, devices)
}
func TestQemuAmd64WithInitrd(t *testing.T) {
assert := assert.New(t)
cfg := qemuConfig(QemuPC)
cfg.InitrdPath = "dummy-initrd"
amd64 := newQemuArch(cfg)
for _, m := range amd64.(*qemuAmd64).supportedQemuMachines {
assert.NotContains(m.Options, qemuNvdimmOption)
}
}

View File

@ -26,9 +26,11 @@ const defaultQemuPath = "/usr/bin/qemu-system-aarch64"
const defaultQemuMachineType = QemuVirt
const qemuNvdimmOption = "nvdimm"
const qmpMigrationWaitTimeout = 10 * time.Second
var defaultQemuMachineOptions = "usb=off,accel=kvm,nvdimm,gic-version=" + getGuestGICVersion()
var defaultQemuMachineOptions = "usb=off,accel=kvm,gic-version=" + getGuestGICVersion()
var qemuPaths = map[string]string{
QemuVirt: defaultQemuPath,
@ -153,6 +155,12 @@ func newQemuArch(config HypervisorConfig) qemuArch {
}
if config.ImagePath != "" {
for i := range q.supportedQemuMachines {
q.supportedQemuMachines[i].Options = strings.Join([]string{
q.supportedQemuMachines[i].Options,
qemuNvdimmOption,
}, ",")
}
q.kernelParams = append(q.kernelParams, kernelRootParams...)
q.kernelParamsNonDebug = append(q.kernelParamsNonDebug, kernelParamsSystemdNonDebug...)
q.kernelParamsDebug = append(q.kernelParamsDebug, kernelParamsSystemdDebug...)

View File

@ -17,10 +17,14 @@ import (
"github.com/stretchr/testify/assert"
)
func newTestQemu(machineType string) qemuArch {
config := HypervisorConfig{
func qemuConfig(machineType string) HypervisorConfig {
return HypervisorConfig{
HypervisorMachineType: machineType,
}
}
func newTestQemu(machineType string) qemuArch {
config := qemuConfig(machineType)
return newQemuArch(config)
}
@ -130,7 +134,6 @@ func TestQemuArm64AppendBridges(t *testing.T) {
func TestQemuArm64AppendImage(t *testing.T) {
var devices []govmmQemu.Device
assert := assert.New(t)
arm64 := newTestQemu(QemuVirt)
f, err := ioutil.TempFile("", "img")
assert.NoError(err)
@ -140,6 +143,17 @@ func TestQemuArm64AppendImage(t *testing.T) {
imageStat, err := f.Stat()
assert.NoError(err)
// save default supportedQemuMachines options
machinesCopy := make([]govmmQemu.Machine, len(supportedQemuMachines))
assert.Equal(len(supportedQemuMachines), copy(machinesCopy, supportedQemuMachines))
cfg := qemuConfig(QemuVirt)
cfg.ImagePath = f.Name()
arm64 := newQemuArch(cfg)
for _, m := range arm64.(*qemuArm64).supportedQemuMachines {
assert.Contains(m.Options, qemuNvdimmOption)
}
expectedOut := []govmmQemu.Device{
govmmQemu.Object{
Driver: govmmQemu.NVDIMM,
@ -153,6 +167,20 @@ func TestQemuArm64AppendImage(t *testing.T) {
devices, err = arm64.appendImage(devices, f.Name())
assert.NoError(err)
assert.Equal(expectedOut, devices)
// restore default supportedQemuMachines options
assert.Equal(len(supportedQemuMachines), copy(supportedQemuMachines, machinesCopy))
}
func TestQemuArm64WithInitrd(t *testing.T) {
assert := assert.New(t)
cfg := qemuConfig(QemuVirt)
cfg.InitrdPath = "dummy-initrd"
arm64 := newQemuArch(cfg)
for _, m := range arm64.(*qemuArm64).supportedQemuMachines {
assert.NotContains(m.Options, qemuNvdimmOption)
}
}