mirror of
				https://github.com/kata-containers/kata-containers.git
				synced 2025-10-31 01:13:02 +00:00 
			
		
		
		
	qemu/qmp: preparation for s390x support
This PR prepares for the s390x support. It introduces: - a generalization of ccw and pci devices. The variables for the pci devices have been renamed by removing the Pci suffix. They have been moved to the qemu_arch_base.go - the mapping isVirtioPCI has been move to qemu_arch_base.go because in this way a different mapping can be added for other architecture (e.g s390x) - the functions QemuNetdevParam and QemuDeviceParam have been moved to qemu_arch_base.go. In this way, they could be reimplemented for other architecture for the case VHOSTUSER - a function disableModern has been introduced to check if the device is a pci device and then returns the right parameters. In the case of ccw devices, they don't have the disable-modern flag - a function mqParameter has been introduced to return the right parameters for the mq case. The virtio-net-ccw device doesn't have the vectors flag - in qemu_arch_base_test.go contains the test and strings that can be overwritten for other architectures (e.g s390). The devices names and the flags for the devices can be overwritten. - the string for the romfile has been replaced by a variable romfile that could be left empty if the devices doesn't support a romfile as for the ccw devices for s390. - clean-up: the disable-modern=on/off options have been changed to disable-modern=true/false. In the code there was a mixture of on/true off/false Fixes: #61 Co-authored-by: Yash D Jain <ydjainopensource@gmail.com> Signed-off-by: Alice Frosi <afrosi@de.ibm.com>
This commit is contained in:
		
							
								
								
									
										176
									
								
								qemu/qemu.go
									
									
									
									
									
								
							
							
						
						
									
										176
									
								
								qemu/qemu.go
									
									
									
									
									
								
							| @@ -62,18 +62,9 @@ const ( | |||||||
| 	// NVDIMM is the Non Volatile DIMM device driver. | 	// NVDIMM is the Non Volatile DIMM device driver. | ||||||
| 	NVDIMM DeviceDriver = "nvdimm" | 	NVDIMM DeviceDriver = "nvdimm" | ||||||
|  |  | ||||||
| 	// Virtio9P is the 9pfs device driver. |  | ||||||
| 	Virtio9P DeviceDriver = "virtio-9p-pci" |  | ||||||
|  |  | ||||||
| 	// VirtioNet is the virt-io networking device driver. |  | ||||||
| 	VirtioNet DeviceDriver = "virtio-net" |  | ||||||
|  |  | ||||||
| 	// VirtioNetPCI is the virt-io pci networking device driver. | 	// VirtioNetPCI is the virt-io pci networking device driver. | ||||||
| 	VirtioNetPCI DeviceDriver = "virtio-net-pci" | 	VirtioNetPCI DeviceDriver = "virtio-net-pci" | ||||||
|  |  | ||||||
| 	// VirtioSerial is the serial device driver. |  | ||||||
| 	VirtioSerial DeviceDriver = "virtio-serial-pci" |  | ||||||
|  |  | ||||||
| 	// VirtioBlock is the block device driver. | 	// VirtioBlock is the block device driver. | ||||||
| 	VirtioBlock DeviceDriver = "virtio-blk" | 	VirtioBlock DeviceDriver = "virtio-blk" | ||||||
|  |  | ||||||
| @@ -83,9 +74,6 @@ const ( | |||||||
| 	// VirtioSerialPort is the serial port device driver. | 	// VirtioSerialPort is the serial port device driver. | ||||||
| 	VirtioSerialPort DeviceDriver = "virtserialport" | 	VirtioSerialPort DeviceDriver = "virtserialport" | ||||||
|  |  | ||||||
| 	// VHostVSockPCI is the vhost vsock pci driver. |  | ||||||
| 	VHostVSockPCI DeviceDriver = "vhost-vsock-pci" |  | ||||||
|  |  | ||||||
| 	// VirtioRng is the paravirtualized RNG device driver. | 	// VirtioRng is the paravirtualized RNG device driver. | ||||||
| 	VirtioRng DeviceDriver = "virtio-rng" | 	VirtioRng DeviceDriver = "virtio-rng" | ||||||
|  |  | ||||||
| @@ -101,12 +89,6 @@ const ( | |||||||
| 	//VhostUserBlk represents a block vhostuser device type. | 	//VhostUserBlk represents a block vhostuser device type. | ||||||
| 	VhostUserBlk DeviceDriver = "vhost-user-blk-pci" | 	VhostUserBlk DeviceDriver = "vhost-user-blk-pci" | ||||||
|  |  | ||||||
| 	// VfioPCI represent a VFIO device type. |  | ||||||
| 	VfioPCI DeviceDriver = "vfio-pci" |  | ||||||
|  |  | ||||||
| 	// VirtioScsiPCI represents a SCSI device type. |  | ||||||
| 	VirtioScsiPCI DeviceDriver = "virtio-scsi-pci" |  | ||||||
|  |  | ||||||
| 	// PCIBridgeDriver represents a PCI bridge device type. | 	// PCIBridgeDriver represents a PCI bridge device type. | ||||||
| 	PCIBridgeDriver DeviceDriver = "pci-bridge" | 	PCIBridgeDriver DeviceDriver = "pci-bridge" | ||||||
|  |  | ||||||
| @@ -114,27 +96,19 @@ const ( | |||||||
| 	PCIePCIBridgeDriver DeviceDriver = "pcie-pci-bridge" | 	PCIePCIBridgeDriver DeviceDriver = "pcie-pci-bridge" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // isVirtioPCI is a map indicating if a DeviceDriver is considered as a | // disableModern returns the parameters with the disable-modern option. | ||||||
| // virtio PCI device, which is helpful to determine if the option "romfile" | // In case the device driver is not a PCI device and it doesn't have the option | ||||||
| // applies or not to this specific device. | // an empty string is returned. | ||||||
| var isVirtioPCI = map[DeviceDriver]bool{ | func (driver DeviceDriver) disableModern(disable bool) string { | ||||||
| 	NVDIMM:              false, | 	if !isVirtioPCI[driver] { | ||||||
| 	Virtio9P:            true, | 		return "" | ||||||
| 	VirtioNet:           true, | 	} | ||||||
| 	VirtioNetPCI:        true, |  | ||||||
| 	VirtioSerial:        true, | 	if disable { | ||||||
| 	VirtioBlock:         true, | 		return "disable-modern=true" | ||||||
| 	Console:             false, | 	} | ||||||
| 	VirtioSerialPort:    false, |  | ||||||
| 	VHostVSockPCI:       true, | 	return "disable-modern=false" | ||||||
| 	VirtioRng:           true, |  | ||||||
| 	VirtioBalloon:       true, |  | ||||||
| 	VhostUserSCSI:       true, |  | ||||||
| 	VhostUserBlk:        true, |  | ||||||
| 	VfioPCI:             true, |  | ||||||
| 	VirtioScsiPCI:       true, |  | ||||||
| 	PCIBridgeDriver:     true, |  | ||||||
| 	PCIePCIBridgeDriver: true, |  | ||||||
| } | } | ||||||
|  |  | ||||||
| // ObjectType is a string representing a qemu object type. | // ObjectType is a string representing a qemu object type. | ||||||
| @@ -284,8 +258,8 @@ func (fsdev FSDevice) QemuParams(config *Config) []string { | |||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s", fsdev.Driver)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s", fsdev.Driver)) | ||||||
| 	if fsdev.DisableModern { | 	if s := fsdev.Driver.disableModern(fsdev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, ",disable-modern=true") | 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",fsdev=%s", fsdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf(",fsdev=%s", fsdev.ID)) | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",mount_tag=%s", fsdev.MountTag)) | 	deviceParams = append(deviceParams, fmt.Sprintf(",mount_tag=%s", fsdev.MountTag)) | ||||||
| @@ -370,8 +344,8 @@ func (cdev CharDevice) QemuParams(config *Config) []string { | |||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s", cdev.Driver)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s", cdev.Driver)) | ||||||
| 	if cdev.DisableModern { | 	if s := cdev.Driver.disableModern(cdev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, ",disable-modern=true") | 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | ||||||
| 	} | 	} | ||||||
| 	if cdev.Bus != "" { | 	if cdev.Bus != "" { | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",bus=%s", cdev.Bus)) | 		deviceParams = append(deviceParams, fmt.Sprintf(",bus=%s", cdev.Bus)) | ||||||
| @@ -425,48 +399,6 @@ const ( | |||||||
| 	VHOSTUSER NetDeviceType = "vhostuser" | 	VHOSTUSER NetDeviceType = "vhostuser" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // QemuNetdevParam converts to the QEMU -netdev parameter notation |  | ||||||
| func (n NetDeviceType) QemuNetdevParam() string { |  | ||||||
| 	switch n { |  | ||||||
| 	case TAP: |  | ||||||
| 		return "tap" |  | ||||||
| 	case MACVTAP: |  | ||||||
| 		return "tap" |  | ||||||
| 	case IPVTAP: |  | ||||||
| 		return "tap" |  | ||||||
| 	case VETHTAP: |  | ||||||
| 		return "tap" // -netdev type=tap -device virtio-net-pci |  | ||||||
| 	case VFIO: |  | ||||||
| 		return "" // -device vfio-pci (no netdev) |  | ||||||
| 	case VHOSTUSER: |  | ||||||
| 		return "vhost-user" // -netdev type=vhost-user (no device) |  | ||||||
| 	default: |  | ||||||
| 		return "" |  | ||||||
|  |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // QemuDeviceParam converts to the QEMU -device parameter notation |  | ||||||
| func (n NetDeviceType) QemuDeviceParam() DeviceDriver { |  | ||||||
| 	switch n { |  | ||||||
| 	case TAP: |  | ||||||
| 		return "virtio-net-pci" |  | ||||||
| 	case MACVTAP: |  | ||||||
| 		return "virtio-net-pci" |  | ||||||
| 	case IPVTAP: |  | ||||||
| 		return "virtio-net-pci" |  | ||||||
| 	case VETHTAP: |  | ||||||
| 		return "virtio-net-pci" // -netdev type=tap -device virtio-net-pci |  | ||||||
| 	case VFIO: |  | ||||||
| 		return "vfio-pci" // -device vfio-pci (no netdev) |  | ||||||
| 	case VHOSTUSER: |  | ||||||
| 		return "" // -netdev type=vhost-user (no device) |  | ||||||
| 	default: |  | ||||||
| 		return "" |  | ||||||
|  |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
|  |  | ||||||
| // NetDevice represents a guest networking device | // NetDevice represents a guest networking device | ||||||
| type NetDevice struct { | type NetDevice struct { | ||||||
| 	// Type is the netdev type (e.g. tap). | 	// Type is the netdev type (e.g. tap). | ||||||
| @@ -527,6 +459,29 @@ func (netdev NetDevice) Valid() bool { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // mqParameter returns the parameters for multi-queue driver. If the driver is a PCI device then the | ||||||
|  | // vector flag is required. If the driver is a CCW type than the vector flag is not implemented and only | ||||||
|  | // multi-queue option mq needs to be activated. See comment in libvirt code at | ||||||
|  | // https://github.com/libvirt/libvirt/blob/6e7e965dcd3d885739129b1454ce19e819b54c25/src/qemu/qemu_command.c#L3633 | ||||||
|  | func (netdev NetDevice) mqParameter() string { | ||||||
|  | 	p := []string{",mq=on"} | ||||||
|  |  | ||||||
|  | 	if isVirtioPCI[netdev.Driver] { | ||||||
|  | 		// https://www.linux-kvm.org/page/Multiqueue | ||||||
|  | 		// -netdev tap,vhost=on,queues=N | ||||||
|  | 		// enable mq and specify msix vectors in qemu cmdline | ||||||
|  | 		// (2N+2 vectors, N for tx queues, N for rx queues, 1 for config, and one for possible control vq) | ||||||
|  | 		// -device virtio-net-pci,mq=on,vectors=2N+2... | ||||||
|  | 		// enable mq in guest by 'ethtool -L eth0 combined $queue_num' | ||||||
|  | 		// Clearlinux automatically sets up the queues properly | ||||||
|  | 		// The agent implementation should do this to ensure that it is | ||||||
|  | 		// always set | ||||||
|  | 		vectors := len(netdev.FDs)*2 + 2 | ||||||
|  | 		p = append(p, fmt.Sprintf(",vectors=%d", vectors)) | ||||||
|  | 	} | ||||||
|  | 	return strings.Join(p, "") | ||||||
|  | } | ||||||
|  |  | ||||||
| // QemuDeviceParams returns the -device parameters for this network device | // QemuDeviceParams returns the -device parameters for this network device | ||||||
| func (netdev NetDevice) QemuDeviceParams(config *Config) []string { | func (netdev NetDevice) QemuDeviceParams(config *Config) []string { | ||||||
| 	var deviceParams []string | 	var deviceParams []string | ||||||
| @@ -549,26 +504,13 @@ func (netdev NetDevice) QemuDeviceParams(config *Config) []string { | |||||||
| 			deviceParams = append(deviceParams, fmt.Sprintf(",addr=%x", addr)) | 			deviceParams = append(deviceParams, fmt.Sprintf(",addr=%x", addr)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	if s := netdev.Driver.disableModern(netdev.DisableModern); s != "" { | ||||||
| 	if netdev.DisableModern { | 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | ||||||
| 		deviceParams = append(deviceParams, ",disable-modern=true") |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if len(netdev.FDs) > 0 { | 	if len(netdev.FDs) > 0 { | ||||||
| 		// https://www.linux-kvm.org/page/Multiqueue |  | ||||||
| 		// -netdev tap,vhost=on,queues=N |  | ||||||
| 		// enable mq and specify msix vectors in qemu cmdline |  | ||||||
| 		// (2N+2 vectors, N for tx queues, N for rx queues, 1 for config, and one for possible control vq) |  | ||||||
| 		// -device virtio-net-pci,mq=on,vectors=2N+2... |  | ||||||
| 		// enable mq in guest by 'ethtool -L eth0 combined $queue_num' |  | ||||||
| 		// Clearlinux automatically sets up the queues properly |  | ||||||
| 		// The agent implementation should do this to ensure that it is |  | ||||||
| 		// always set |  | ||||||
| 		vectors := len(netdev.FDs)*2 + 2 |  | ||||||
|  |  | ||||||
| 		// Note: We are appending to the device params here | 		// Note: We are appending to the device params here | ||||||
| 		deviceParams = append(deviceParams, ",mq=on") | 		deviceParams = append(deviceParams, netdev.mqParameter()) | ||||||
| 		deviceParams = append(deviceParams, fmt.Sprintf(",vectors=%d", vectors)) |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if isVirtioPCI[netdev.Driver] { | 	if isVirtioPCI[netdev.Driver] { | ||||||
| @@ -683,8 +625,8 @@ func (dev SerialDevice) QemuParams(config *Config) []string { | |||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s", dev.Driver)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s", dev.Driver)) | ||||||
| 	if dev.DisableModern { | 	if s := dev.Driver.disableModern(dev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, ",disable-modern=true") | 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", dev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf(",id=%s", dev.ID)) | ||||||
| 	if isVirtioPCI[dev.Driver] { | 	if isVirtioPCI[dev.Driver] { | ||||||
| @@ -761,8 +703,8 @@ func (blkdev BlockDevice) QemuParams(config *Config) []string { | |||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s", blkdev.Driver)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s", blkdev.Driver)) | ||||||
| 	if blkdev.DisableModern { | 	if s := blkdev.Driver.disableModern(blkdev.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, ",disable-modern=true") | 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | ||||||
| 	} | 	} | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf(",drive=%s", blkdev.ID)) | 	deviceParams = append(deviceParams, fmt.Sprintf(",drive=%s", blkdev.ID)) | ||||||
| 	if blkdev.SCSI == false { | 	if blkdev.SCSI == false { | ||||||
| @@ -909,7 +851,7 @@ func (vfioDev VFIODevice) QemuParams(config *Config) []string { | |||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var deviceParams []string | 	var deviceParams []string | ||||||
|  |  | ||||||
| 	driver := VfioPCI | 	driver := Vfio | ||||||
|  |  | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s,host=%s", driver, vfioDev.BDF)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s,host=%s", driver, vfioDev.BDF)) | ||||||
| 	if isVirtioPCI[driver] { | 	if isVirtioPCI[driver] { | ||||||
| @@ -956,7 +898,7 @@ func (scsiCon SCSIController) QemuParams(config *Config) []string { | |||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
| 	var devParams []string | 	var devParams []string | ||||||
|  |  | ||||||
| 	driver := VirtioScsiPCI | 	driver := VirtioScsi | ||||||
| 	devParams = append(devParams, fmt.Sprintf("%s,id=%s", driver, scsiCon.ID)) | 	devParams = append(devParams, fmt.Sprintf("%s,id=%s", driver, scsiCon.ID)) | ||||||
| 	if scsiCon.Bus != "" { | 	if scsiCon.Bus != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("bus=%s", scsiCon.Bus)) | 		devParams = append(devParams, fmt.Sprintf("bus=%s", scsiCon.Bus)) | ||||||
| @@ -964,8 +906,8 @@ func (scsiCon SCSIController) QemuParams(config *Config) []string { | |||||||
| 	if scsiCon.Addr != "" { | 	if scsiCon.Addr != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("addr=%s", scsiCon.Addr)) | 		devParams = append(devParams, fmt.Sprintf("addr=%s", scsiCon.Addr)) | ||||||
| 	} | 	} | ||||||
| 	if scsiCon.DisableModern { | 	if s := driver.disableModern(scsiCon.DisableModern); s != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("disable-modern=true")) | 		devParams = append(devParams, fmt.Sprintf("%s", s)) | ||||||
| 	} | 	} | ||||||
| 	if scsiCon.IOThread != "" { | 	if scsiCon.IOThread != "" { | ||||||
| 		devParams = append(devParams, fmt.Sprintf("iothread=%s", scsiCon.IOThread)) | 		devParams = append(devParams, fmt.Sprintf("iothread=%s", scsiCon.IOThread)) | ||||||
| @@ -1087,7 +1029,9 @@ type VSOCKDevice struct { | |||||||
| const ( | const ( | ||||||
| 	// MinimalGuestCID is the smallest valid context ID for a guest. | 	// MinimalGuestCID is the smallest valid context ID for a guest. | ||||||
| 	MinimalGuestCID uint32 = 3 | 	MinimalGuestCID uint32 = 3 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | const ( | ||||||
| 	// VSOCKGuestCID is the VSOCK guest CID parameter. | 	// VSOCKGuestCID is the VSOCK guest CID parameter. | ||||||
| 	VSOCKGuestCID = "guest-cid" | 	VSOCKGuestCID = "guest-cid" | ||||||
| ) | ) | ||||||
| @@ -1106,10 +1050,10 @@ func (vsock VSOCKDevice) QemuParams(config *Config) []string { | |||||||
| 	var deviceParams []string | 	var deviceParams []string | ||||||
| 	var qemuParams []string | 	var qemuParams []string | ||||||
|  |  | ||||||
| 	driver := VHostVSockPCI | 	driver := VHostVSock | ||||||
| 	deviceParams = append(deviceParams, fmt.Sprintf("%s", driver)) | 	deviceParams = append(deviceParams, fmt.Sprintf("%s", driver)) | ||||||
| 	if vsock.DisableModern { | 	if s := driver.disableModern(vsock.DisableModern); s != "" { | ||||||
| 		deviceParams = append(deviceParams, ",disable-modern=true") | 		deviceParams = append(deviceParams, fmt.Sprintf(",%s", s)) | ||||||
| 	} | 	} | ||||||
| 	if vsock.VHostFD != nil { | 	if vsock.VHostFD != nil { | ||||||
| 		qemuFDs := config.appendFDs([]*os.File{vsock.VHostFD}) | 		qemuFDs := config.appendFDs([]*os.File{vsock.VHostFD}) | ||||||
| @@ -1223,13 +1167,9 @@ func (b BalloonDevice) QemuParams(_ *Config) []string { | |||||||
| 	} else { | 	} else { | ||||||
| 		deviceParams = append(deviceParams, "deflate-on-oom=off") | 		deviceParams = append(deviceParams, "deflate-on-oom=off") | ||||||
| 	} | 	} | ||||||
|  | 	if s := driver.disableModern(b.DisableModern); s != "" { | ||||||
| 	if b.DisableModern { | 		deviceParams = append(deviceParams, fmt.Sprintf("%s", s)) | ||||||
| 		deviceParams = append(deviceParams, "disable-modern=on") |  | ||||||
| 	} else { |  | ||||||
| 		deviceParams = append(deviceParams, "disable-modern=off") |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	qemuParams = append(qemuParams, "-device") | 	qemuParams = append(qemuParams, "-device") | ||||||
| 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | 	qemuParams = append(qemuParams, strings.Join(deviceParams, ",")) | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										103
									
								
								qemu/qemu_arch_base.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								qemu/qemu_arch_base.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | |||||||
|  | // +build !s390x | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | // Copyright (c) 2016 Intel Corporation | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package qemu | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	// Virtio9P is the 9pfs device driver. | ||||||
|  | 	Virtio9P DeviceDriver = "virtio-9p-pci" | ||||||
|  |  | ||||||
|  | 	// VirtioSerial is the serial device driver. | ||||||
|  | 	VirtioSerial DeviceDriver = "virtio-serial-pci" | ||||||
|  |  | ||||||
|  | 	// VirtioNet is the virt-io pci networking device driver. | ||||||
|  | 	VirtioNet DeviceDriver = VirtioNetPCI | ||||||
|  |  | ||||||
|  | 	// Vfio is the vfio driver | ||||||
|  | 	Vfio DeviceDriver = "vfio-pci" | ||||||
|  |  | ||||||
|  | 	// VirtioScsi is the virtio-scsi device | ||||||
|  | 	VirtioScsi DeviceDriver = "virtio-scsi-pci" | ||||||
|  |  | ||||||
|  | 	// VHostVSock is a generic Vsock vhost device | ||||||
|  | 	VHostVSock DeviceDriver = "vhost-vsock-pci" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // isVirtioPCI is a map indicating if a DeviceDriver is considered as a | ||||||
|  | // virtio PCI device, which is helpful to determine if the option "romfile" | ||||||
|  | // applies or not to this specific device. | ||||||
|  | var isVirtioPCI = map[DeviceDriver]bool{ | ||||||
|  | 	NVDIMM:              false, | ||||||
|  | 	Virtio9P:            true, | ||||||
|  | 	VirtioNetPCI:        true, | ||||||
|  | 	VirtioSerial:        true, | ||||||
|  | 	VirtioBlock:         true, | ||||||
|  | 	Console:             false, | ||||||
|  | 	VirtioSerialPort:    false, | ||||||
|  | 	VHostVSock:          true, | ||||||
|  | 	VirtioRng:           true, | ||||||
|  | 	VirtioBalloon:       true, | ||||||
|  | 	VhostUserSCSI:       true, | ||||||
|  | 	VhostUserBlk:        true, | ||||||
|  | 	Vfio:                true, | ||||||
|  | 	VirtioScsi:          true, | ||||||
|  | 	PCIBridgeDriver:     true, | ||||||
|  | 	PCIePCIBridgeDriver: true, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // QemuNetdevParam converts to the QEMU -netdev parameter notation | ||||||
|  | func (n NetDeviceType) QemuNetdevParam() string { | ||||||
|  | 	switch n { | ||||||
|  | 	case TAP: | ||||||
|  | 		return "tap" | ||||||
|  | 	case MACVTAP: | ||||||
|  | 		return "tap" | ||||||
|  | 	case IPVTAP: | ||||||
|  | 		return "tap" | ||||||
|  | 	case VETHTAP: | ||||||
|  | 		return "tap" // -netdev type=tap -device virtio-net-pci | ||||||
|  | 	case VFIO: | ||||||
|  | 		return "" // -device vfio-pci (no netdev) | ||||||
|  | 	case VHOSTUSER: | ||||||
|  | 		return "vhost-user" // -netdev type=vhost-user (no device) | ||||||
|  | 	default: | ||||||
|  | 		return "" | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // QemuDeviceParam converts to the QEMU -device parameter notation | ||||||
|  | func (n NetDeviceType) QemuDeviceParam() DeviceDriver { | ||||||
|  | 	switch n { | ||||||
|  | 	case TAP: | ||||||
|  | 		return "virtio-net-pci" | ||||||
|  | 	case MACVTAP: | ||||||
|  | 		return "virtio-net-pci" | ||||||
|  | 	case IPVTAP: | ||||||
|  | 		return "virtio-net-pci" | ||||||
|  | 	case VETHTAP: | ||||||
|  | 		return "virtio-net-pci" // -netdev type=tap -device virtio-net-pci | ||||||
|  | 	case VFIO: | ||||||
|  | 		return "vfio-pci" // -device vfio-pci (no netdev) | ||||||
|  | 	case VHOSTUSER: | ||||||
|  | 		return "" // -netdev type=vhost-user (no device) | ||||||
|  | 	default: | ||||||
|  | 		return "" | ||||||
|  |  | ||||||
|  | 	} | ||||||
|  | } | ||||||
							
								
								
									
										99
									
								
								qemu/qemu_arch_base_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								qemu/qemu_arch_base_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | |||||||
|  | // +build !s390x | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | // Copyright (c) 2016 Intel Corporation | ||||||
|  | // | ||||||
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | ||||||
|  | // you may not use this file except in compliance with the License. | ||||||
|  | // You may obtain a copy of the License at | ||||||
|  | // | ||||||
|  | //      http://www.apache.org/licenses/LICENSE-2.0 | ||||||
|  | // | ||||||
|  | // Unless required by applicable law or agreed to in writing, software | ||||||
|  | // distributed under the License is distributed on an "AS IS" BASIS, | ||||||
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  | // See the License for the specific language governing permissions and | ||||||
|  | // limitations under the License. | ||||||
|  | */ | ||||||
|  |  | ||||||
|  | package qemu | ||||||
|  |  | ||||||
|  | import "testing" | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	deviceFSString                 = "-device virtio-9p-pci,disable-modern=true,fsdev=workload9p,mount_tag=rootfs,romfile=efi-virtio.rom -fsdev local,id=workload9p,path=/var/lib/docker/devicemapper/mnt/e31ebda2,security_model=none" | ||||||
|  | 	deviceNetworkString            = "-netdev tap,id=tap0,vhost=on,ifname=ceth0,downscript=no,script=no -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,disable-modern=true,romfile=efi-virtio.rom" | ||||||
|  | 	deviceNetworkStringMq          = "-netdev tap,id=tap0,vhost=on,fds=3:4 -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,disable-modern=true,mq=on,vectors=6,romfile=efi-virtio.rom" | ||||||
|  | 	deviceNetworkPCIString         = "-netdev tap,id=tap0,vhost=on,ifname=ceth0,downscript=no,script=no -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,bus=/pci-bus/pcie.0,addr=ff,disable-modern=true,romfile=efi-virtio.rom" | ||||||
|  | 	deviceNetworkPCIStringMq       = "-netdev tap,id=tap0,vhost=on,fds=3:4 -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,bus=/pci-bus/pcie.0,addr=ff,disable-modern=true,mq=on,vectors=6,romfile=efi-virtio.rom" | ||||||
|  | 	deviceSerialString             = "-device virtio-serial-pci,disable-modern=true,id=serial0,romfile=efi-virtio.rom" | ||||||
|  | 	deviceVhostUserNetString       = "-chardev socket,id=char1,path=/tmp/nonexistentsocket.socket -netdev type=vhost-user,id=net1,chardev=char1,vhostforce -device virtio-net-pci,netdev=net1,mac=00:11:22:33:44:55,romfile=efi-virtio.rom" | ||||||
|  | 	deviceVSOCKString              = "-device vhost-vsock-pci,disable-modern=true,id=vhost-vsock-pci0,guest-cid=4,romfile=efi-virtio.rom" | ||||||
|  | 	deviceVFIOString               = "-device vfio-pci,host=02:10.0,romfile=efi-virtio.rom" | ||||||
|  | 	deviceSCSIControllerStr        = "-device virtio-scsi-pci,id=foo,disable-modern=false,romfile=efi-virtio.rom" | ||||||
|  | 	deviceSCSIControllerBusAddrStr = "-device virtio-scsi-pci,id=foo,bus=pci.0,addr=00:04.0,disable-modern=true,iothread=iothread1,romfile=efi-virtio.rom" | ||||||
|  | 	deviceVhostUserSCSIString      = "-chardev socket,id=char1,path=/tmp/nonexistentsocket.socket -device vhost-user-scsi-pci,id=scsi1,chardev=char1,romfile=efi-virtio.rom" | ||||||
|  | 	deviceVhostUserBlkString       = "-chardev socket,id=char2,path=/tmp/nonexistentsocket.socket -device vhost-user-blk-pci,logical_block_size=4096,size=512M,chardev=char2,romfile=efi-virtio.rom" | ||||||
|  | 	deviceBlockString              = "-device virtio-blk,disable-modern=true,drive=hd0,scsi=off,config-wce=off,romfile=efi-virtio.rom -drive id=hd0,file=/var/lib/vm.img,aio=threads,format=qcow2,if=none" | ||||||
|  | 	devicePCIBridgeString          = "-device pci-bridge,bus=/pci-bus/pcie.0,id=mybridge,chassis_nr=5,shpc=on,addr=ff,romfile=efi-virtio.rom" | ||||||
|  | 	devicePCIEBridgeString         = "-device pcie-pci-bridge,bus=/pci-bus/pcie.0,id=mybridge,addr=ff,romfile=efi-virtio.rom" | ||||||
|  | 	romfile                        = "efi-virtio.rom" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | func TestAppendDeviceVhostUser(t *testing.T) { | ||||||
|  |  | ||||||
|  | 	vhostuserBlkDevice := VhostUserDevice{ | ||||||
|  | 		SocketPath:    "/tmp/nonexistentsocket.socket", | ||||||
|  | 		CharDevID:     "char2", | ||||||
|  | 		TypeDevID:     "", | ||||||
|  | 		Address:       "", | ||||||
|  | 		VhostUserType: VhostUserBlk, | ||||||
|  | 		ROMFile:       romfile, | ||||||
|  | 	} | ||||||
|  | 	testAppend(vhostuserBlkDevice, deviceVhostUserBlkString, t) | ||||||
|  |  | ||||||
|  | 	vhostuserSCSIDevice := VhostUserDevice{ | ||||||
|  | 		SocketPath:    "/tmp/nonexistentsocket.socket", | ||||||
|  | 		CharDevID:     "char1", | ||||||
|  | 		TypeDevID:     "scsi1", | ||||||
|  | 		Address:       "", | ||||||
|  | 		VhostUserType: VhostUserSCSI, | ||||||
|  | 		ROMFile:       romfile, | ||||||
|  | 	} | ||||||
|  | 	testAppend(vhostuserSCSIDevice, deviceVhostUserSCSIString, t) | ||||||
|  |  | ||||||
|  | 	vhostuserNetDevice := VhostUserDevice{ | ||||||
|  | 		SocketPath:    "/tmp/nonexistentsocket.socket", | ||||||
|  | 		CharDevID:     "char1", | ||||||
|  | 		TypeDevID:     "net1", | ||||||
|  | 		Address:       "00:11:22:33:44:55", | ||||||
|  | 		VhostUserType: VhostUserNet, | ||||||
|  | 		ROMFile:       romfile, | ||||||
|  | 	} | ||||||
|  | 	testAppend(vhostuserNetDevice, deviceVhostUserNetString, t) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func TestAppendVirtioBalloon(t *testing.T) { | ||||||
|  | 	balloonDevice := BalloonDevice{ | ||||||
|  | 		ID:      "balloon", | ||||||
|  | 		ROMFile: romfile, | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	var deviceString = "-device " + string(VirtioBalloon) | ||||||
|  | 	deviceString += ",id=" + balloonDevice.ID + ",romfile=" + balloonDevice.ROMFile | ||||||
|  |  | ||||||
|  | 	var OnDeflateOnOMM = ",deflate-on-oom=on" | ||||||
|  | 	var OffDeflateOnOMM = ",deflate-on-oom=off" | ||||||
|  |  | ||||||
|  | 	var OnDisableModern = ",disable-modern=true" | ||||||
|  | 	var OffDisableModern = ",disable-modern=false" | ||||||
|  |  | ||||||
|  | 	testAppend(balloonDevice, deviceString+OffDeflateOnOMM+OffDisableModern, t) | ||||||
|  |  | ||||||
|  | 	balloonDevice.DeflateOnOOM = true | ||||||
|  | 	testAppend(balloonDevice, deviceString+OnDeflateOnOMM+OffDisableModern, t) | ||||||
|  |  | ||||||
|  | 	balloonDevice.DisableModern = true | ||||||
|  | 	testAppend(balloonDevice, deviceString+OnDeflateOnOMM+OnDisableModern, t) | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -126,8 +126,6 @@ func TestAppendDeviceNVDIMM(t *testing.T) { | |||||||
| 	testAppend(object, deviceNVDIMMString, t) | 	testAppend(object, deviceNVDIMMString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceFSString = "-device virtio-9p-pci,disable-modern=true,fsdev=workload9p,mount_tag=rootfs,romfile=efi-virtio.rom -fsdev local,id=workload9p,path=/var/lib/docker/devicemapper/mnt/e31ebda2,security_model=none" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceFS(t *testing.T) { | func TestAppendDeviceFS(t *testing.T) { | ||||||
| 	fsdev := FSDevice{ | 	fsdev := FSDevice{ | ||||||
| 		Driver:        Virtio9P, | 		Driver:        Virtio9P, | ||||||
| @@ -143,8 +141,6 @@ func TestAppendDeviceFS(t *testing.T) { | |||||||
| 	testAppend(fsdev, deviceFSString, t) | 	testAppend(fsdev, deviceFSString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceNetworkString = "-netdev tap,id=tap0,vhost=on,ifname=ceth0,downscript=no,script=no -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,disable-modern=true,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceNetwork(t *testing.T) { | func TestAppendDeviceNetwork(t *testing.T) { | ||||||
| 	netdev := NetDevice{ | 	netdev := NetDevice{ | ||||||
| 		Driver:        VirtioNet, | 		Driver:        VirtioNet, | ||||||
| @@ -162,8 +158,6 @@ func TestAppendDeviceNetwork(t *testing.T) { | |||||||
| 	testAppend(netdev, deviceNetworkString, t) | 	testAppend(netdev, deviceNetworkString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceNetworkStringMq = "-netdev tap,id=tap0,vhost=on,fds=3:4 -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,disable-modern=true,mq=on,vectors=6,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceNetworkMq(t *testing.T) { | func TestAppendDeviceNetworkMq(t *testing.T) { | ||||||
| 	foo, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | 	foo, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | ||||||
| 	bar, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | 	bar, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | ||||||
| @@ -192,12 +186,10 @@ func TestAppendDeviceNetworkMq(t *testing.T) { | |||||||
| 	testAppend(netdev, deviceNetworkStringMq, t) | 	testAppend(netdev, deviceNetworkStringMq, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceNetworkPCIString = "-netdev tap,id=tap0,vhost=on,ifname=ceth0,downscript=no,script=no -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,bus=/pci-bus/pcie.0,addr=ff,disable-modern=true,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceNetworkPCI(t *testing.T) { | func TestAppendDeviceNetworkPCI(t *testing.T) { | ||||||
|  |  | ||||||
| 	netdev := NetDevice{ | 	netdev := NetDevice{ | ||||||
| 		Driver:        VirtioNetPCI, | 		Driver:        VirtioNet, | ||||||
| 		Type:          TAP, | 		Type:          TAP, | ||||||
| 		ID:            "tap0", | 		ID:            "tap0", | ||||||
| 		IFName:        "ceth0", | 		IFName:        "ceth0", | ||||||
| @@ -208,14 +200,12 @@ func TestAppendDeviceNetworkPCI(t *testing.T) { | |||||||
| 		VHost:         true, | 		VHost:         true, | ||||||
| 		MACAddress:    "01:02:de:ad:be:ef", | 		MACAddress:    "01:02:de:ad:be:ef", | ||||||
| 		DisableModern: true, | 		DisableModern: true, | ||||||
| 		ROMFile:       "efi-virtio.rom", | 		ROMFile:       romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(netdev, deviceNetworkPCIString, t) | 	testAppend(netdev, deviceNetworkPCIString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceNetworkPCIStringMq = "-netdev tap,id=tap0,vhost=on,fds=3:4 -device driver=virtio-net-pci,netdev=tap0,mac=01:02:de:ad:be:ef,bus=/pci-bus/pcie.0,addr=ff,disable-modern=true,mq=on,vectors=6,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceNetworkPCIMq(t *testing.T) { | func TestAppendDeviceNetworkPCIMq(t *testing.T) { | ||||||
| 	foo, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | 	foo, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | ||||||
| 	bar, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | 	bar, _ := ioutil.TempFile(os.TempDir(), "govmm-qemu-test") | ||||||
| @@ -228,7 +218,7 @@ func TestAppendDeviceNetworkPCIMq(t *testing.T) { | |||||||
| 	}() | 	}() | ||||||
|  |  | ||||||
| 	netdev := NetDevice{ | 	netdev := NetDevice{ | ||||||
| 		Driver:        VirtioNetPCI, | 		Driver:        VirtioNet, | ||||||
| 		Type:          TAP, | 		Type:          TAP, | ||||||
| 		ID:            "tap0", | 		ID:            "tap0", | ||||||
| 		IFName:        "ceth0", | 		IFName:        "ceth0", | ||||||
| @@ -240,20 +230,18 @@ func TestAppendDeviceNetworkPCIMq(t *testing.T) { | |||||||
| 		VHost:         true, | 		VHost:         true, | ||||||
| 		MACAddress:    "01:02:de:ad:be:ef", | 		MACAddress:    "01:02:de:ad:be:ef", | ||||||
| 		DisableModern: true, | 		DisableModern: true, | ||||||
| 		ROMFile:       "efi-virtio.rom", | 		ROMFile:       romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(netdev, deviceNetworkPCIStringMq, t) | 	testAppend(netdev, deviceNetworkPCIStringMq, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceSerialString = "-device virtio-serial-pci,disable-modern=true,id=serial0,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceSerial(t *testing.T) { | func TestAppendDeviceSerial(t *testing.T) { | ||||||
| 	sdev := SerialDevice{ | 	sdev := SerialDevice{ | ||||||
| 		Driver:        VirtioSerial, | 		Driver:        VirtioSerial, | ||||||
| 		ID:            "serial0", | 		ID:            "serial0", | ||||||
| 		DisableModern: true, | 		DisableModern: true, | ||||||
| 		ROMFile:       "efi-virtio.rom", | 		ROMFile:       romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(sdev, deviceSerialString, t) | 	testAppend(sdev, deviceSerialString, t) | ||||||
| @@ -274,8 +262,6 @@ func TestAppendDeviceSerialPort(t *testing.T) { | |||||||
| 	testAppend(chardev, deviceSerialPortString, t) | 	testAppend(chardev, deviceSerialPortString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceBlockString = "-device virtio-blk,disable-modern=true,drive=hd0,scsi=off,config-wce=off,romfile=efi-virtio.rom -drive id=hd0,file=/var/lib/vm.img,aio=threads,format=qcow2,if=none" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceBlock(t *testing.T) { | func TestAppendDeviceBlock(t *testing.T) { | ||||||
| 	blkdev := BlockDevice{ | 	blkdev := BlockDevice{ | ||||||
| 		Driver:        VirtioBlock, | 		Driver:        VirtioBlock, | ||||||
| @@ -287,69 +273,28 @@ func TestAppendDeviceBlock(t *testing.T) { | |||||||
| 		SCSI:          false, | 		SCSI:          false, | ||||||
| 		WCE:           false, | 		WCE:           false, | ||||||
| 		DisableModern: true, | 		DisableModern: true, | ||||||
| 		ROMFile:       "efi-virtio.rom", | 		ROMFile:       romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(blkdev, deviceBlockString, t) | 	testAppend(blkdev, deviceBlockString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceVhostUserNetString = "-chardev socket,id=char1,path=/tmp/nonexistentsocket.socket -netdev type=vhost-user,id=net1,chardev=char1,vhostforce -device virtio-net-pci,netdev=net1,mac=00:11:22:33:44:55,romfile=efi-virtio.rom" |  | ||||||
| var deviceVhostUserSCSIString = "-chardev socket,id=char1,path=/tmp/nonexistentsocket.socket -device vhost-user-scsi-pci,id=scsi1,chardev=char1,romfile=efi-virtio.rom" |  | ||||||
| var deviceVhostUserBlkString = "-chardev socket,id=char2,path=/tmp/nonexistentsocket.socket -device vhost-user-blk-pci,logical_block_size=4096,size=512M,chardev=char2,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceVhostUser(t *testing.T) { |  | ||||||
|  |  | ||||||
| 	vhostuserBlkDevice := VhostUserDevice{ |  | ||||||
| 		SocketPath:    "/tmp/nonexistentsocket.socket", |  | ||||||
| 		CharDevID:     "char2", |  | ||||||
| 		TypeDevID:     "", |  | ||||||
| 		Address:       "", |  | ||||||
| 		VhostUserType: VhostUserBlk, |  | ||||||
| 		ROMFile:       "efi-virtio.rom", |  | ||||||
| 	} |  | ||||||
| 	testAppend(vhostuserBlkDevice, deviceVhostUserBlkString, t) |  | ||||||
|  |  | ||||||
| 	vhostuserSCSIDevice := VhostUserDevice{ |  | ||||||
| 		SocketPath:    "/tmp/nonexistentsocket.socket", |  | ||||||
| 		CharDevID:     "char1", |  | ||||||
| 		TypeDevID:     "scsi1", |  | ||||||
| 		Address:       "", |  | ||||||
| 		VhostUserType: VhostUserSCSI, |  | ||||||
| 		ROMFile:       "efi-virtio.rom", |  | ||||||
| 	} |  | ||||||
| 	testAppend(vhostuserSCSIDevice, deviceVhostUserSCSIString, t) |  | ||||||
|  |  | ||||||
| 	vhostuserNetDevice := VhostUserDevice{ |  | ||||||
| 		SocketPath:    "/tmp/nonexistentsocket.socket", |  | ||||||
| 		CharDevID:     "char1", |  | ||||||
| 		TypeDevID:     "net1", |  | ||||||
| 		Address:       "00:11:22:33:44:55", |  | ||||||
| 		VhostUserType: VhostUserNet, |  | ||||||
| 		ROMFile:       "efi-virtio.rom", |  | ||||||
| 	} |  | ||||||
| 	testAppend(vhostuserNetDevice, deviceVhostUserNetString, t) |  | ||||||
| } |  | ||||||
|  |  | ||||||
| var deviceVFIOString = "-device vfio-pci,host=02:10.0,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceVFIO(t *testing.T) { | func TestAppendDeviceVFIO(t *testing.T) { | ||||||
| 	vfioDevice := VFIODevice{ | 	vfioDevice := VFIODevice{ | ||||||
| 		BDF:     "02:10.0", | 		BDF:     "02:10.0", | ||||||
| 		ROMFile: "efi-virtio.rom", | 		ROMFile: romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(vfioDevice, deviceVFIOString, t) | 	testAppend(vfioDevice, deviceVFIOString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceVSOCKString = "-device vhost-vsock-pci,disable-modern=true,id=vhost-vsock-pci0,guest-cid=4,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendVSOCK(t *testing.T) { | func TestAppendVSOCK(t *testing.T) { | ||||||
| 	vsockDevice := VSOCKDevice{ | 	vsockDevice := VSOCKDevice{ | ||||||
| 		ID:            "vhost-vsock-pci0", | 		ID:            "vhost-vsock-pci0", | ||||||
| 		ContextID:     4, | 		ContextID:     4, | ||||||
| 		VHostFD:       nil, | 		VHostFD:       nil, | ||||||
| 		DisableModern: true, | 		DisableModern: true, | ||||||
| 		ROMFile:       "efi-virtio.rom", | 		ROMFile:       romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(vsockDevice, deviceVSOCKString, t) | 	testAppend(vsockDevice, deviceVSOCKString, t) | ||||||
| @@ -376,10 +321,13 @@ func TestVSOCKValid(t *testing.T) { | |||||||
|  |  | ||||||
| func TestAppendVirtioRng(t *testing.T) { | func TestAppendVirtioRng(t *testing.T) { | ||||||
| 	var objectString = "-object rng-random,id=rng0" | 	var objectString = "-object rng-random,id=rng0" | ||||||
| 	var deviceString = "-device " + string(VirtioRng) + ",rng=rng0,romfile=efi-virtio.rom" | 	var deviceString = "-device " + string(VirtioRng) + ",rng=rng0" | ||||||
|  | 	if romfile != "" { | ||||||
|  | 		deviceString = deviceString + ",romfile=efi-virtio.rom" | ||||||
|  | 	} | ||||||
| 	rngDevice := RngDevice{ | 	rngDevice := RngDevice{ | ||||||
| 		ID:      "rng0", | 		ID:      "rng0", | ||||||
| 		ROMFile: "efi-virtio.rom", | 		ROMFile: romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(rngDevice, objectString+" "+deviceString, t) | 	testAppend(rngDevice, objectString+" "+deviceString, t) | ||||||
| @@ -417,31 +365,6 @@ func TestVirtioRngValid(t *testing.T) { | |||||||
|  |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func TestAppendVirtioBalloon(t *testing.T) { |  | ||||||
| 	balloonDevice := BalloonDevice{ |  | ||||||
| 		ID:      "balloon", |  | ||||||
| 		ROMFile: "efi-virtio.rom", |  | ||||||
| 	} |  | ||||||
|  |  | ||||||
| 	var deviceString = "-device " + string(VirtioBalloon) |  | ||||||
| 	deviceString += ",id=" + balloonDevice.ID + ",romfile=" + balloonDevice.ROMFile |  | ||||||
|  |  | ||||||
| 	var OnDeflateOnOMM = ",deflate-on-oom=on" |  | ||||||
| 	var OffDeflateOnOMM = ",deflate-on-oom=off" |  | ||||||
|  |  | ||||||
| 	var OnDisableModern = ",disable-modern=on" |  | ||||||
| 	var OffDisableModern = ",disable-modern=off" |  | ||||||
|  |  | ||||||
| 	testAppend(balloonDevice, deviceString+OffDeflateOnOMM+OffDisableModern, t) |  | ||||||
|  |  | ||||||
| 	balloonDevice.DeflateOnOOM = true |  | ||||||
| 	testAppend(balloonDevice, deviceString+OnDeflateOnOMM+OffDisableModern, t) |  | ||||||
|  |  | ||||||
| 	balloonDevice.DisableModern = true |  | ||||||
| 	testAppend(balloonDevice, deviceString+OnDeflateOnOMM+OnDisableModern, t) |  | ||||||
|  |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func TestVirtioBalloonValid(t *testing.T) { | func TestVirtioBalloonValid(t *testing.T) { | ||||||
| 	balloon := BalloonDevice{ | 	balloon := BalloonDevice{ | ||||||
| 		ID: "", | 		ID: "", | ||||||
| @@ -457,13 +380,10 @@ func TestVirtioBalloonValid(t *testing.T) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
| var deviceSCSIControllerStr = "-device virtio-scsi-pci,id=foo,romfile=efi-virtio.rom" |  | ||||||
| var deviceSCSIControllerBusAddrStr = "-device virtio-scsi-pci,id=foo,bus=pci.0,addr=00:04.0,disable-modern=true,iothread=iothread1,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendDeviceSCSIController(t *testing.T) { | func TestAppendDeviceSCSIController(t *testing.T) { | ||||||
| 	scsiCon := SCSIController{ | 	scsiCon := SCSIController{ | ||||||
| 		ID:      "foo", | 		ID:      "foo", | ||||||
| 		ROMFile: "efi-virtio.rom", | 		ROMFile: romfile, | ||||||
| 	} | 	} | ||||||
| 	testAppend(scsiCon, deviceSCSIControllerStr, t) | 	testAppend(scsiCon, deviceSCSIControllerStr, t) | ||||||
|  |  | ||||||
| @@ -474,8 +394,6 @@ func TestAppendDeviceSCSIController(t *testing.T) { | |||||||
| 	testAppend(scsiCon, deviceSCSIControllerBusAddrStr, t) | 	testAppend(scsiCon, deviceSCSIControllerBusAddrStr, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var devicePCIBridgeString = "-device pci-bridge,bus=/pci-bus/pcie.0,id=mybridge,chassis_nr=5,shpc=on,addr=ff,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendPCIBridgeDevice(t *testing.T) { | func TestAppendPCIBridgeDevice(t *testing.T) { | ||||||
|  |  | ||||||
| 	bridge := BridgeDevice{ | 	bridge := BridgeDevice{ | ||||||
| @@ -485,14 +403,12 @@ func TestAppendPCIBridgeDevice(t *testing.T) { | |||||||
| 		Addr:    "255", | 		Addr:    "255", | ||||||
| 		Chassis: 5, | 		Chassis: 5, | ||||||
| 		SHPC:    true, | 		SHPC:    true, | ||||||
| 		ROMFile: "efi-virtio.rom", | 		ROMFile: romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	testAppend(bridge, devicePCIBridgeString, t) | 	testAppend(bridge, devicePCIBridgeString, t) | ||||||
| } | } | ||||||
|  |  | ||||||
| var devicePCIEBridgeString = "-device pcie-pci-bridge,bus=/pci-bus/pcie.0,id=mybridge,addr=ff,romfile=efi-virtio.rom" |  | ||||||
|  |  | ||||||
| func TestAppendPCIEBridgeDevice(t *testing.T) { | func TestAppendPCIEBridgeDevice(t *testing.T) { | ||||||
|  |  | ||||||
| 	bridge := BridgeDevice{ | 	bridge := BridgeDevice{ | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								qemu/qmp.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								qemu/qmp.go
									
									
									
									
									
								
							| @@ -991,7 +991,7 @@ func (q *QMP) ExecutePCIDeviceAdd(ctx context.Context, blockdevID, devID, driver | |||||||
| func (q *QMP) ExecuteVFIODeviceAdd(ctx context.Context, devID, bdf, romfile string) error { | func (q *QMP) ExecuteVFIODeviceAdd(ctx context.Context, devID, bdf, romfile string) error { | ||||||
| 	args := map[string]interface{}{ | 	args := map[string]interface{}{ | ||||||
| 		"id":      devID, | 		"id":      devID, | ||||||
| 		"driver":  "vfio-pci", | 		"driver":  Vfio, | ||||||
| 		"host":    bdf, | 		"host":    bdf, | ||||||
| 		"romfile": romfile, | 		"romfile": romfile, | ||||||
| 	} | 	} | ||||||
| @@ -1006,11 +1006,12 @@ func (q *QMP) ExecuteVFIODeviceAdd(ctx context.Context, devID, bdf, romfile stri | |||||||
| func (q *QMP) ExecutePCIVFIODeviceAdd(ctx context.Context, devID, bdf, addr, bus, romfile string) error { | func (q *QMP) ExecutePCIVFIODeviceAdd(ctx context.Context, devID, bdf, addr, bus, romfile string) error { | ||||||
| 	args := map[string]interface{}{ | 	args := map[string]interface{}{ | ||||||
| 		"id":      devID, | 		"id":      devID, | ||||||
| 		"driver":  "vfio-pci", | 		"driver":  Vfio, | ||||||
| 		"host":    bdf, | 		"host":    bdf, | ||||||
| 		"addr":    addr, | 		"addr":    addr, | ||||||
| 		"romfile": romfile, | 		"romfile": romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if bus != "" { | 	if bus != "" { | ||||||
| 		args["bus"] = bus | 		args["bus"] = bus | ||||||
| 	} | 	} | ||||||
| @@ -1025,10 +1026,11 @@ func (q *QMP) ExecutePCIVFIODeviceAdd(ctx context.Context, devID, bdf, addr, bus | |||||||
| func (q *QMP) ExecutePCIVFIOMediatedDeviceAdd(ctx context.Context, devID, sysfsdev, addr, bus, romfile string) error { | func (q *QMP) ExecutePCIVFIOMediatedDeviceAdd(ctx context.Context, devID, sysfsdev, addr, bus, romfile string) error { | ||||||
| 	args := map[string]interface{}{ | 	args := map[string]interface{}{ | ||||||
| 		"id":       devID, | 		"id":       devID, | ||||||
| 		"driver":   "vfio-pci", | 		"driver":   Vfio, | ||||||
| 		"sysfsdev": sysfsdev, | 		"sysfsdev": sysfsdev, | ||||||
| 		"romfile":  romfile, | 		"romfile":  romfile, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if bus != "" { | 	if bus != "" { | ||||||
| 		args["bus"] = bus | 		args["bus"] = bus | ||||||
| 	} | 	} | ||||||
| @@ -1215,7 +1217,7 @@ func (q *QMP) ExecuteBalloon(ctx context.Context, bytes uint64) error { | |||||||
| // ExecutePCIVSockAdd adds a vhost-vsock-pci bus | // ExecutePCIVSockAdd adds a vhost-vsock-pci bus | ||||||
| func (q *QMP) ExecutePCIVSockAdd(ctx context.Context, id, guestCID, vhostfd, addr, bus, romfile string, disableModern bool) error { | func (q *QMP) ExecutePCIVSockAdd(ctx context.Context, id, guestCID, vhostfd, addr, bus, romfile string, disableModern bool) error { | ||||||
| 	args := map[string]interface{}{ | 	args := map[string]interface{}{ | ||||||
| 		"driver":    VHostVSockPCI, | 		"driver":    VHostVSock, | ||||||
| 		"id":        id, | 		"id":        id, | ||||||
| 		"guest-cid": guestCID, | 		"guest-cid": guestCID, | ||||||
| 		"vhostfd":   vhostfd, | 		"vhostfd":   vhostfd, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user