Merge pull request #14 from amshinde/scsi-iothreads

Add ability to associate a SCSI controller device with an iothread
This commit is contained in:
Sebastien Boeuf
2018-03-29 10:35:47 -07:00
committed by GitHub
2 changed files with 39 additions and 1 deletions

View File

@@ -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

View File

@@ -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)
}