Merge pull request #1954 from marcel-apf/remove-pc

Remove the pc machine
This commit is contained in:
David Gibson 2021-06-23 12:00:05 +10:00 committed by GitHub
commit c0cc6d5978
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 49 additions and 90 deletions

View File

@ -65,8 +65,8 @@ configuration in the Kata `configuration.toml` file as shown below.
$ sudo sed -i -e 's/^# *\(hotplug_vfio_on_root_bus\).*=.*$/\1 = true/g' /usr/share/defaults/kata-containers/configuration.toml $ sudo sed -i -e 's/^# *\(hotplug_vfio_on_root_bus\).*=.*$/\1 = true/g' /usr/share/defaults/kata-containers/configuration.toml
``` ```
Make sure you are using the `pc` machine type by verifying `machine_type = "pc"` is Make sure you are using the `q35` machine type by verifying `machine_type = "q35"` is
set in the `configuration.toml`. set in the `configuration.toml`. Make sure `pcie_root_port` is set to a positive value.
## Build Kata Containers kernel with GPU support ## Build Kata Containers kernel with GPU support

View File

@ -75,13 +75,6 @@ To use non-large BARs devices (for example, Nvidia Tesla T4), you need Kata vers
Follow the [Kata Containers setup instructions](../install/README.md) Follow the [Kata Containers setup instructions](../install/README.md)
to install the latest version of Kata. to install the latest version of Kata.
The following configuration in the Kata `configuration.toml` file as shown below can work:
```
machine_type = "pc"
hotplug_vfio_on_root_bus = true
```
To use large BARs devices (for example, Nvidia Tesla P100), you need Kata version 1.11.0 or above. To use large BARs devices (for example, Nvidia Tesla P100), you need Kata version 1.11.0 or above.
The following configuration in the Kata `configuration.toml` file as shown below can work: The following configuration in the Kata `configuration.toml` file as shown below can work:

View File

@ -178,7 +178,7 @@ block_device_driver = "@DEFBLOCKSTORAGEDRIVER_FC@"
# VFIO devices are hotplugged on a bridge by default. # VFIO devices are hotplugged on a bridge by default.
# Enable hotplugging on root bus. This may be required for devices with # Enable hotplugging on root bus. This may be required for devices with
# a large PCI bar, as this is a current limitation with hotplugging on # a large PCI bar, as this is a current limitation with hotplugging on
# a bridge. This value is valid for "pc" machine type. # a bridge.
# Default false # Default false
#hotplug_vfio_on_root_bus = true #hotplug_vfio_on_root_bus = true

View File

@ -277,7 +277,7 @@ pflashes = []
# VFIO devices are hotplugged on a bridge by default. # VFIO devices are hotplugged on a bridge by default.
# Enable hotplugging on root bus. This may be required for devices with # Enable hotplugging on root bus. This may be required for devices with
# a large PCI bar, as this is a current limitation with hotplugging on # a large PCI bar, as this is a current limitation with hotplugging on
# a bridge. This value is valid for "pc" machine type. # a bridge.
# Default false # Default false
#hotplug_vfio_on_root_bus = true #hotplug_vfio_on_root_bus = true

View File

@ -31,7 +31,7 @@ require (
github.com/gogo/protobuf v1.3.1 github.com/gogo/protobuf v1.3.1
github.com/hashicorp/go-multierror v1.0.0 github.com/hashicorp/go-multierror v1.0.0
github.com/intel-go/cpuid v0.0.0-20210602155658-5747e5cec0d9 github.com/intel-go/cpuid v0.0.0-20210602155658-5747e5cec0d9
github.com/kata-containers/govmm v0.0.0-20210520142420-eb57f004d89f github.com/kata-containers/govmm v0.0.0-20210622075516-263136e69ac8
github.com/mdlayher/vsock v0.0.0-20191108225356-d9c65923cb8f github.com/mdlayher/vsock v0.0.0-20191108225356-d9c65923cb8f
github.com/opencontainers/image-spec v1.0.1 // indirect github.com/opencontainers/image-spec v1.0.1 // indirect
github.com/opencontainers/runc v1.0.0-rc9.0.20200102164712-2b52db75279c github.com/opencontainers/runc v1.0.0-rc9.0.20200102164712-2b52db75279c

View File

@ -274,6 +274,8 @@ github.com/kata-containers/govmm v0.0.0-20210428163604-f0e9a35308ee h1:M4N7AdSHg
github.com/kata-containers/govmm v0.0.0-20210428163604-f0e9a35308ee/go.mod h1:VmAHbsL5lLfzHW/MNL96NVLF840DNEV5i683kISgFKk= github.com/kata-containers/govmm v0.0.0-20210428163604-f0e9a35308ee/go.mod h1:VmAHbsL5lLfzHW/MNL96NVLF840DNEV5i683kISgFKk=
github.com/kata-containers/govmm v0.0.0-20210520142420-eb57f004d89f h1:jXMZY7GIz5kSv3/Rdiesg1WMvgXJKNOk3KxwxgNWAVk= github.com/kata-containers/govmm v0.0.0-20210520142420-eb57f004d89f h1:jXMZY7GIz5kSv3/Rdiesg1WMvgXJKNOk3KxwxgNWAVk=
github.com/kata-containers/govmm v0.0.0-20210520142420-eb57f004d89f/go.mod h1:VmAHbsL5lLfzHW/MNL96NVLF840DNEV5i683kISgFKk= github.com/kata-containers/govmm v0.0.0-20210520142420-eb57f004d89f/go.mod h1:VmAHbsL5lLfzHW/MNL96NVLF840DNEV5i683kISgFKk=
github.com/kata-containers/govmm v0.0.0-20210622075516-263136e69ac8 h1:ZQ/qgoFsgmvk7AikgW1pI4dFaXfkUEVn+KK63ju3vgU=
github.com/kata-containers/govmm v0.0.0-20210622075516-263136e69ac8/go.mod h1:VmAHbsL5lLfzHW/MNL96NVLF840DNEV5i683kISgFKk=
github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=

View File

@ -20,7 +20,7 @@ var defaultCPUFeatures = ""
var systemdUnitName = "kata-containers.target" var systemdUnitName = "kata-containers.target"
const defaultKernelParams = "" const defaultKernelParams = ""
const defaultMachineType = "pc" const defaultMachineType = "q35"
const defaultVCPUCount uint32 = 1 const defaultVCPUCount uint32 = 1
const defaultMaxVCPUCount uint32 = 0 const defaultMaxVCPUCount uint32 = 0

View File

@ -1386,7 +1386,7 @@ func (q *QMP) ExecQueryCpusFast(ctx context.Context) ([]CPUInfoFast, error) {
} }
// ExecMemdevAdd adds size of MiB memory device to the guest // ExecMemdevAdd adds size of MiB memory device to the guest
func (q *QMP) ExecMemdevAdd(ctx context.Context, qomtype, id, mempath string, size int, share bool, driver, driverID string) error { func (q *QMP) ExecMemdevAdd(ctx context.Context, qomtype, id, mempath string, size int, share bool, driver, driverID, addr, bus string) error {
props := map[string]interface{}{"size": uint64(size) << 20} props := map[string]interface{}{"size": uint64(size) << 20}
args := map[string]interface{}{ args := map[string]interface{}{
"qom-type": qomtype, "qom-type": qomtype,
@ -1419,6 +1419,14 @@ func (q *QMP) ExecMemdevAdd(ctx context.Context, qomtype, id, mempath string, si
"id": driverID, "id": driverID,
"memdev": id, "memdev": id,
} }
if bus != "" {
args["bus"] = bus
}
if addr != "" {
args["addr"] = addr
}
err = q.executeCommand(ctx, "device_add", args, nil) err = q.executeCommand(ctx, "device_add", args, nil)
return err return err
@ -1426,7 +1434,7 @@ func (q *QMP) ExecMemdevAdd(ctx context.Context, qomtype, id, mempath string, si
// ExecHotplugMemory adds size of MiB memory to the guest // ExecHotplugMemory adds size of MiB memory to the guest
func (q *QMP) ExecHotplugMemory(ctx context.Context, qomtype, id, mempath string, size int, share bool) error { func (q *QMP) ExecHotplugMemory(ctx context.Context, qomtype, id, mempath string, size int, share bool) error {
return q.ExecMemdevAdd(ctx, qomtype, id, mempath, size, share, "pc-dimm", "dimm"+id) return q.ExecMemdevAdd(ctx, qomtype, id, mempath, size, share, "pc-dimm", "dimm"+id, "", "")
} }
// ExecuteNVDIMMDeviceAdd adds a block device to a QEMU instance using // ExecuteNVDIMMDeviceAdd adds a block device to a QEMU instance using

View File

@ -143,8 +143,6 @@ github.com/coreos/go-systemd/dbus
github.com/cri-o/cri-o/pkg/annotations github.com/cri-o/cri-o/pkg/annotations
# github.com/davecgh/go-spew v1.1.1 # github.com/davecgh/go-spew v1.1.1
github.com/davecgh/go-spew/spew github.com/davecgh/go-spew/spew
# github.com/dlespiau/covertool v0.0.0-20180314162135-b0c4c6d0583a
## explicit
# github.com/docker/distribution v2.7.1+incompatible # github.com/docker/distribution v2.7.1+incompatible
## explicit ## explicit
github.com/docker/distribution/digestset github.com/docker/distribution/digestset
@ -224,7 +222,7 @@ github.com/hashicorp/go-multierror
# github.com/intel-go/cpuid v0.0.0-20210602155658-5747e5cec0d9 # github.com/intel-go/cpuid v0.0.0-20210602155658-5747e5cec0d9
## explicit ## explicit
github.com/intel-go/cpuid github.com/intel-go/cpuid
# github.com/kata-containers/govmm v0.0.0-20210520142420-eb57f004d89f # github.com/kata-containers/govmm v0.0.0-20210622075516-263136e69ac8
## explicit ## explicit
github.com/kata-containers/govmm/qemu github.com/kata-containers/govmm/qemu
# github.com/konsorten/go-windows-terminal-sequences v1.0.1 # github.com/konsorten/go-windows-terminal-sequences v1.0.1

View File

@ -708,7 +708,7 @@ func (q *qemu) getMemArgs() (bool, string, string, error) {
return share, target, memoryBack, nil return share, target, memoryBack, nil
} }
func (q *qemu) setupVirtioMem() error { func (q *qemu) setupVirtioMem(ctx context.Context) error {
maxMem, err := q.hostMemMB() maxMem, err := q.hostMemMB()
if err != nil { if err != nil {
return err return err
@ -724,7 +724,19 @@ func (q *qemu) setupVirtioMem() error {
if err = q.qmpSetup(); err != nil { if err = q.qmpSetup(); err != nil {
return err return err
} }
err = q.qmpMonitorCh.qmp.ExecMemdevAdd(q.qmpMonitorCh.ctx, memoryBack, "virtiomem", target, sizeMB, share, "virtio-mem-pci", "virtiomem0")
addr, bridge, err := q.arch.addDeviceToBridge(ctx, "virtiomem-dev", types.PCI)
if err != nil {
return err
}
defer func() {
if err != nil {
q.arch.removeDeviceFromBridge("virtiomem-dev")
}
}()
err = q.qmpMonitorCh.qmp.ExecMemdevAdd(q.qmpMonitorCh.ctx, memoryBack, "virtiomem", target, sizeMB, share, "virtio-mem-pci", "virtiomem0", addr, bridge.ID)
if err == nil { if err == nil {
q.config.VirtioMem = true q.config.VirtioMem = true
q.Logger().Infof("Setup %dMB virtio-mem-pci success", sizeMB) q.Logger().Infof("Setup %dMB virtio-mem-pci success", sizeMB)
@ -832,7 +844,7 @@ func (q *qemu) startSandbox(ctx context.Context, timeout int) error {
} }
if q.config.VirtioMem { if q.config.VirtioMem {
err = q.setupVirtioMem() err = q.setupVirtioMem(ctx)
} }
return err return err
@ -2095,8 +2107,6 @@ func genericBridges(number uint32, machineType string) []types.Bridge {
case QemuQ35: case QemuQ35:
// currently only pci bridges are supported // currently only pci bridges are supported
// qemu-2.10 will introduce pcie bridges // qemu-2.10 will introduce pcie bridges
fallthrough
case QemuPC:
bt = types.PCI bt = types.PCI
case QemuVirt: case QemuVirt:
bt = types.PCI bt = types.PCI

View File

@ -29,7 +29,7 @@ type qemuAmd64 struct {
const ( const (
defaultQemuPath = "/usr/bin/qemu-system-x86_64" defaultQemuPath = "/usr/bin/qemu-system-x86_64"
defaultQemuMachineType = QemuPC defaultQemuMachineType = QemuQ35
defaultQemuMachineOptions = "accel=kvm,kernel_irqchip" defaultQemuMachineOptions = "accel=kvm,kernel_irqchip"
@ -44,7 +44,6 @@ const (
var qemuPaths = map[string]string{ var qemuPaths = map[string]string{
QemuPCLite: "/usr/bin/qemu-lite-system-x86_64", QemuPCLite: "/usr/bin/qemu-lite-system-x86_64",
QemuPC: defaultQemuPath,
QemuQ35: defaultQemuPath, QemuQ35: defaultQemuPath,
QemuMicrovm: defaultQemuPath, QemuMicrovm: defaultQemuPath,
} }
@ -71,10 +70,6 @@ var supportedQemuMachines = []govmmQemu.Machine{
Type: QemuPCLite, Type: QemuPCLite,
Options: defaultQemuMachineOptions, Options: defaultQemuMachineOptions,
}, },
{
Type: QemuPC,
Options: defaultQemuMachineOptions,
},
{ {
Type: QemuQ35, Type: QemuQ35,
Options: defaultQemuMachineOptions, Options: defaultQemuMachineOptions,
@ -158,8 +153,7 @@ func newQemuArch(config HypervisorConfig) (qemuArch, error) {
func (q *qemuAmd64) capabilities() types.Capabilities { func (q *qemuAmd64) capabilities() types.Capabilities {
var caps types.Capabilities var caps types.Capabilities
if q.qemuMachine.Type == QemuPC || if q.qemuMachine.Type == QemuQ35 ||
q.qemuMachine.Type == QemuQ35 ||
q.qemuMachine.Type == QemuVirt { q.qemuMachine.Type == QemuVirt {
caps.SetBlockDeviceHotplugSupport() caps.SetBlockDeviceHotplugSupport()
} }

View File

@ -42,14 +42,10 @@ func TestQemuAmd64BadMachineType(t *testing.T) {
func TestQemuAmd64Capabilities(t *testing.T) { func TestQemuAmd64Capabilities(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
amd64 := newTestQemu(assert, QemuPC) amd64 := newTestQemu(assert, QemuQ35)
caps := amd64.capabilities() caps := amd64.capabilities()
assert.True(caps.IsBlockDeviceHotplugSupported()) assert.True(caps.IsBlockDeviceHotplugSupported())
amd64 = newTestQemu(assert, QemuQ35)
caps = amd64.capabilities()
assert.True(caps.IsBlockDeviceHotplugSupported())
amd64 = newTestQemu(assert, QemuMicrovm) amd64 = newTestQemu(assert, QemuMicrovm)
caps = amd64.capabilities() caps = amd64.capabilities()
assert.False(caps.IsBlockDeviceHotplugSupported()) assert.False(caps.IsBlockDeviceHotplugSupported())
@ -57,23 +53,11 @@ func TestQemuAmd64Capabilities(t *testing.T) {
func TestQemuAmd64Bridges(t *testing.T) { func TestQemuAmd64Bridges(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
amd64 := newTestQemu(assert, QemuPC)
len := 5 len := 5
amd64 := newTestQemu(assert, QemuMicrovm)
amd64.bridges(uint32(len)) amd64.bridges(uint32(len))
bridges := amd64.getBridges() bridges := amd64.getBridges()
assert.Len(bridges, len)
for i, b := range bridges {
id := fmt.Sprintf("%s-bridge-%d", types.PCI, i)
assert.Equal(types.PCI, b.Type)
assert.Equal(id, b.ID)
assert.NotNil(b.Devices)
}
amd64 = newTestQemu(assert, QemuMicrovm)
amd64.bridges(uint32(len))
bridges = amd64.getBridges()
assert.Nil(bridges) assert.Nil(bridges)
amd64 = newTestQemu(assert, QemuQ35) amd64 = newTestQemu(assert, QemuQ35)
@ -91,7 +75,7 @@ func TestQemuAmd64Bridges(t *testing.T) {
func TestQemuAmd64CPUModel(t *testing.T) { func TestQemuAmd64CPUModel(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
amd64 := newTestQemu(assert, QemuPC) amd64 := newTestQemu(assert, QemuQ35)
expectedOut := defaultCPUModel expectedOut := defaultCPUModel
model := amd64.cpuModel() model := amd64.cpuModel()
@ -108,7 +92,7 @@ func TestQemuAmd64CPUModel(t *testing.T) {
func TestQemuAmd64MemoryTopology(t *testing.T) { func TestQemuAmd64MemoryTopology(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
amd64 := newTestQemu(assert, QemuPC) amd64 := newTestQemu(assert, QemuQ35)
memoryOffset := uint64(1024) memoryOffset := uint64(1024)
hostMem := uint64(100) hostMem := uint64(100)
@ -139,7 +123,7 @@ func TestQemuAmd64AppendImage(t *testing.T) {
machinesCopy := make([]govmmQemu.Machine, len(supportedQemuMachines)) machinesCopy := make([]govmmQemu.Machine, len(supportedQemuMachines))
assert.Equal(len(supportedQemuMachines), copy(machinesCopy, supportedQemuMachines)) assert.Equal(len(supportedQemuMachines), copy(machinesCopy, supportedQemuMachines))
cfg := qemuConfig(QemuPC) cfg := qemuConfig(QemuQ35)
cfg.ImagePath = f.Name() cfg.ImagePath = f.Name()
cfg.DisableImageNvdimm = false cfg.DisableImageNvdimm = false
amd64, err := newQemuArch(cfg) amd64, err := newQemuArch(cfg)
@ -189,41 +173,18 @@ func TestQemuAmd64AppendBridges(t *testing.T) {
var devices []govmmQemu.Device var devices []govmmQemu.Device
assert := assert.New(t) assert := assert.New(t)
// check PC // Check Q35
amd64 := newTestQemu(assert, QemuPC) amd64 := newTestQemu(assert, QemuQ35)
amd64.bridges(1) amd64.bridges(1)
bridges := amd64.getBridges() bridges := amd64.getBridges()
assert.Len(bridges, 1) assert.Len(bridges, 1)
devices = amd64.appendBridges(devices)
assert.Len(devices, 1)
expectedOut := []govmmQemu.Device{
govmmQemu.BridgeDevice{
Type: govmmQemu.PCIBridge,
Bus: defaultPCBridgeBus,
ID: bridges[0].ID,
Chassis: 1,
SHPC: true,
Addr: "2",
},
}
assert.Equal(expectedOut, devices)
// Check Q35
amd64 = newTestQemu(assert, QemuQ35)
amd64.bridges(1)
bridges = amd64.getBridges()
assert.Len(bridges, 1)
devices = []govmmQemu.Device{} devices = []govmmQemu.Device{}
devices = amd64.appendBridges(devices) devices = amd64.appendBridges(devices)
assert.Len(devices, 1) assert.Len(devices, 1)
expectedOut = []govmmQemu.Device{ expectedOut := []govmmQemu.Device{
govmmQemu.BridgeDevice{ govmmQemu.BridgeDevice{
Type: govmmQemu.PCIBridge, Type: govmmQemu.PCIBridge,
Bus: defaultBridgeBus, Bus: defaultBridgeBus,
@ -240,7 +201,7 @@ func TestQemuAmd64AppendBridges(t *testing.T) {
func TestQemuAmd64WithInitrd(t *testing.T) { func TestQemuAmd64WithInitrd(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
cfg := qemuConfig(QemuPC) cfg := qemuConfig(QemuQ35)
cfg.InitrdPath = "dummy-initrd" cfg.InitrdPath = "dummy-initrd"
amd64, err := newQemuArch(cfg) amd64, err := newQemuArch(cfg)
assert.NoError(err) assert.NoError(err)
@ -282,7 +243,7 @@ func TestQemuAmd64AppendProtectionDevice(t *testing.T) {
var devices []govmmQemu.Device var devices []govmmQemu.Device
assert := assert.New(t) assert := assert.New(t)
amd64 := newTestQemu(assert, QemuPC) amd64 := newTestQemu(assert, QemuQ35)
id := amd64.(*qemuAmd64).devLoadersCount id := amd64.(*qemuAmd64).devLoadersCount
firmware := "tdvf.fd" firmware := "tdvf.fd"

View File

@ -212,9 +212,6 @@ const (
// QemuPCLite is the QEMU pc-lite machine type for amd64 // QemuPCLite is the QEMU pc-lite machine type for amd64
QemuPCLite = "pc-lite" QemuPCLite = "pc-lite"
// QemuPC is the QEMU pc machine type for amd64
QemuPC = "pc"
// QemuQ35 is the QEMU Q35 machine type for amd64 // QemuQ35 is the QEMU Q35 machine type for amd64
QemuQ35 = "q35" QemuQ35 = "q35"

View File

@ -28,7 +28,7 @@ const (
) )
var qemuArchBaseMachine = govmmQemu.Machine{ var qemuArchBaseMachine = govmmQemu.Machine{
Type: "pc", Type: "q35",
} }
var qemuArchBaseQemuPaths = map[string]string{ var qemuArchBaseQemuPaths = map[string]string{
@ -143,7 +143,7 @@ func TestQemuAddDeviceToBridge(t *testing.T) {
// addDeviceToBridge successfully // addDeviceToBridge successfully
q := newQemuArchBase() q := newQemuArchBase()
q.qemuMachine.Type = QemuPC q.qemuMachine.Type = QemuQ35
q.bridges(1) q.bridges(1)
for i := uint32(1); i <= types.PCIBridgeMaxCapacity; i++ { for i := uint32(1); i <= types.PCIBridgeMaxCapacity; i++ {
@ -559,10 +559,6 @@ func TestQemuArchBaseAppendIOMMU(t *testing.T) {
CachingMode: true, CachingMode: true,
}, },
} }
// Test IOMMU is not appended to PC machine type
qemuArchBase.qemuMachine.Type = QemuPC
devices, err = qemuArchBase.appendIOMMU(devices)
assert.Error(err)
qemuArchBase.qemuMachine.Type = QemuQ35 qemuArchBase.qemuMachine.Type = QemuQ35
devices, err = qemuArchBase.appendIOMMU(devices) devices, err = qemuArchBase.appendIOMMU(devices)

View File

@ -362,7 +362,7 @@ func TestQemuQemuPath(t *testing.T) {
qemuConfig.HypervisorPath = expectedPath qemuConfig.HypervisorPath = expectedPath
qkvm := &qemuArchBase{ qkvm := &qemuArchBase{
qemuMachine: govmmQemu.Machine{ qemuMachine: govmmQemu.Machine{
Type: "pc", Type: "q35",
Options: "", Options: "",
}, },
qemuExePath: expectedPath, qemuExePath: expectedPath,