mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Add support for zero-detection writes
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
This commit is contained in:
parent
d3c784999d
commit
6445ad488f
@ -333,6 +333,7 @@ VIR_ENUM_IMPL(virQEMUCaps, QEMU_CAPS_LAST,
|
|||||||
"qxl.max_outputs", /* 225 */
|
"qxl.max_outputs", /* 225 */
|
||||||
"qxl-vga.max_outputs",
|
"qxl-vga.max_outputs",
|
||||||
"spice-unix",
|
"spice-unix",
|
||||||
|
"drive-detect-zeroes",
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
@ -2650,6 +2651,7 @@ static struct virQEMUCapsCommandLineProps virQEMUCapsCommandLine[] = {
|
|||||||
{ "machine", "mem-merge", QEMU_CAPS_MEM_MERGE },
|
{ "machine", "mem-merge", QEMU_CAPS_MEM_MERGE },
|
||||||
{ "machine", "vmport", QEMU_CAPS_MACHINE_VMPORT_OPT },
|
{ "machine", "vmport", QEMU_CAPS_MACHINE_VMPORT_OPT },
|
||||||
{ "drive", "discard", QEMU_CAPS_DRIVE_DISCARD },
|
{ "drive", "discard", QEMU_CAPS_DRIVE_DISCARD },
|
||||||
|
{ "drive", "detect-zeroes", QEMU_CAPS_DRIVE_DETECT_ZEROES },
|
||||||
{ "realtime", "mlock", QEMU_CAPS_MLOCK },
|
{ "realtime", "mlock", QEMU_CAPS_MLOCK },
|
||||||
{ "boot-opts", "strict", QEMU_CAPS_BOOT_STRICT },
|
{ "boot-opts", "strict", QEMU_CAPS_BOOT_STRICT },
|
||||||
{ "boot-opts", "reboot-timeout", QEMU_CAPS_REBOOT_TIMEOUT },
|
{ "boot-opts", "reboot-timeout", QEMU_CAPS_REBOOT_TIMEOUT },
|
||||||
|
@ -366,6 +366,7 @@ typedef enum {
|
|||||||
QEMU_CAPS_QXL_MAX_OUTPUTS, /* -device qxl,max-outputs= */
|
QEMU_CAPS_QXL_MAX_OUTPUTS, /* -device qxl,max-outputs= */
|
||||||
QEMU_CAPS_QXL_VGA_MAX_OUTPUTS, /* -device qxl-vga,max-outputs= */
|
QEMU_CAPS_QXL_VGA_MAX_OUTPUTS, /* -device qxl-vga,max-outputs= */
|
||||||
QEMU_CAPS_SPICE_UNIX, /* -spice unix */
|
QEMU_CAPS_SPICE_UNIX, /* -spice unix */
|
||||||
|
QEMU_CAPS_DRIVE_DETECT_ZEROES, /* -drive detect-zeroes= */
|
||||||
|
|
||||||
QEMU_CAPS_LAST /* this must always be the last item */
|
QEMU_CAPS_LAST /* this must always be the last item */
|
||||||
} virQEMUCapsFlags;
|
} virQEMUCapsFlags;
|
||||||
|
@ -1391,6 +1391,30 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (disk->detect_zeroes) {
|
||||||
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_DRIVE_DETECT_ZEROES)) {
|
||||||
|
int detect_zeroes = disk->detect_zeroes;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As a convenience syntax, if discards are ignored and
|
||||||
|
* zero detection is set to 'unmap', then simply behave
|
||||||
|
* like zero detection is set to 'on'. But don't change
|
||||||
|
* it in the XML for easier adjustments. This behaviour
|
||||||
|
* is documented.
|
||||||
|
*/
|
||||||
|
if (disk->discard != VIR_DOMAIN_DISK_DISCARD_UNMAP &&
|
||||||
|
detect_zeroes == VIR_DOMAIN_DISK_DETECT_ZEROES_UNMAP)
|
||||||
|
detect_zeroes = VIR_DOMAIN_DISK_DETECT_ZEROES_ON;
|
||||||
|
|
||||||
|
virBufferAsprintf(&opt, ",detect-zeroes=%s",
|
||||||
|
virDomainDiskDetectZeroesTypeToString(detect_zeroes));
|
||||||
|
} else {
|
||||||
|
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
|
||||||
|
_("detect_zeroes is not supported by this QEMU binary"));
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MONITOR_JSON)) {
|
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_MONITOR_JSON)) {
|
||||||
const char *wpolicy = NULL, *rpolicy = NULL;
|
const char *wpolicy = NULL, *rpolicy = NULL;
|
||||||
|
|
||||||
|
@ -164,6 +164,7 @@
|
|||||||
<flag name='device-tray-moved-event'/>
|
<flag name='device-tray-moved-event'/>
|
||||||
<flag name='nec-usb-xhci-ports'/>
|
<flag name='nec-usb-xhci-ports'/>
|
||||||
<flag name='name-guest'/>
|
<flag name='name-guest'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2001001</version>
|
<version>2001001</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -181,6 +181,7 @@
|
|||||||
<flag name='qxl.max_outputs'/>
|
<flag name='qxl.max_outputs'/>
|
||||||
<flag name='qxl-vga.max_outputs'/>
|
<flag name='qxl-vga.max_outputs'/>
|
||||||
<flag name='spice-unix'/>
|
<flag name='spice-unix'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2004000</version>
|
<version>2004000</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -185,6 +185,7 @@
|
|||||||
<flag name='qxl.max_outputs'/>
|
<flag name='qxl.max_outputs'/>
|
||||||
<flag name='qxl-vga.max_outputs'/>
|
<flag name='qxl-vga.max_outputs'/>
|
||||||
<flag name='spice-unix'/>
|
<flag name='spice-unix'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2005000</version>
|
<version>2005000</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -155,6 +155,7 @@
|
|||||||
<flag name='nec-usb-xhci-ports'/>
|
<flag name='nec-usb-xhci-ports'/>
|
||||||
<flag name='virtio-scsi-pci.iothread'/>
|
<flag name='virtio-scsi-pci.iothread'/>
|
||||||
<flag name='name-guest'/>
|
<flag name='name-guest'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2005094</version>
|
<version>2005094</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -155,6 +155,7 @@
|
|||||||
<flag name='nec-usb-xhci-ports'/>
|
<flag name='nec-usb-xhci-ports'/>
|
||||||
<flag name='virtio-scsi-pci.iothread'/>
|
<flag name='virtio-scsi-pci.iothread'/>
|
||||||
<flag name='name-guest'/>
|
<flag name='name-guest'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2005094</version>
|
<version>2005094</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -149,6 +149,7 @@
|
|||||||
<flag name='nec-usb-xhci-ports'/>
|
<flag name='nec-usb-xhci-ports'/>
|
||||||
<flag name='virtio-scsi-pci.iothread'/>
|
<flag name='virtio-scsi-pci.iothread'/>
|
||||||
<flag name='name-guest'/>
|
<flag name='name-guest'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2005094</version>
|
<version>2005094</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -191,6 +191,7 @@
|
|||||||
<flag name='qxl.max_outputs'/>
|
<flag name='qxl.max_outputs'/>
|
||||||
<flag name='qxl-vga.max_outputs'/>
|
<flag name='qxl-vga.max_outputs'/>
|
||||||
<flag name='spice-unix'/>
|
<flag name='spice-unix'/>
|
||||||
|
<flag name='drive-detect-zeroes'/>
|
||||||
<version>2006000</version>
|
<version>2006000</version>
|
||||||
<kvmVersion>0</kvmVersion>
|
<kvmVersion>0</kvmVersion>
|
||||||
<package></package>
|
<package></package>
|
||||||
|
@ -0,0 +1,27 @@
|
|||||||
|
LC_ALL=C \
|
||||||
|
PATH=/bin \
|
||||||
|
HOME=/home/test \
|
||||||
|
USER=test \
|
||||||
|
LOGNAME=test \
|
||||||
|
QEMU_AUDIO_DRV=none \
|
||||||
|
/usr/bin/qemu \
|
||||||
|
-name test \
|
||||||
|
-S \
|
||||||
|
-M pc-0.13 \
|
||||||
|
-m 1024 \
|
||||||
|
-smp 1 \
|
||||||
|
-uuid 92d7a226-cfae-425b-a6d3-00bbf9ec5c9e \
|
||||||
|
-nographic \
|
||||||
|
-nodefaults \
|
||||||
|
-monitor unix:/tmp/lib/domain--1-test/monitor.sock,server,nowait \
|
||||||
|
-no-acpi \
|
||||||
|
-boot dc \
|
||||||
|
-usb \
|
||||||
|
-drive file=/var/lib/libvirt/images/f14.img,format=qcow2,if=none,\
|
||||||
|
id=drive-virtio-disk0,discard=unmap,detect-zeroes=unmap \
|
||||||
|
-device virtio-blk-pci,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,\
|
||||||
|
id=virtio-disk0 \
|
||||||
|
-drive file=/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso,format=raw,if=none,\
|
||||||
|
media=cdrom,id=drive-ide0-1-0,readonly=on,discard=ignore,detect-zeroes=on \
|
||||||
|
-device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \
|
||||||
|
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
|
@ -23,7 +23,7 @@
|
|||||||
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
<address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/>
|
||||||
</disk>
|
</disk>
|
||||||
<disk type='file' device='cdrom'>
|
<disk type='file' device='cdrom'>
|
||||||
<driver discard='ignore' detect_zeroes='off'/>
|
<driver discard='ignore' detect_zeroes='unmap'/>
|
||||||
<source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
|
<source file='/var/lib/libvirt/Fedora-14-x86_64-Live-KDE.iso'/>
|
||||||
<target dev='hdc' bus='ide'/>
|
<target dev='hdc' bus='ide'/>
|
||||||
<readonly/>
|
<readonly/>
|
||||||
|
@ -875,6 +875,9 @@ mymain(void)
|
|||||||
QEMU_CAPS_VIRTIO_BLK_SCSI);
|
QEMU_CAPS_VIRTIO_BLK_SCSI);
|
||||||
DO_TEST("disk-drive-discard",
|
DO_TEST("disk-drive-discard",
|
||||||
QEMU_CAPS_DRIVE_DISCARD);
|
QEMU_CAPS_DRIVE_DISCARD);
|
||||||
|
DO_TEST("disk-drive-detect-zeroes",
|
||||||
|
QEMU_CAPS_DRIVE_DISCARD,
|
||||||
|
QEMU_CAPS_DRIVE_DETECT_ZEROES);
|
||||||
DO_TEST("disk-snapshot", NONE);
|
DO_TEST("disk-snapshot", NONE);
|
||||||
DO_TEST_PARSE_ERROR("disk-same-targets",
|
DO_TEST_PARSE_ERROR("disk-same-targets",
|
||||||
QEMU_CAPS_SCSI_LSI,
|
QEMU_CAPS_SCSI_LSI,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user