From nobody Sun Feb 8 22:28:01 2026 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; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1571415114; cv=none; d=zoho.com; s=zohoarc; b=IBmfcGTSmNF8HhX0KFItD61SOopieKaVB0K0nVwGQkb0ryz7qQ4btDL5JfY/XhSfqAlovbHpahUA+kMH7iE6u/ou9e4GaTwP/eagaAugB1eNgJepY0PDCnxC9r+dn9S7EKQGvvy60oXUQI4nnCANdVKTXEpgKTX+K5X3EfJlsbI= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1571415114; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=9lID8HQqCmw77eqyFptkm6gppPJhXrV26aVCiSKV3tE=; b=glLCQJZuTBGR1kklR6qT3ILPAut6ys/hnCr1H4zWoEbNxr2vw0/tIgCPcGhuAcNfOlcVm5npi9V627LuZou2CW/MJaMm2a4ozH1D+JF3MCA/L5qP8PHI13Gp19yDjVYbEDeo54v+pdXFj4QwTXE5at4bLrhuo8EB6NtPxv1RRjY= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of redhat.com designates 209.132.183.28 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1571415114764477.9378924990142; Fri, 18 Oct 2019 09:11:54 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 3AD83C057F31; Fri, 18 Oct 2019 16:11:53 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 0FAFE1001B28; Fri, 18 Oct 2019 16:11:53 +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 C738D4EE96; Fri, 18 Oct 2019 16:11:52 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id x9IGBh0b004657 for ; Fri, 18 Oct 2019 12:11:43 -0400 Received: by smtp.corp.redhat.com (Postfix) id F3E4C6012A; Fri, 18 Oct 2019 16:11:42 +0000 (UTC) Received: from angien.brq.redhat.com (unknown [10.43.2.229]) by smtp.corp.redhat.com (Postfix) with ESMTP id 55EA5600C8; Fri, 18 Oct 2019 16:11:42 +0000 (UTC) From: Peter Krempa To: libvir-list@redhat.com Date: Fri, 18 Oct 2019 18:10:59 +0200 Message-Id: <80a50d2dd79b1b03bdc5911fcd0e945d320675f9.1571414890.git.pkrempa@redhat.com> In-Reply-To: References: MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH RFC 14/40] qemu: block: Don't query monitor in qemuBlockStorageSourceCreateDetectSize 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-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.32]); Fri, 18 Oct 2019 16:11:53 +0000 (UTC) Content-Type: text/plain; charset="utf-8" Calling the monitor was convenient for the implementation in qemuDomainBlockCopyCommon, but causes the snapshot code to call query-named-block-nodes for every disk. Fix this by removing the monitor call from qemuBlockStorageSourceCreateDetectSize so that the data can be reused in loops. Signed-off-by: Peter Krempa --- src/qemu/qemu_block.c | 26 +++++--------------------- src/qemu/qemu_block.h | 5 ++--- src/qemu/qemu_driver.c | 33 ++++++++++++++++++++++++++++----- 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c index 4dc4f2922d..c966b24cb6 100644 --- a/src/qemu/qemu_block.c +++ b/src/qemu/qemu_block.c @@ -2578,10 +2578,9 @@ qemuBlockStorageSourceCreate(virDomainObjPtr vm, /** * qemuBlockStorageSourceCreateDetectSize: - * @vm: domain object + * @blockNamedNodeData: hash table filled with qemuBlockNamedNodeData * @src: storage source to update size/capacity on * @templ: storage source template - * @asyncJob: qemu asynchronous job type * * When creating a storage source via blockdev-create we need to know the = size * and capacity of the original volume (e.g. when creating a snapshot or c= opy). @@ -2589,28 +2588,13 @@ qemuBlockStorageSourceCreate(virDomainObjPtr vm, * to the detected sizes from @templ. */ int -qemuBlockStorageSourceCreateDetectSize(virDomainObjPtr vm, +qemuBlockStorageSourceCreateDetectSize(virHashTablePtr blockNamedNodeData, virStorageSourcePtr src, - virStorageSourcePtr templ, - qemuDomainAsyncJob asyncJob) + virStorageSourcePtr templ) { - qemuDomainObjPrivatePtr priv =3D vm->privateData; - g_autoptr(virHashTable) stats =3D NULL; - qemuBlockStatsPtr entry; - int rc; - - if (!(stats =3D virHashCreate(10, virHashValueFree))) - return -1; - - if (qemuDomainObjEnterMonitorAsync(priv->driver, vm, asyncJob) < 0) - return -1; - - rc =3D qemuMonitorBlockStatsUpdateCapacityBlockdev(priv->mon, stats); - - if (qemuDomainObjExitMonitor(priv->driver, vm) < 0 || rc < 0) - return -1; + qemuBlockNamedNodeDataPtr entry; - if (!(entry =3D virHashLookup(stats, templ->nodeformat))) { + if (!(entry =3D virHashLookup(blockNamedNodeData, templ->nodeformat)))= { virReportError(VIR_ERR_INTERNAL_ERROR, _("failed to update capacity data for block node '%= s'"), templ->nodeformat); diff --git a/src/qemu/qemu_block.h b/src/qemu/qemu_block.h index be39c9b472..5ddeeaf6e2 100644 --- a/src/qemu/qemu_block.h +++ b/src/qemu/qemu_block.h @@ -194,7 +194,6 @@ qemuBlockStorageSourceCreate(virDomainObjPtr vm, qemuDomainAsyncJob asyncJob); int -qemuBlockStorageSourceCreateDetectSize(virDomainObjPtr vm, +qemuBlockStorageSourceCreateDetectSize(virHashTablePtr blockNamedNodeData, virStorageSourcePtr src, - virStorageSourcePtr templ, - qemuDomainAsyncJob asyncJob); + virStorageSourcePtr templ); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e50f2277d2..e908331a93 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -15252,6 +15252,7 @@ qemuDomainSnapshotDiskPrepareOne(virQEMUDriverPtr d= river, virDomainDiskDefPtr disk, virDomainSnapshotDiskDefPtr snapdisk, qemuDomainSnapshotDiskDataPtr dd, + virHashTablePtr blockNamedNodeData, bool reuse, bool blockdev, qemuDomainAsyncJob asyncJob) @@ -15355,8 +15356,8 @@ qemuDomainSnapshotDiskPrepareOne(virQEMUDriverPtr d= river, if (qemuDomainObjExitMonitor(driver, vm) < 0 || rc < 0) return -1; } else { - if (qemuBlockStorageSourceCreateDetectSize(vm, dd->src, dd->di= sk->src, - asyncJob) < 0) + if (qemuBlockStorageSourceCreateDetectSize(blockNamedNodeData, + dd->src, dd->disk->= src) < 0) return -1; if (qemuBlockStorageSourceCreate(vm, dd->src, dd->disk->src, @@ -15385,6 +15386,7 @@ qemuDomainSnapshotDiskPrepare(virQEMUDriverPtr driv= er, virQEMUDriverConfigPtr cfg, bool reuse, bool blockdev, + virHashTablePtr blockNamedNodeData, qemuDomainAsyncJob asyncJob, qemuDomainSnapshotDiskDataPtr *rdata, size_t *rndata) @@ -15404,7 +15406,9 @@ qemuDomainSnapshotDiskPrepare(virQEMUDriverPtr driv= er, if (qemuDomainSnapshotDiskPrepareOne(driver, vm, cfg, vm->def->dis= ks[i], snapdef->disks + i, - data + ndata++, reuse, blockd= ev, + data + ndata++, + blockNamedNodeData, + reuse, blockdev, asyncJob) < 0) goto cleanup; } @@ -15495,6 +15499,7 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverPtr= driver, qemuDomainSnapshotDiskDataPtr diskdata =3D NULL; size_t ndiskdata =3D 0; bool blockdev =3D virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV); + g_autoptr(virHashTable) blockNamedNodeData =3D NULL; if (virDomainObjCheckActive(vm) < 0) return -1; @@ -15502,10 +15507,21 @@ qemuDomainSnapshotCreateDiskActive(virQEMUDriverP= tr driver, if (!(actions =3D virJSONValueNewArray())) return -1; + if (blockdev) { + if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0) + return -1; + + blockNamedNodeData =3D qemuMonitorBlockGetNamedNodeData(priv->mon); + + if (qemuDomainObjExitMonitor(driver, vm) < 0 || !blockNamedNodeDat= a) + return -1; + } + /* prepare a list of objects to use in the vm definition so that we do= n't * have to roll back later */ if (qemuDomainSnapshotDiskPrepare(driver, vm, snap, cfg, reuse, blockd= ev, - asyncJob, &diskdata, &ndiskdata) < 0) + blockNamedNodeData, asyncJob, + &diskdata, &ndiskdata) < 0) goto cleanup; /* check whether there's anything to do */ @@ -18018,6 +18034,7 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, g_autoptr(qemuBlockStorageSourceChainData) crdata =3D NULL; virStorageSourcePtr n; virStorageSourcePtr mirrorBacking =3D NULL; + g_autoptr(virHashTable) blockNamedNodeData =3D NULL; int rc =3D 0; /* Preliminaries: find the disk we are editing, sanity checks */ @@ -18179,7 +18196,13 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm, = priv->qemuCaps))) goto endjob; } else { - if (qemuBlockStorageSourceCreateDetectSize(vm, mirror, disk->s= rc, QEMU_ASYNC_JOB_NONE) < 0) + qemuDomainObjEnterMonitor(driver, vm); + blockNamedNodeData =3D qemuMonitorBlockGetNamedNodeData(priv->= mon); + if (qemuDomainObjExitMonitor(driver, vm) < 0 || !blockNamedNod= eData) + goto endjob; + + if (qemuBlockStorageSourceCreateDetectSize(blockNamedNodeData, + mirror, disk->src)) goto endjob; if (mirror_shallow) { --=20 2.21.0 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list