mirror of https://gitee.com/openkylin/libvirt.git
qemu: Support for Block Device IO Limits.
Implementation of iolimits for the qemu driver with capability probing for block size attribute and command line generation for block sizes. Including testcase for qemuxml2argvtest. Signed-off-by: Viktor Mihajlovski <mihajlov@linux.vnet.ibm.com>
This commit is contained in:
parent
5cc50ad7a4
commit
277a49bce7
|
@ -172,6 +172,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
|
|||
"bridge", /* 100 */
|
||||
"lsi",
|
||||
"virtio-scsi-pci",
|
||||
"iolimits",
|
||||
|
||||
);
|
||||
|
||||
|
@ -1499,6 +1500,16 @@ qemuCapsParseDeviceStr(const char *str, virBitmapPtr flags)
|
|||
qemuCapsSet(flags, QEMU_CAPS_SCSI_CD);
|
||||
if (strstr(str, "ide-cd"))
|
||||
qemuCapsSet(flags, QEMU_CAPS_IDE_CD);
|
||||
/*
|
||||
* the iolimit detection is not really straight forward:
|
||||
* in qemu this is a capability of the block layer, if
|
||||
* present any of -device scsi-disk, virtio-blk-*, ...
|
||||
* will offer to specify logical and physical block size
|
||||
* and other properties...
|
||||
*/
|
||||
if (strstr(str, ".logical_block_size") &&
|
||||
strstr(str, ".physical_block_size"))
|
||||
qemuCapsSet(flags, QEMU_CAPS_IOLIMITS);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -138,6 +138,7 @@ enum qemuCapsFlags {
|
|||
QEMU_CAPS_NETDEV_BRIDGE = 100, /* bridge helper support */
|
||||
QEMU_CAPS_SCSI_LSI = 101, /* -device lsi */
|
||||
QEMU_CAPS_VIRTIO_SCSI_PCI = 102, /* -device virtio-scsi-pci */
|
||||
QEMU_CAPS_IOLIMITS = 103, /* -device ...logical_block_size & co */
|
||||
|
||||
QEMU_CAPS_LAST, /* this must always be the last item */
|
||||
};
|
||||
|
|
|
@ -2637,6 +2637,14 @@ qemuBuildDriveDevStr(virDomainDefPtr def,
|
|||
virBufferAsprintf(&opt, ",id=%s", disk->info.alias);
|
||||
if (bootindex && qemuCapsGet(qemuCaps, QEMU_CAPS_BOOTINDEX))
|
||||
virBufferAsprintf(&opt, ",bootindex=%d", bootindex);
|
||||
if (qemuCapsGet(qemuCaps, QEMU_CAPS_IOLIMITS)) {
|
||||
if (disk->iolimits.logical_block_size > 0)
|
||||
virBufferAsprintf(&opt, ",logical_block_size=%u",
|
||||
disk->iolimits.logical_block_size);
|
||||
if (disk->iolimits.physical_block_size > 0)
|
||||
virBufferAsprintf(&opt, ",physical_block_size=%u",
|
||||
disk->iolimits.physical_block_size);
|
||||
}
|
||||
|
||||
if (virBufferError(&opt)) {
|
||||
virReportOOMError();
|
||||
|
|
|
@ -540,7 +540,8 @@ mymain(void)
|
|||
QEMU_CAPS_NO_ACPI,
|
||||
QEMU_CAPS_VIRTIO_BLK_SCSI,
|
||||
QEMU_CAPS_VIRTIO_BLK_SG_IO,
|
||||
QEMU_CAPS_CPU_HOST);
|
||||
QEMU_CAPS_CPU_HOST,
|
||||
QEMU_CAPS_IOLIMITS);
|
||||
DO_TEST("qemu-kvm-0.12.1.2-rhel62-beta", 12001, 1, 0,
|
||||
QEMU_CAPS_VNC_COLON,
|
||||
QEMU_CAPS_NO_REBOOT,
|
||||
|
@ -607,7 +608,8 @@ mymain(void)
|
|||
QEMU_CAPS_VIRTIO_BLK_SG_IO,
|
||||
QEMU_CAPS_DRIVE_COPY_ON_READ,
|
||||
QEMU_CAPS_CPU_HOST,
|
||||
QEMU_CAPS_SCSI_CD);
|
||||
QEMU_CAPS_SCSI_CD,
|
||||
QEMU_CAPS_IOLIMITS);
|
||||
DO_TEST("qemu-1.0", 1000000, 0, 0,
|
||||
QEMU_CAPS_VNC_COLON,
|
||||
QEMU_CAPS_NO_REBOOT,
|
||||
|
@ -679,7 +681,8 @@ mymain(void)
|
|||
QEMU_CAPS_SCSI_BLOCK,
|
||||
QEMU_CAPS_SCSI_CD,
|
||||
QEMU_CAPS_IDE_CD,
|
||||
QEMU_CAPS_SCSI_LSI);
|
||||
QEMU_CAPS_SCSI_LSI,
|
||||
QEMU_CAPS_IOLIMITS);
|
||||
DO_TEST("qemu-1.1.0", 1001000, 0, 0,
|
||||
QEMU_CAPS_VNC_COLON,
|
||||
QEMU_CAPS_NO_REBOOT,
|
||||
|
@ -759,7 +762,8 @@ mymain(void)
|
|||
QEMU_CAPS_NEC_USB_XHCI,
|
||||
QEMU_CAPS_NETDEV_BRIDGE,
|
||||
QEMU_CAPS_SCSI_LSI,
|
||||
QEMU_CAPS_VIRTIO_SCSI_PCI);
|
||||
QEMU_CAPS_VIRTIO_SCSI_PCI,
|
||||
QEMU_CAPS_IOLIMITS);
|
||||
|
||||
return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test \
|
||||
/usr/bin/qemu -S -M pc -m 214 -smp 1 -nographic -nodefconfig -nodefaults \
|
||||
-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
|
||||
-drive file=/dev/HostVG/QEMUGuest1,if=none,id=drive-ide0-0-1 \
|
||||
-device ide-cd,bus=ide.0,unit=1,drive=drive-ide0-0-1,id=ide0-0-1 \
|
||||
-drive file=/tmp/idedisk.img,if=none,id=drive-ide0-0-2 \
|
||||
-device ide-hd,bus=ide.0,unit=2,drive=drive-ide0-0-2,id=ide0-0-2,\
|
||||
logical_block_size=512,physical_block_size=512 \
|
||||
-usb -device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x4
|
|
@ -0,0 +1,33 @@
|
|||
<domain type='qemu'>
|
||||
<name>QEMUGuest1</name>
|
||||
<uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
|
||||
<memory unit='KiB'>219136</memory>
|
||||
<currentMemory unit='KiB'>219136</currentMemory>
|
||||
<vcpu placement='static'>1</vcpu>
|
||||
<os>
|
||||
<type arch='i686' machine='pc'>hvm</type>
|
||||
<boot dev='hd'/>
|
||||
</os>
|
||||
<clock offset='utc'/>
|
||||
<on_poweroff>destroy</on_poweroff>
|
||||
<on_reboot>restart</on_reboot>
|
||||
<on_crash>destroy</on_crash>
|
||||
<devices>
|
||||
<emulator>/usr/bin/qemu</emulator>
|
||||
<disk type='block' device='cdrom'>
|
||||
<source dev='/dev/HostVG/QEMUGuest1'/>
|
||||
<target dev='hda' bus='ide'/>
|
||||
<address type='drive' controller='0' bus='0' target='0' unit='1'/>
|
||||
</disk>
|
||||
<disk type='file' device='disk'>
|
||||
<source file='/tmp/idedisk.img'/>
|
||||
<target dev='hdc' bus='ide'/>
|
||||
<address type='drive' controller='0' bus='0' target='0' unit='2'/>
|
||||
<iolimits logical_block_size='512' physical_block_size='512'/>
|
||||
</disk>
|
||||
<controller type='usb' index='0'/>
|
||||
<controller type='ide' index='0'/>
|
||||
<controller type='ide' index='1'/>
|
||||
<memballoon model='virtio'/>
|
||||
</devices>
|
||||
</domain>
|
|
@ -789,6 +789,9 @@ mymain(void)
|
|||
QEMU_CAPS_IDE_CD);
|
||||
|
||||
DO_TEST("disk-geometry", QEMU_CAPS_DRIVE);
|
||||
DO_TEST("disk-iolimits",
|
||||
QEMU_CAPS_DRIVE, QEMU_CAPS_DEVICE, QEMU_CAPS_NODEFCONFIG,
|
||||
QEMU_CAPS_IDE_CD, QEMU_CAPS_IOLIMITS);
|
||||
|
||||
VIR_FREE(driver.stateDir);
|
||||
virCapabilitiesFree(driver.caps);
|
||||
|
|
Loading…
Reference in New Issue