From nobody Sun Feb 8 21:37:10 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 Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1511372175582712.4239238586359; Wed, 22 Nov 2017 09:36:15 -0800 (PST) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 612ECFC7C3; Wed, 22 Nov 2017 17:36:14 +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 329105D976; Wed, 22 Nov 2017 17:36:14 +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 E99CB3FADE; Wed, 22 Nov 2017 17:36:13 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id vAMHZvJH009614 for ; Wed, 22 Nov 2017 12:35:57 -0500 Received: by smtp.corp.redhat.com (Postfix) id 23FBA5C552; Wed, 22 Nov 2017 17:35:57 +0000 (UTC) Received: from moe.brq.redhat.com (unknown [10.43.2.192]) by smtp.corp.redhat.com (Postfix) with ESMTP id 9D4D15C88F for ; Wed, 22 Nov 2017 17:35:56 +0000 (UTC) From: Michal Privoznik To: libvir-list@redhat.com Date: Wed, 22 Nov 2017 18:35:48 +0100 Message-Id: In-Reply-To: References: In-Reply-To: References: X-Scanned-By: MIMEDefang 2.79 on 10.5.11.16 X-loop: libvir-list@redhat.com Subject: [libvirt] [PATCH v2 4/5] qemu: Support setting NUMA distances 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: , MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Wed, 22 Nov 2017 17:36:14 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Since we already have such support for libxl all we need is qemu driver adjustment. And a test case. Signed-off-by: Michal Privoznik --- docs/formatdomain.html.in | 2 +- src/qemu/qemu_command.c | 39 ++++++++++++- .../qemuxml2argv-numatune-distances.args | 63 ++++++++++++++++++= +++ .../qemuxml2argv-numatune-distances.xml | 65 ++++++++++++++++++= ++++ tests/qemuxml2argvtest.c | 2 + 5 files changed, 169 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.= args create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.= xml diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in index 4bc88cfc5..505676354 100644 --- a/docs/formatdomain.html.in +++ b/docs/formatdomain.html.in @@ -1589,7 +1589,7 @@ =20

Describing distances between NUMA cells is currently only supported - by Xen. If no distances are given to describe + by Xen and QEMU. If no distances are given to describe the SLIT data between different cells, it will default to a scheme using 10 for local and 20 for remote distances.

diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 216a4bdfe..f505d8cba 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -7718,7 +7718,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, virCommandPtr cmd, qemuDomainObjPrivatePtr priv) { - size_t i; + size_t i, j; virQEMUCapsPtr qemuCaps =3D priv->qemuCaps; virBuffer buf =3D VIR_BUFFER_INITIALIZER; char *cpumask =3D NULL, *tmpmask =3D NULL, *next =3D NULL; @@ -7728,6 +7728,7 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, int ret =3D -1; size_t ncells =3D virDomainNumaGetNodeCount(def->numa); const long system_page_size =3D virGetSystemPageSizeKB(); + bool numa_distances =3D false; =20 if (virDomainNumatuneHasPerNodeBinding(def->numa) && !(virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_MEMORY_RAM) || @@ -7836,6 +7837,42 @@ qemuBuildNumaArgStr(virQEMUDriverConfigPtr cfg, =20 virCommandAddArgBuffer(cmd, &buf); } + + /* If NUMA node distance is specified for at least one pair + * of nodes, we have to specify all the distances. Even + * though they might be the default ones. */ + for (i =3D 0; i < ncells; i++) { + for (j =3D 0; j < ncells; j++) { + if (virDomainNumaNodeDistanceIsUsingDefaults(def->numa, i, j)) + continue; + + numa_distances =3D true; + break; + } + if (numa_distances) + break; + } + + if (numa_distances) { + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_NUMA_DIST)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("setting NUMA distances is not " + "supported with this qemu")); + goto cleanup; + } + + for (i =3D 0; i < ncells; i++) { + for (j =3D 0; j < ncells; j++) { + size_t distance =3D virDomainNumaGetNodeDistance(def->numa= , i, j); + + virCommandAddArg(cmd, "-numa"); + virBufferAsprintf(&buf, "dist,src=3D%zu,dst=3D%zu,val=3D%z= u", i, j, distance); + + virCommandAddArgBuffer(cmd, &buf); + } + } + } + ret =3D 0; =20 cleanup: diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.args b/= tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.args new file mode 100644 index 000000000..23b66246c --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.args @@ -0,0 +1,63 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/home/test \ +USER=3Dtest \ +LOGNAME=3Dtest \ +QEMU_AUDIO_DRV=3Dnone \ +/usr/bin/qemu-system-x86_64 \ +-name QEMUGuest \ +-S \ +-M xenfv \ +-m 12288 \ +-smp 12,sockets=3D12,cores=3D1,threads=3D1 \ +-numa node,nodeid=3D0,cpus=3D0,cpus=3D11,mem=3D2048 \ +-numa node,nodeid=3D1,cpus=3D1,cpus=3D10,mem=3D2048 \ +-numa node,nodeid=3D2,cpus=3D2,cpus=3D9,mem=3D2048 \ +-numa node,nodeid=3D3,cpus=3D3,cpus=3D8,mem=3D2048 \ +-numa node,nodeid=3D4,cpus=3D4,cpus=3D7,mem=3D2048 \ +-numa node,nodeid=3D5,cpus=3D5-6,mem=3D2048 \ +-numa dist,src=3D0,dst=3D0,val=3D10 \ +-numa dist,src=3D0,dst=3D1,val=3D21 \ +-numa dist,src=3D0,dst=3D2,val=3D31 \ +-numa dist,src=3D0,dst=3D3,val=3D41 \ +-numa dist,src=3D0,dst=3D4,val=3D51 \ +-numa dist,src=3D0,dst=3D5,val=3D61 \ +-numa dist,src=3D1,dst=3D0,val=3D21 \ +-numa dist,src=3D1,dst=3D1,val=3D10 \ +-numa dist,src=3D1,dst=3D2,val=3D21 \ +-numa dist,src=3D1,dst=3D3,val=3D31 \ +-numa dist,src=3D1,dst=3D4,val=3D41 \ +-numa dist,src=3D1,dst=3D5,val=3D51 \ +-numa dist,src=3D2,dst=3D0,val=3D31 \ +-numa dist,src=3D2,dst=3D1,val=3D21 \ +-numa dist,src=3D2,dst=3D2,val=3D10 \ +-numa dist,src=3D2,dst=3D3,val=3D21 \ +-numa dist,src=3D2,dst=3D4,val=3D31 \ +-numa dist,src=3D2,dst=3D5,val=3D41 \ +-numa dist,src=3D3,dst=3D0,val=3D41 \ +-numa dist,src=3D3,dst=3D1,val=3D31 \ +-numa dist,src=3D3,dst=3D2,val=3D21 \ +-numa dist,src=3D3,dst=3D3,val=3D10 \ +-numa dist,src=3D3,dst=3D4,val=3D21 \ +-numa dist,src=3D3,dst=3D5,val=3D31 \ +-numa dist,src=3D4,dst=3D0,val=3D51 \ +-numa dist,src=3D4,dst=3D1,val=3D41 \ +-numa dist,src=3D4,dst=3D2,val=3D31 \ +-numa dist,src=3D4,dst=3D3,val=3D21 \ +-numa dist,src=3D4,dst=3D4,val=3D10 \ +-numa dist,src=3D4,dst=3D5,val=3D21 \ +-numa dist,src=3D5,dst=3D0,val=3D61 \ +-numa dist,src=3D5,dst=3D1,val=3D51 \ +-numa dist,src=3D5,dst=3D2,val=3D41 \ +-numa dist,src=3D5,dst=3D3,val=3D31 \ +-numa dist,src=3D5,dst=3D4,val=3D21 \ +-numa dist,src=3D5,dst=3D5,val=3D10 \ +-uuid c7a5fdb2-cdaf-9455-926a-d65c16db1809 \ +-nographic \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,path=3D/tmp/lib/domain--1-QEMUGuest/monit= or.sock,\ +server,nowait \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dreadline \ +-boot c \ +-usb \ +-device virtio-balloon-pci,id=3Dballoon0,bus=3Dpci.0,addr=3D0x2 diff --git a/tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.xml b/t= ests/qemuxml2argvdata/qemuxml2argv-numatune-distances.xml new file mode 100644 index 000000000..0f33526b4 --- /dev/null +++ b/tests/qemuxml2argvdata/qemuxml2argv-numatune-distances.xml @@ -0,0 +1,65 @@ + + QEMUGuest + c7a5fdb2-cdaf-9455-926a-d65c16db1809 + 8388608 + 8388608 + 12 + + hvm + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + destroy + restart + restart + + /usr/bin/qemu-system-x86_64 + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 781c649bf..66af2d328 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1700,6 +1700,8 @@ mymain(void) QEMU_CAPS_OBJECT_MEMORY_RAM); DO_TEST_FAILURE("numatune-memnode-no-memory", NONE); =20 + DO_TEST("numatune-distances", QEMU_CAPS_NUMA, QEMU_CAPS_NUMA_DIST); + DO_TEST("numatune-auto-nodeset-invalid", NONE); DO_TEST("numatune-auto-prefer", QEMU_CAPS_OBJECT_MEMORY_RAM, QEMU_CAPS_OBJECT_MEMORY_FILE); --=20 2.13.6 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list