Skip to content
This repository has been archived by the owner on May 12, 2021. It is now read-only.

Commit

Permalink
QEMU: do not require nvdimm machine option with initrd
Browse files Browse the repository at this point in the history
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 <[email protected]>
  • Loading branch information
marcov committed Sep 25, 2019
1 parent d3f480d commit 8b843c5
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 10 deletions.
14 changes: 13 additions & 1 deletion virtcontainers/qemu_amd64.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package virtcontainers

import (
"os"
"strings"
"time"

"github.com/kata-containers/runtime/virtcontainers/types"
Expand All @@ -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

Expand Down Expand Up @@ -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
Expand Down
36 changes: 32 additions & 4 deletions virtcontainers/qemu_amd64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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)
Expand All @@ -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,
Expand All @@ -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) {
Expand Down Expand Up @@ -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)
}
}
10 changes: 9 additions & 1 deletion virtcontainers/qemu_arm64.go
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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...)
Expand Down
36 changes: 32 additions & 4 deletions virtcontainers/qemu_arm64_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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)
Expand All @@ -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,
Expand All @@ -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)
}
}

0 comments on commit 8b843c5

Please sign in to comment.