From nobody Sat May 11 13:16:10 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) client-ip=209.132.183.28; envelope-from=libvir-list-bounces@redhat.com; helo=mx1.redhat.com; Authentication-Results: mx.zohomail.com; dkim=fail; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=fail(p=none dis=none) header.from=gmail.com Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 15300858255561011.0734501703505; Wed, 27 Jun 2018 00:50:25 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.phx2.redhat.com [10.5.11.23]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id E0560C049D53; Wed, 27 Jun 2018 07:50:23 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 578E727EC7; Wed, 27 Jun 2018 07:50:22 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id 08994181ABE5; Wed, 27 Jun 2018 07:50:18 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.25]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w5R7oG4Z020819 for ; Wed, 27 Jun 2018 03:50:16 -0400 Received: by smtp.corp.redhat.com (Postfix) id 1C58D2010D73; Wed, 27 Jun 2018 07:50:16 +0000 (UTC) Received: from mx1.redhat.com (ext-mx02.extmail.prod.ext.phx2.redhat.com [10.5.110.26]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1343D2010DA1 for ; Wed, 27 Jun 2018 07:50:14 +0000 (UTC) Received: from mail-qt0-f172.google.com (mail-qt0-f172.google.com [209.85.216.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 7F3BA8763C for ; Wed, 27 Jun 2018 07:50:02 +0000 (UTC) Received: by mail-qt0-f172.google.com with SMTP id d23-v6so876995qtp.1 for ; Wed, 27 Jun 2018 00:50:02 -0700 (PDT) Received: by 2002:ac8:395:0:0:0:0:0 with HTTP; Wed, 27 Jun 2018 00:50:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=mime-version:from:date:message-id:subject:to; bh=+fCsisMdqJZlx1QujSlDvmHZVYvNGvmgG+YEofkvkTw=; b=td05U302NocTbXwedxTwXLbGt1rU4y8mhrAzk6Xu8ZTyghwBB2sumnx45qFDfayYPB A/N4dM+To/N7/BaMQpXDmvZ3XNegWD5D0mGyTJDDFSdR81n97U41w71rP8M8z0d8puMc tgSeXk8AUm/QZIiCMdHMaIyVmgWAu1JTwRk1/JaA7voqOvbWht7Hvi0TEAG4MGaLLtfm +g5UAaVcSV5H9z6UM7jlSlZI7NJpT5xYsq1c8V9/sv9gRVlu6VPKFyv0kMVGKMIuA98D Ur1kCo/GymO2c4+qVWxx5DnrBE7XyzGj6zrm1dQ3YYvK+wuN2NYeABBwQUtxa9paePSG /iCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:from:date:message-id:subject:to; bh=+fCsisMdqJZlx1QujSlDvmHZVYvNGvmgG+YEofkvkTw=; b=L4Lp4qf22pVMe4N1or5qXr5yuy5Y+7oWaLt3LQFDM9pCnBhIL2BNyAHRtxhZdcWxAg +Pc5QpIJQU0q3GMwy1uGUAm4yKm3AXyVTpu3z2ViikUvbl+LtILiKhqKLfDezCCrjaBs +5TbjChtDBXooCeLVGGawugKDRg2iAf2XPhCfMdra9OP/Tkgv2UEMLs+G8NT62CvIxbg PCbBAzRFtVQuYSrRrvac+UX5bHbz4zXOdwiScikeeGJTbdFZ6ma2Q7v9cQxAIua5XkQ/ qmV+jgwsPi7XIKDVoX3zid5QQDnse4xaliF2pxiNbIyYapbeZefFDsfx3cFZhiL88uD3 u4uA== X-Gm-Message-State: APt69E3EL9zkCQ6amlOqsf/KradkNixUECUIL6Nj+Swnht0x8g8CBSv0 LeJhOXVOitJ/gvN5/apaOXTCbwOCXgqJuFhMI2DEgg== X-Google-Smtp-Source: AAOMgpf6bQFsTIPsbCg17X0Rd6/TUhQwux6nEwIwRwtLsZORZi8D27xGGe8+VeG9aNmgN94BIGt4F1rAva1PC+B9K2M= X-Received: by 2002:a0c:bf4e:: with SMTP id b14-v6mr4422007qvj.65.1530085801314; Wed, 27 Jun 2018 00:50:01 -0700 (PDT) MIME-Version: 1.0 From: Allen Do Date: Wed, 27 Jun 2018 15:50:00 +0800 Message-ID: To: libvir-list@redhat.com X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 27 Jun 2018 07:50:02 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.26]); Wed, 27 Jun 2018 07:50:02 +0000 (UTC) for IP:'209.85.216.172' DOMAIN:'mail-qt0-f172.google.com' HELO:'mail-qt0-f172.google.com' FROM:'dujiancheng10@gmail.com' RCPT:'' X-RedHat-Spam-Score: 1.532 * (DKIM_ADSP_CUSTOM_MED, DKIM_SIGNED, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, HTML_MESSAGE, NML_ADSP_CUSTOM_MED, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_PASS, T_DKIM_INVALID) 209.85.216.172 mail-qt0-f172.google.com 209.85.216.172 mail-qt0-f172.google.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.26 X-Scanned-By: MIMEDefang 2.84 on 10.5.11.25 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH] qemu:Add support L2 table cache for qcow2 disk X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: multipart/mixed; boundary="===============7242048152495509707==" Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.23 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.31]); Wed, 27 Jun 2018 07:50:24 +0000 (UTC) X-ZohoMail-DKIM: fail (Computed bodyhash is different from the expected one) X-ZohoMail: RDKM_2 RSF_0 Z_629925259 SPT_0 --===============7242048152495509707== Content-Type: multipart/alternative; boundary="000000000000a9ce15056f9adc40" --000000000000a9ce15056f9adc40 Content-Type: text/plain; charset="UTF-8" The patch add support L2 table cache for qcow2 disk. L2 table cache can improve IO read and write performance for qcow2 img. Diff follows: src/conf/domain_conf.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 5 +++++ src/qemu/qemu_command.c | 7 +++++++ src/qemu/qemu_domain.c | 6 ++++++ tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args | 2 +- tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml | 3 ++- 6 files changed, 68 insertions(+), 2 deletions(-) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index beca0be..0a6afca 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -8058,6 +8058,8 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, char *domain_name = NULL; int expected_secret_usage = -1; int auth_secret_usage = -1; + char *disk_l2_cache_size = NULL; + char *disk_cache_clean_interval = NULL; if (!(def = virDomainDiskDefNew(xmlopt))) return NULL; @@ -8233,6 +8235,27 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, } } else if (xmlStrEqual(cur->name, BAD_CAST "boot")) { /* boot is parsed as part of virDomainDeviceInfoParseXML */ + } else if (xmlStrEqual(cur->name, BAD_CAST "diskCache")) { + disk_l2_cache_size = + virXMLPropString(cur, "disk_l2_cache_size"); + if (disk_l2_cache_size && + virStrToLong_ui(disk_l2_cache_size, NULL, 0, + &def->disk_cache.disk_l2_cache_size) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid disk L2 cache size '%s'"), + disk_l2_cache_size); + goto error; + } + disk_cache_clean_interval = + virXMLPropString(cur, "disk_cache_clean_interval"); + if (disk_cache_clean_interval && + virStrToLong_ui(disk_cache_clean_interval, NULL, 0, + &def->disk_cache.disk_cache_clean_interval) < 0) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("invalid disk cache clean interval '%s'"), + disk_cache_clean_interval); + goto error; + } } } @@ -8472,6 +8495,8 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, VIR_FREE(vendor); VIR_FREE(product); VIR_FREE(domain_name); + VIR_FREE(disk_l2_cache_size); + VIR_FREE(disk_cache_clean_interval); ctxt->node = save_ctxt; return def; @@ -20646,6 +20671,27 @@ virDomainDiskBlockIoDefFormat(virBufferPtr buf, } } +static void +virDomainDiskCacheDefFormat(virBufferPtr buf, + virDomainDiskDefPtr def) +{ + if (def->disk_cache.disk_l2_cache_size > 0 || + def->disk_cache.disk_cache_clean_interval > 0) { + virBufferAddLit(buf, "disk_cache.disk_l2_cache_size > 0) { + virBufferAsprintf(buf, + " disk_l2_cache_size='%u'", + def->disk_cache.disk_l2_cache_size); + } + if (def->disk_cache.disk_cache_clean_interval > 0) { + virBufferAsprintf(buf, + " disk_cache_clean_interval='%u'", + def->disk_cache.disk_cache_clean_interval); + } + virBufferAddLit(buf, "/>\n"); + } +} + /* virDomainSourceDefFormatSeclabel: * @@ -20990,6 +21036,7 @@ virDomainDiskDefFormat(virBufferPtr buf, virDomainDiskGeometryDefFormat(buf, def); virDomainDiskBlockIoDefFormat(buf, def); + virDomainDiskCacheDefFormat(buf, def); /* For now, mirroring is currently output-only: we only output it * for live domains, therefore we ignore it on input except for diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 91a33cb..83ea9d3 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -647,6 +647,11 @@ struct _virDomainDiskDef { unsigned int physical_block_size; } blockio; + struct { + unsigned int disk_l2_cache_size; + unsigned int disk_cache_clean_interval; + } disk_cache; + virDomainBlockIoTuneInfo blkdeviotune; char *serial; diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index e087891..7c47cd3 100755 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -1662,6 +1662,13 @@ qemuBuildDriveStr(virDomainDiskDefPtr disk, if (qemuBuildDriveSourceStr(disk, cfg, &opt, qemuCaps) < 0) goto error; + if (disk->disk_cache.disk_l2_cache_size > 0) + virBufferAsprintf(&opt, "l2-cache-size=%u,", + disk->disk_cache.disk_l2_cache_size); + if (disk->disk_cache.disk_cache_clean_interval > 0) + virBufferAsprintf(&opt, "cache-clean-interval=%u,", + disk->disk_cache.disk_cache_clean_interval); + if (emitDeviceSyntax) virBufferAddLit(&opt, "if=none"); else diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 9f165c1..de334a7 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -5408,6 +5408,12 @@ qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk, CHECK_EQ(ioeventfd, "ioeventfd", true); CHECK_EQ(event_idx, "event_idx", true); CHECK_EQ(copy_on_read, "copy_on_read", true); + + CHECK_EQ(disk_cache.disk_l2_cache_size, + "diskCache disk_l2_cache_size", true); + CHECK_EQ(disk_cache.disk_cache_clean_interval, + "diskCache disk_cache_clean_interval", true); + /* "snapshot" is a libvirt internal field and thus can be changed */ /* startupPolicy is allowed to be updated. Therefore not checked here. */ CHECK_EQ(transient, "transient", true); diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args index b405242..b968302 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args @@ -22,7 +22,7 @@ QEMU_AUDIO_DRV=none \ -drive file=/dev/HostVG/QEMUGuest2,format=raw,if=none,media=cdrom,\ id=drive-ide0-1-0,readonly=on \ -device ide-drive,bus=ide.1,unit=0,drive=drive-ide0-1-0,id=ide0-1-0 \ --drive file=/tmp/data.img,format=raw,if=none,id=drive-virtio-disk0 \ +-drive file=/tmp/data.img,format=qcow2,l2-cache-size=536870912,cache-clean-interval=900,if=none,id=drive-virtio-disk0 \ -device virtio-blk-pci,bus=pci.0,addr=0x3,drive=drive-virtio-disk0,\ id=virtio-disk0 \ -drive file=/tmp/logs.img,format=raw,if=none,id=drive-virtio-disk1 \ diff --git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml index b843878..43298fb 100644 --- a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml +++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml @@ -28,8 +28,9 @@
- + + Thanks --000000000000a9ce15056f9adc40 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
The patch add=C2=A0sup= port L2 table cache for qcow2 disk. L2 table cache can improve IO read and = write performance for qcow2 img.
Diff follows:
=C2=A0src/conf/domain_conf.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0| 47 +++++++++++++++++++++++++++++++++++++++++++++++
=C2=A0src/conf/domain_conf.h=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2=A0 5 +++++
=C2=A0src/qemu/qemu_command.c=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 |=C2=A0 7 +++++++
=C2=A0src/qemu/qemu_domain.c=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0|=C2= =A0 6 ++++++
=C2=A0tes= ts/qemuxml2argvdata/qemuxml2argv-disk-virtio.args |=C2=A0 2 +-
=
=C2=A0tests/qemuxml2argvdata/qemux= ml2argv-disk-virtio.xml=C2=A0 |=C2=A0 3 ++-
=C2=A06 files changed, 68 insertions(+), 2 deletions(= -)


diff --git a/src/conf/domain_conf.c b/src/= conf/domain_conf.c
ind= ex beca0be..0a6afca 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8058,6 +8058,8 @@ virDomainDiskDefParseXML(virDomain= XMLOptionPtr xmlopt,
= =C2=A0 =C2=A0 =C2=A0char *domain_name =3D NULL;
=C2=A0 =C2=A0 =C2=A0int expected_secret_usage =3D= -1;
=C2=A0 =C2=A0 =C2= =A0int auth_secret_usage =3D -1;
+=C2=A0 =C2=A0 char *disk_l2_cache_size =3D NULL;
+=C2=A0 =C2=A0 char *disk_cache_clea= n_interval =3D NULL;
<= br>
=C2=A0 =C2=A0 =C2= =A0if (!(def =3D virDomainDiskDefNew(xmlopt)))
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0return NULL;
@@ -8233,6 +8235,27 @@ v= irDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0}
=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0} else if (xmlStrEqual(cur->name, BAD_CAST "boo= t")) {
=C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0/* boot is parsed as part of virDomai= nDeviceInfoParseXML */
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 } else if (xmlStrEqual(cur->name, BAD_CAST= "diskCache")) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 disk_l2_cache_size =3D
+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 virXMLPropString(cur, "disk_l2_cache_s= ize");
+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (disk_l2_cache_size &&=
+=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 virStrToLong_ui(disk_l2_cache_size, NULL, 0,
+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 &def->disk_cache.disk_l2_cache_size) < 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 virReportError(VIR_ERR_INTERNAL_ERROR,
+=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0_("invalid disk L2 cache size '%s'"),=
+=C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0disk_l2_cache_size);
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto erro= r;
+=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 disk_cache_clean_interval = =3D
+=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 virXMLPropString(cur, "disk_cac= he_clean_interval");
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (disk_cache_clean_interva= l &&
+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 virStrToLong_ui(disk_cache= _clean_interval, NULL, 0,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 &def->disk_cache.disk_cach= e_clean_interval) < 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 virReportErr= or(VIR_ERR_INTERNAL_ERROR,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0_("invalid disk cache clean = interval '%s'"),
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0disk_cache_clean_interval);
+=C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 goto error;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
=C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0}
=C2=A0 =C2= =A0 =C2=A0}

@@ -8472,6 +8495,8 @@ virDo= mainDiskDefParseXML(virDomainXMLOptionPtr xmlopt,
=C2=A0 =C2=A0 =C2=A0VIR_FREE(vendor);
=C2=A0 =C2=A0 =C2=A0VIR_FREE(pr= oduct);
=C2=A0 =C2=A0 = =C2=A0VIR_FREE(domain_name);
+=C2=A0 =C2=A0 VIR_FREE(disk_l2_cache_size);
+=C2=A0 =C2=A0 VIR_FREE(disk_cache_clean_inte= rval);

=C2=A0 =C2=A0 =C2=A0ctxt->nod= e =3D save_ctxt;
=C2= =A0 =C2=A0 =C2=A0return def;
@@ -20646,6 +20671,27 @@ virDomainDiskBlockIoDefFormat(virBufferPtr = buf,
=C2=A0 =C2=A0 =C2= =A0}
=C2=A0}

+static void
+virDomainDiskCacheDefFormat(virBufferPtr buf,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 v= irDomainDiskDefPtr def)
+=C2=A0 =C2=A0 if= (def->disk_cache.disk_l2_cache_size > 0 ||
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 def->disk_cache= .disk_cache_clean_interval > 0) {
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 virBufferAddLit(buf, "<= diskCache");
+=C2= =A0 =C2=A0 =C2=A0 =C2=A0 if (def->disk_cache.disk_l2_cache_size > 0) = {
+=C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 virBufferAsprintf(buf,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " disk_l2_cac= he_size=3D'%u'",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 def->disk_cache.disk_l2_cache_siz= e);
+=C2=A0 =C2=A0 =C2= =A0 =C2=A0 }
+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 if (def->disk_cache.disk_cache_clean_interval > = 0) {
+=C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 virBufferAsprintf(buf,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2= =A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 " disk_cac= he_clean_interval=3D'%u'",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 def->disk_cache.disk_ca= che_clean_interval);
+= =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 virBufferAddLit(buf, "/>\n&quo= t;);
+=C2=A0 =C2=A0 }<= /font>
+}
+

=C2= =A0/* virDomainSourceDefFormatSeclabel:
=C2=A0 *
@@ -20990,6 +21036,7 @@ virDomainDiskDefFormat(virBufferPtr buf,

=C2=A0 =C2=A0 =C2=A0virDomainDiskGeometryDef= Format(buf, def);
=C2= =A0 =C2=A0 =C2=A0virDomainDiskBlockIoDefFormat(buf, def);
= +=C2=A0 =C2=A0 virDomainDiskCacheDefFor= mat(buf, def);

=C2=A0 =C2=A0 =C2=A0/* F= or now, mirroring is currently output-only: we only output it
<= div>=C2=A0 =C2=A0 =C2=A0 * for live dom= ains, therefore we ignore it on input except for
diff --git a/src/conf/domain_conf.h b/src/conf/d= omain_conf.h
index 91a= 33cb..83ea9d3 100644
-= -- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -647,6 +647,11 @@ struct _virDomainDiskDef {
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0un= signed int physical_block_size;
=C2=A0 =C2=A0 =C2=A0} blockio;

+=C2=A0 =C2=A0 =C2=A0 =C2=A0 unsigned int disk_l2_cache_size;
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 un= signed int disk_cache_clean_interval;
+=C2=A0 =C2=A0 } disk_cache;
+
=C2=A0 =C2=A0 =C2=A0virDomainBlockIoTuneInfo blkdeviotune;
<= div>
=C2=A0 =C2=A0 =C2=A0char *serial;
<= font face=3D"monospace, monospace">diff --git a/src/qemu/qemu_command.c b/s= rc/qemu/qemu_command.c
index e087891..7c47cd3 100755
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1662,6 +1662,13 @@ qemuBuildDriveStr(virDomai= nDiskDefPtr disk,
=C2= =A0 =C2=A0 =C2=A0if (qemuBuildDriveSourceStr(disk, cfg, &opt, qemuCaps)= < 0)
=C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0goto error;

+=C2= =A0 =C2=A0 if (disk->disk_cache.disk_l2_cache_size > 0)
<= div>+=C2=A0 =C2=A0 =C2=A0 =C2=A0 virBuf= ferAsprintf(&opt, "l2-cache-size=3D%u,",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 disk->disk_cache.disk_l2_cache_size);
+=C2=A0 =C2=A0 if (disk->disk_cache.di= sk_cache_clean_interval > 0)
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 virBufferAsprintf(&opt, "ca= che-clean-interval=3D%u,",
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 disk->= ;disk_cache.disk_cache_clean_interval);
+
= =C2=A0 =C2=A0 =C2=A0if (emitDeviceSyntax)
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0virBufferAddLit(&= opt, "if=3Dnone");
=C2=A0 =C2=A0 =C2=A0else
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 9f165c1..de334a7 100= 644
--- a/src/qemu/qem= u_domain.c
+++ b/src/q= emu/qemu_domain.c
@@ -= 5408,6 +5408,12 @@ qemuDomainDiskChangeSupported(virDomainDiskDefPtr disk,<= /font>
=C2=A0 =C2=A0 =C2=A0CH= ECK_EQ(ioeventfd, "ioeventfd", true);
=C2=A0 =C2=A0 =C2=A0CHECK_EQ(event_idx, "eve= nt_idx", true);
= =C2=A0 =C2=A0 =C2=A0CHECK_EQ(copy_on_read, "copy_on_read", true);=
+
+=C2=A0 =C2=A0 CHECK_EQ(disk_cache.disk_l= 2_cache_size,
+=C2=A0 = =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0"diskCache disk_l2_cache_size= ", true);
+=C2=A0= =C2=A0 CHECK_EQ(disk_cache.disk_cache_clean_interval,
+=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0"diskCache disk_cache_clean_interval", true);
=
+
=C2=A0 =C2=A0 =C2=A0/* "snapshot" is a libvi= rt internal field and thus can be changed */
=C2=A0 =C2=A0 =C2=A0/* startupPolicy is allowed to b= e updated. Therefore not checked here. */
=C2=A0 =C2=A0 =C2=A0CHECK_EQ(transient, "transient= ", true);
diff --= git a/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.args b/tests/qemuxml2= argvdata/qemuxml2argv-disk-virtio.args
index b405242..b968302 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-disk-vi= rtio.args
+++ b/tests/= qemuxml2argvdata/qemuxml2argv-disk-virtio.args
@@ -22,7 +22,7 @@ QEMU_AUDIO_DRV=3Dnone \<= /div>
=C2=A0-drive file=3D/dev/Host= VG/QEMUGuest2,format=3Draw,if=3Dnone,media=3Dcdrom,\
=C2=A0id=3Ddrive-ide0-1-0,readonly=3Don \
=C2=A0-device ide-drive,= bus=3Dide.1,unit=3D0,drive=3Ddrive-ide0-1-0,id=3Dide0-1-0 \
--drive file=3D/tmp/data.img,format= =3Draw,if=3Dnone,id=3Ddrive-virtio-disk0 \
+-drive file=3D/tmp/data.img,format=3Dqcow2,l2-cache-s= ize=3D536870912,cache-clean-interval=3D900,if=3Dnone,id=3Ddrive-virtio-disk= 0 \
=C2=A0-device virt= io-blk-pci,bus=3Dpci.0,addr=3D0x3,drive=3Ddrive-virtio-disk0,\
=
=C2=A0id=3Dvirtio-disk0 \
=C2=A0-drive file=3D/tmp/logs.= img,format=3Draw,if=3Dnone,id=3Ddrive-virtio-disk1 \
diff --git a/tests/qemuxml2argvdata/qemuxml2= argv-disk-virtio.xml b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio.xml<= /font>
index b843878..43298fb= 100644
--- a/tests/qe= muxml2argvdata/qemuxml2argv-disk-virtio.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-disk-virtio= .xml
@@ -28,8 +28,9 @@=
=C2=A0 =C2=A0 =C2=A0 = =C2=A0<address type=3D'drive' controller=3D'0' bus=3D= 9;1' target=3D'0' unit=3D'0'/>
=C2=A0 =C2=A0 =C2=A0</disk>
=C2=A0 =C2=A0 =C2=A0<disk ty= pe=3D'file' device=3D'disk'>
-=C2=A0 =C2=A0 =C2=A0 <driver name=3D'qemu= ' type=3D'raw'/>
+=C2=A0 =C2=A0 =C2=A0 <driver name=3D'qemu' type=3D= 9;qcow2'/>
=C2= =A0 =C2=A0 =C2=A0 =C2=A0<source file=3D'/tmp/data.img'/>
+=C2=A0 =C2=A0 =C2=A0 <= diskCache disk_l2_cache_size=3D'53687' disk_cache_clean_interval=3D= '900' />
= =C2=A0 =C2=A0 =C2=A0 =C2=A0<target dev=3D'vda' bus=3D'virtio= '/>
=C2=A0 =C2= =A0 =C2=A0</disk>


Thanks
--000000000000a9ce15056f9adc40-- --===============7242048152495509707== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list --===============7242048152495509707==--