mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-03 03:25:20 +00:00
qemu: Support multiqueue virtio-blk
qemu 2.7.0 introduces multiqueue virtio-blk(commit 2f27059). This patch introduces a new attribute "queues". An example of the XML: <disk type='file' device='disk'> <driver name='qemu' type='qcow2' queues='4'/> The corresponding QEMU command line: -device virtio-blk-pci,scsi=off,num-queues=4,id=virtio-disk0 Signed-off-by: Lin Ma <lma@suse.com> Signed-off-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
c7bdeed559
commit
abca72faa4
@ -2397,7 +2397,7 @@
|
||||
<target dev='vdc' bus='virtio'/>
|
||||
</disk>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='qcow2'/>
|
||||
<driver name='qemu' type='qcow2' queues='4'/>
|
||||
<source file='/var/lib/libvirt/images/domain.qcow'/>
|
||||
<backingStore type='file'>
|
||||
<format type='qcow2'/>
|
||||
@ -3057,6 +3057,10 @@
|
||||
<code>bus</code> and "pci" or "ccw" <code>address</code> types.
|
||||
<span class='since'>Since 1.2.8 (QEMU 2.1)</span>
|
||||
</li>
|
||||
<li>
|
||||
The optional <code>queues</code> attribute specifies the number of
|
||||
virt queues for virtio-blk. (<span class="since">Since 3.9.0</span>)
|
||||
</li>
|
||||
<li>
|
||||
For virtio disks,
|
||||
<a href="#elementsVirtio">Virtio-specific options</a> can also be
|
||||
|
@ -1811,6 +1811,11 @@
|
||||
<optional>
|
||||
<ref name="detect_zeroes"/>
|
||||
</optional>
|
||||
<optional>
|
||||
<attribute name='queues'>
|
||||
<ref name="positiveInteger"/>
|
||||
</attribute>
|
||||
</optional>
|
||||
<ref name="virtioOptions"/>
|
||||
<empty/>
|
||||
</element>
|
||||
|
@ -5113,6 +5113,13 @@ virDomainDiskDefValidate(const virDomainDiskDef *disk)
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (disk->queues && disk->bus != VIR_DOMAIN_DISK_BUS_VIRTIO) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("queues attribute in disk driver element is only "
|
||||
"supported by virtio-blk"));
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -8776,6 +8783,15 @@ virDomainDiskDefDriverParseXML(virDomainDiskDefPtr def,
|
||||
}
|
||||
VIR_FREE(tmp);
|
||||
|
||||
if ((tmp = virXMLPropString(cur, "queues")) &&
|
||||
virStrToLong_uip(tmp, NULL, 10, &def->queues) < 0) {
|
||||
virReportError(VIR_ERR_XML_ERROR,
|
||||
_("'queues' attribute must be positive number: %s"),
|
||||
tmp);
|
||||
goto cleanup;
|
||||
}
|
||||
VIR_FREE(tmp);
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
@ -22030,6 +22046,8 @@ virDomainDiskDefFormat(virBufferPtr buf,
|
||||
virBufferAsprintf(&driverBuf, " iothread='%u'", def->iothread);
|
||||
if (def->detect_zeroes)
|
||||
virBufferAsprintf(&driverBuf, " detect_zeroes='%s'", detect_zeroes);
|
||||
if (def->queues)
|
||||
virBufferAsprintf(&driverBuf, " queues='%u'", def->queues);
|
||||
|
||||
virDomainVirtioOptionsFormat(&driverBuf, def->virtio);
|
||||
|
||||
|
@ -668,6 +668,7 @@ struct _virDomainDiskDef {
|
||||
unsigned int iothread; /* unused = 0, > 0 specific thread # */
|
||||
int detect_zeroes; /* enum virDomainDiskDetectZeroes */
|
||||
char *domain_name; /* backend domain name */
|
||||
unsigned int queues;
|
||||
virDomainVirtioOptionsPtr virtio;
|
||||
};
|
||||
|
||||
|
@ -2083,6 +2083,17 @@ qemuBuildDriveDevStr(const virDomainDef *def,
|
||||
? "on" : "off");
|
||||
}
|
||||
|
||||
if (disk->queues) {
|
||||
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES)) {
|
||||
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||
_("num-queues property isn't supported by this "
|
||||
"QEMU binary"));
|
||||
goto error;
|
||||
}
|
||||
|
||||
virBufferAsprintf(&opt, ",num-queues=%u", disk->queues);
|
||||
}
|
||||
|
||||
if (qemuBuildVirtioOptionsStr(&opt, disk->virtio, qemuCaps) < 0)
|
||||
goto error;
|
||||
|
||||
|
@ -883,6 +883,9 @@ bool qemuDomainVcpuHotplugIsInOrder(virDomainDefPtr def)
|
||||
void qemuDomainVcpuPersistOrder(virDomainDefPtr def)
|
||||
ATTRIBUTE_NONNULL(1);
|
||||
|
||||
int qemuDomainDefValidateDisk(const virDomainDiskDef *disk,
|
||||
virQEMUCapsPtr qemuCaps);
|
||||
|
||||
int qemuDomainCheckMonitor(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr vm,
|
||||
qemuDomainAsyncJob asyncJob);
|
||||
|
@ -0,0 +1,24 @@
|
||||
LC_ALL=C \
|
||||
PATH=/bin \
|
||||
HOME=/home/test \
|
||||
USER=test \
|
||||
LOGNAME=test \
|
||||
QEMU_AUDIO_DRV=none \
|
||||
/usr/bin/qemu-system-i686 \
|
||||
-name QEMUGuest1 \
|
||||
-S \
|
||||
-M pc \
|
||||
-m 214 \
|
||||
-smp 1,sockets=1,cores=1,threads=1 \
|
||||
-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \
|
||||
-nographic \
|
||||
-nodefaults \
|
||||
-chardev socket,id=charmonitor,path=/tmp/lib/domain--1-QEMUGuest1/monitor.sock,\
|
||||
server,nowait \
|
||||
-mon chardev=charmonitor,id=monitor,mode=readline \
|
||||
-no-acpi \
|
||||
-boot c \
|
||||
-usb \
|
||||
-drive file=/tmp/data.img,format=raw,if=none,id=drive-virtio-disk0 \
|
||||
-device virtio-blk-pci,num-queues=4,bus=pci.0,addr=0x3,\
|
||||
drive=drive-virtio-disk0,id=virtio-disk0
|
@ -0,0 +1,34 @@
|
||||
<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-system-i686</emulator>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='raw' queues='4'/>
|
||||
<source file='/tmp/data.img'/>
|
||||
<target dev='vda' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||
</disk>
|
||||
<controller type='usb' index='0'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
||||
</controller>
|
||||
<controller type='ide' index='0'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
|
||||
</controller>
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<memballoon model='none'/>
|
||||
</devices>
|
||||
</domain>
|
@ -892,6 +892,8 @@ mymain(void)
|
||||
QEMU_CAPS_VIRTIO_CCW, QEMU_CAPS_VIRTIO_S390);
|
||||
DO_TEST("disk-order",
|
||||
QEMU_CAPS_DRIVE_BOOT, QEMU_CAPS_VIRTIO_BLK_SCSI);
|
||||
DO_TEST("disk-virtio-drive-queues",
|
||||
QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES);
|
||||
DO_TEST("disk-drive-boot-disk",
|
||||
QEMU_CAPS_DRIVE_BOOT);
|
||||
DO_TEST("disk-drive-boot-cdrom",
|
||||
|
@ -0,0 +1,34 @@
|
||||
<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-system-i686</emulator>
|
||||
<disk type='file' device='disk'>
|
||||
<driver name='qemu' type='raw' queues='4'/>
|
||||
<source file='/tmp/data.img'/>
|
||||
<target dev='vda' bus='virtio'/>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
|
||||
</disk>
|
||||
<controller type='usb' index='0'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/>
|
||||
</controller>
|
||||
<controller type='ide' index='0'>
|
||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/>
|
||||
</controller>
|
||||
<controller type='pci' index='0' model='pci-root'/>
|
||||
<input type='mouse' bus='ps2'/>
|
||||
<input type='keyboard' bus='ps2'/>
|
||||
<memballoon model='none'/>
|
||||
</devices>
|
||||
</domain>
|
@ -449,6 +449,7 @@ mymain(void)
|
||||
DO_TEST("disk-usb-device", NONE);
|
||||
DO_TEST("disk-virtio", NONE);
|
||||
DO_TEST("floppy-drive-fat", NONE);
|
||||
DO_TEST("disk-virtio-drive-queues", QEMU_CAPS_VIRTIO_BLK_NUM_QUEUES);
|
||||
DO_TEST("disk-drive-boot-disk", NONE);
|
||||
DO_TEST("disk-drive-boot-cdrom", NONE);
|
||||
DO_TEST("disk-drive-error-policy-stop", NONE);
|
||||
|
Loading…
Reference in New Issue
Block a user