mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-08-31 16:36:38 +00:00
qemu: iothreads: Add iothread support for scsi
Add a hypervisor configuration to specify if IO should be handled in a separate thread. Add support for iothreads for virtio-scsi for now. Since we attach all scsi drives to the same scsi controller, all the drives will be handled in a separate IO thread which would still give better performance. Going forward we need to assess if adding more controllers and attaching iothreasds to each of them with distributing drives among teh scsi controllers should be done, based on more performance analysis. Signed-off-by: Archana Shinde <archana.m.shinde@intel.com>
This commit is contained in:
@@ -201,6 +201,10 @@ type HypervisorConfig struct {
|
||||
// DisableBlockDeviceUse disallows a block device from being used.
|
||||
DisableBlockDeviceUse bool
|
||||
|
||||
// EnableIOThreads enables IO to be processed in a separate thread.
|
||||
// Supported currently for virtio-scsi driver.
|
||||
EnableIOThreads bool
|
||||
|
||||
// Debug changes the default hypervisor and kernel parameters to
|
||||
// enable debug output where available.
|
||||
Debug bool
|
||||
|
@@ -379,8 +379,9 @@ func (q *qemu) createPod(podConfig PodConfig) error {
|
||||
return err
|
||||
}
|
||||
|
||||
var ioThread *govmmQemu.IOThread
|
||||
if q.config.BlockDeviceDriver == VirtioSCSI {
|
||||
devices = q.arch.appendSCSIController(devices)
|
||||
devices, ioThread = q.arch.appendSCSIController(devices, q.config.EnableIOThreads)
|
||||
}
|
||||
|
||||
cpuModel := q.arch.cpuModel()
|
||||
@@ -414,6 +415,10 @@ func (q *qemu) createPod(podConfig PodConfig) error {
|
||||
Bios: firmwarePath,
|
||||
}
|
||||
|
||||
if ioThread != nil {
|
||||
qemuConfig.IOThreads = []govmmQemu.IOThread{*ioThread}
|
||||
}
|
||||
|
||||
q.qemuConfig = qemuConfig
|
||||
|
||||
return nil
|
||||
|
@@ -66,7 +66,7 @@ type qemuArch interface {
|
||||
appendImage(devices []govmmQemu.Device, path string) ([]govmmQemu.Device, error)
|
||||
|
||||
// appendSCSIController appens a SCSI controller to devices
|
||||
appendSCSIController(devices []govmmQemu.Device) []govmmQemu.Device
|
||||
appendSCSIController(devices []govmmQemu.Device, enableIOThreads bool) ([]govmmQemu.Device, *govmmQemu.IOThread)
|
||||
|
||||
// appendBridges appends bridges to devices
|
||||
appendBridges(devices []govmmQemu.Device, bridges []Bridge) []govmmQemu.Device
|
||||
@@ -300,15 +300,27 @@ func (q *qemuArchBase) appendImage(devices []govmmQemu.Device, path string) ([]g
|
||||
return q.appendBlockDevice(devices, drive), nil
|
||||
}
|
||||
|
||||
func (q *qemuArchBase) appendSCSIController(devices []govmmQemu.Device) []govmmQemu.Device {
|
||||
func (q *qemuArchBase) appendSCSIController(devices []govmmQemu.Device, enableIOThreads bool) ([]govmmQemu.Device, *govmmQemu.IOThread) {
|
||||
scsiController := govmmQemu.SCSIController{
|
||||
ID: scsiControllerID,
|
||||
DisableModern: q.nestedRun,
|
||||
}
|
||||
|
||||
var t *govmmQemu.IOThread
|
||||
|
||||
if enableIOThreads {
|
||||
randBytes, _ := generateRandomBytes(8)
|
||||
|
||||
t = &govmmQemu.IOThread{
|
||||
ID: fmt.Sprintf("%s-%s", "iothread", hex.EncodeToString(randBytes)),
|
||||
}
|
||||
|
||||
scsiController.IOThread = t.ID
|
||||
}
|
||||
|
||||
devices = append(devices, scsiController)
|
||||
|
||||
return devices
|
||||
return devices, t
|
||||
}
|
||||
|
||||
// appendBridges appends to devices the given bridges
|
||||
|
@@ -470,6 +470,10 @@ func TestQemuArchBaseAppendSCSIController(t *testing.T) {
|
||||
},
|
||||
}
|
||||
|
||||
devices = qemuArchBase.appendSCSIController(devices)
|
||||
devices, ioThread := qemuArchBase.appendSCSIController(devices, false)
|
||||
assert.Equal(expectedOut, devices)
|
||||
assert.Nil(ioThread)
|
||||
|
||||
_, ioThread = qemuArchBase.appendSCSIController(devices, true)
|
||||
assert.NotNil(ioThread)
|
||||
}
|
||||
|
Reference in New Issue
Block a user