mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-20 08:18:24 +00:00
Merge pull request #14 from amshinde/scsi-iothreads
Add ability to associate a SCSI controller device with an iothread
This commit is contained in:
23
qemu/qemu.go
23
qemu/qemu.go
@@ -841,6 +841,9 @@ type SCSIController struct {
|
|||||||
|
|
||||||
// DisableModern prevents qemu from relying on fast MMIO.
|
// DisableModern prevents qemu from relying on fast MMIO.
|
||||||
DisableModern bool
|
DisableModern bool
|
||||||
|
|
||||||
|
// IOThread is the IO thread on which IO will be handled
|
||||||
|
IOThread string
|
||||||
}
|
}
|
||||||
|
|
||||||
// Valid returns true if the SCSIController structure is valid and complete.
|
// Valid returns true if the SCSIController structure is valid and complete.
|
||||||
@@ -867,6 +870,9 @@ func (scsiCon SCSIController) QemuParams(config *Config) []string {
|
|||||||
if scsiCon.DisableModern {
|
if scsiCon.DisableModern {
|
||||||
devParams = append(devParams, fmt.Sprintf("disable-modern=true"))
|
devParams = append(devParams, fmt.Sprintf("disable-modern=true"))
|
||||||
}
|
}
|
||||||
|
if scsiCon.IOThread != "" {
|
||||||
|
devParams = append(devParams, fmt.Sprintf("iothread=%s", scsiCon.IOThread))
|
||||||
|
}
|
||||||
|
|
||||||
qemuParams = append(qemuParams, "-device")
|
qemuParams = append(qemuParams, "-device")
|
||||||
qemuParams = append(qemuParams, strings.Join(devParams, ","))
|
qemuParams = append(qemuParams, strings.Join(devParams, ","))
|
||||||
@@ -1159,6 +1165,11 @@ type Knobs struct {
|
|||||||
Realtime bool
|
Realtime bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// IOThread allows IO to be performed on a separate thread.
|
||||||
|
type IOThread struct {
|
||||||
|
ID string
|
||||||
|
}
|
||||||
|
|
||||||
// Config is the qemu configuration structure.
|
// Config is the qemu configuration structure.
|
||||||
// It allows for passing custom settings and parameters to the qemu API.
|
// It allows for passing custom settings and parameters to the qemu API.
|
||||||
type Config struct {
|
type Config struct {
|
||||||
@@ -1213,6 +1224,8 @@ type Config struct {
|
|||||||
// fds is a list of open file descriptors to be passed to the spawned qemu process
|
// fds is a list of open file descriptors to be passed to the spawned qemu process
|
||||||
fds []*os.File
|
fds []*os.File
|
||||||
|
|
||||||
|
IOThreads []IOThread
|
||||||
|
|
||||||
qemuParams []string
|
qemuParams []string
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1481,6 +1494,15 @@ func (config *Config) appendBios() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (config *Config) appendIOThreads() {
|
||||||
|
for _, t := range config.IOThreads {
|
||||||
|
if t.ID != "" {
|
||||||
|
config.qemuParams = append(config.qemuParams, "-object")
|
||||||
|
config.qemuParams = append(config.qemuParams, fmt.Sprintf("iothread,id=%s", t.ID))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// LaunchQemu can be used to launch a new qemu instance.
|
// LaunchQemu can be used to launch a new qemu instance.
|
||||||
//
|
//
|
||||||
// The Config parameter contains a set of qemu parameters and settings.
|
// The Config parameter contains a set of qemu parameters and settings.
|
||||||
@@ -1504,6 +1526,7 @@ func LaunchQemu(config Config, logger QMPLog) (string, error) {
|
|||||||
config.appendKnobs()
|
config.appendKnobs()
|
||||||
config.appendKernel()
|
config.appendKernel()
|
||||||
config.appendBios()
|
config.appendBios()
|
||||||
|
config.appendIOThreads()
|
||||||
|
|
||||||
if err := config.appendCPUs(); err != nil {
|
if err := config.appendCPUs(); err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
@@ -67,6 +67,10 @@ func testAppend(structure interface{}, expected string, t *testing.T) {
|
|||||||
case RTC:
|
case RTC:
|
||||||
config.RTC = s
|
config.RTC = s
|
||||||
config.appendRTC()
|
config.appendRTC()
|
||||||
|
|
||||||
|
case IOThread:
|
||||||
|
config.IOThreads = []IOThread{s}
|
||||||
|
config.appendIOThreads()
|
||||||
}
|
}
|
||||||
|
|
||||||
result := strings.Join(config.qemuParams, " ")
|
result := strings.Join(config.qemuParams, " ")
|
||||||
@@ -346,7 +350,7 @@ func TestVSOCKValid(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var deviceSCSIControllerStr = "-device virtio-scsi-pci,id=foo"
|
var deviceSCSIControllerStr = "-device virtio-scsi-pci,id=foo"
|
||||||
var deviceSCSIControllerBusAddrStr = "-device virtio-scsi-pci,id=foo,bus=pci.0,addr=00:04.0,disable-modern=true"
|
var deviceSCSIControllerBusAddrStr = "-device virtio-scsi-pci,id=foo,bus=pci.0,addr=00:04.0,disable-modern=true,iothread=iothread1"
|
||||||
|
|
||||||
func TestAppendDeviceSCSIController(t *testing.T) {
|
func TestAppendDeviceSCSIController(t *testing.T) {
|
||||||
scsiCon := SCSIController{
|
scsiCon := SCSIController{
|
||||||
@@ -357,6 +361,7 @@ func TestAppendDeviceSCSIController(t *testing.T) {
|
|||||||
scsiCon.Bus = "pci.0"
|
scsiCon.Bus = "pci.0"
|
||||||
scsiCon.Addr = "00:04.0"
|
scsiCon.Addr = "00:04.0"
|
||||||
scsiCon.DisableModern = true
|
scsiCon.DisableModern = true
|
||||||
|
scsiCon.IOThread = "iothread1"
|
||||||
testAppend(scsiCon, deviceSCSIControllerBusAddrStr, t)
|
testAppend(scsiCon, deviceSCSIControllerBusAddrStr, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -525,3 +530,13 @@ func TestAppendRTC(t *testing.T) {
|
|||||||
|
|
||||||
testAppend(rtc, rtcString, t)
|
testAppend(rtc, rtcString, t)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var ioThreadString = "-object iothread,id=iothread1"
|
||||||
|
|
||||||
|
func TestAppendIOThread(t *testing.T) {
|
||||||
|
ioThread := IOThread{
|
||||||
|
ID: "iothread1",
|
||||||
|
}
|
||||||
|
|
||||||
|
testAppend(ioThread, ioThreadString, t)
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user