From nobody Fri May 16 08:10:07 2025 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.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; Return-Path: Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) by mx.zohomail.com with SMTPS id 1498658269201798.2000888896179; Wed, 28 Jun 2017 06:57:49 -0700 (PDT) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 2D45A18E687; Wed, 28 Jun 2017 13:57:45 +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 6139394C55; Wed, 28 Jun 2017 13:57:44 +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 D4E133FADF; Wed, 28 Jun 2017 13:57:42 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id v5SDveib024507 for ; Wed, 28 Jun 2017 09:57:40 -0400 Received: by smtp.corp.redhat.com (Postfix) id 96A808929F; Wed, 28 Jun 2017 13:57:40 +0000 (UTC) Received: from mx1.redhat.com (ext-mx05.extmail.prod.ext.phx2.redhat.com [10.5.110.29]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 8706789281 for ; Wed, 28 Jun 2017 13:57:38 +0000 (UTC) Received: from aserp1040.oracle.com (aserp1040.oracle.com [141.146.126.69]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 1D79B3345B4 for ; Wed, 28 Jun 2017 13:57:36 +0000 (UTC) Received: from userv0021.oracle.com (userv0021.oracle.com [156.151.31.71]) by aserp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id v5SDvY5W025355 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 28 Jun 2017 13:57:35 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by userv0021.oracle.com (8.14.4/8.14.4) with ESMTP id v5SDvYde019673 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 28 Jun 2017 13:57:34 GMT Received: from abhmp0008.oracle.com (abhmp0008.oracle.com [141.146.116.14]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id v5SDvXMe005539; Wed, 28 Jun 2017 13:57:33 GMT Received: from nina.dynamic.ziggo.nl (/10.175.250.211) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 28 Jun 2017 06:57:33 -0700 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 2D45A18E687 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=oracle.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=libvir-list-bounces@redhat.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 2D45A18E687 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 1D79B3345B4 Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=oracle.com Authentication-Results: ext-mx05.extmail.prod.ext.phx2.redhat.com; spf=pass smtp.mailfrom=wim.ten.have@oracle.com DKIM-Filter: OpenDKIM Filter v2.11.0 mx1.redhat.com 1D79B3345B4 From: Wim Ten Have To: Libvirt Development List Date: Wed, 28 Jun 2017 15:56:38 +0200 Message-Id: <20170628135639.18785-4-wim.ten.have@oracle.com> In-Reply-To: <20170628135639.18785-1-wim.ten.have@oracle.com> References: <20170628135639.18785-1-wim.ten.have@oracle.com> X-Source-IP: userv0021.oracle.com [156.151.31.71] X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 203 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 28 Jun 2017 13:57:36 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 28 Jun 2017 13:57:36 +0000 (UTC) for IP:'141.146.126.69' DOMAIN:'aserp1040.oracle.com' HELO:'aserp1040.oracle.com' FROM:'wim.ten.have@oracle.com' RCPT:'' X-RedHat-Spam-Score: -101.621 (BAYES_50, DCC_REPUT_13_19, RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, RP_MATCHES_RCVD, SPF_PASS, UNPARSEABLE_RELAY, USER_IN_WHITELIST) 141.146.126.69 aserp1040.oracle.com 141.146.126.69 aserp1040.oracle.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.29 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: Wim ten Have Subject: [libvirt] [RFC PATCH v2 3/4] xenconfig: add domxml conversions for xen-xl 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.12 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.29]); Wed, 28 Jun 2017 13:57:46 +0000 (UTC) X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" From: Wim ten Have This patch converts NUMA configurations between the Xen libxl configuration file format and libvirt's XML format. XML HVM domain configuration: Xen xl.cfg domain configuration: vnuma =3D [["pnode=3D0","size=3D2048","vcpus=3D0-1","vdistances=3D10,21,3= 1,41"], ["pnode=3D1","size=3D2048","vcpus=3D2-3","vdistances=3D21,10,21,= 31"], ["pnode=3D2","size=3D2048","vcpus=3D4-5","vdistances=3D31,21,10,= 21"], ["pnode=3D3","size=3D2048","vcpus=3D6-7","vdistances=3D41,31,21,= 10"]] If there is no XML description amongst the data the conversion schema from xml to native will generate 10 for local and 21 for all remote instances. Signed-off-by: Wim ten Have --- src/xenconfig/xen_xl.c | 303 +++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 303 insertions(+) diff --git a/src/xenconfig/xen_xl.c b/src/xenconfig/xen_xl.c index cac440c..d9f7028 100644 --- a/src/xenconfig/xen_xl.c +++ b/src/xenconfig/xen_xl.c @@ -309,6 +309,168 @@ xenParseXLSpice(virConfPtr conf, virDomainDefPtr def) return -1; } =20 +#ifdef LIBXL_HAVE_VNUMA +static int +xenParseXLVnuma(virConfPtr conf, virDomainDefPtr def) +{ + int ret =3D -1; + char *tmp =3D NULL; + char **token =3D NULL; + size_t vcpus =3D 0; + + virConfValuePtr list; + virDomainNumaPtr numa; + + numa =3D def->numa; + if (numa =3D=3D NULL) + return -1; + + list =3D virConfGetValue(conf, "vnuma"); + if (list && list->type =3D=3D VIR_CONF_LIST) { + size_t nr_nodes =3D 0, vnodeCnt =3D 0; + virConfValuePtr vnode =3D list->list; + virCPUDefPtr cpu; + + vnode =3D list->list; + while (vnode) { + vnode =3D vnode->next; + nr_nodes++; + } + + if (!virDomainNumaSetNodeCount(numa, nr_nodes)) + goto cleanup; + + list =3D list->list; + + if (VIR_ALLOC(cpu) < 0) + goto cleanup; + + while (list) { + + /* Is there a sublist (vnode)? */ + if (list && list->type =3D=3D VIR_CONF_LIST) { + vnode =3D list->list; + + while (vnode && vnode->type =3D=3D VIR_CONF_STRING) { + const char *data; + const char *str =3D vnode->str; + + if (!str || + !(data =3D strrchr(str, '=3D'))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode invalid format '%s'"= ), + str); + goto skipvnode; + } + data++; + + if (*data) { + size_t len; + char vtoken[64]; + + if (STRPREFIX(str, "pnode")) { + unsigned int cellid; + + len =3D strlen(data); + if (!virStrncpy(vtoken, data, + len, sizeof(vtoken))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode %zu pnode '%= s' too long for destination"), + vnodeCnt, data); + goto cleanup; + } + + if ((virStrToLong_ui(vtoken, NULL, 10, &cellid= ) < 0) || + (cellid >=3D nr_nodes)) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode %zu invalid = value pnode '%s'"), + vnodeCnt, data); + goto cleanup; + } + } else if (STRPREFIX(str, "size")) { + unsigned long long kbsize; + + len =3D strlen(data); + if (!virStrncpy(vtoken, data, + len, sizeof(vtoken))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode %zu size '%s= ' too long for destination"), + vnodeCnt, data); + goto cleanup; + } + + if (virStrToLong_ull(vtoken, NULL, 10, &kbsize= ) < 0) + goto cleanup; + + virDomainNumaSetNodeMemorySize(numa, vnodeCnt,= (kbsize * 1024)); + } else if (STRPREFIX(str, "vcpus")) { + virBitmapPtr cpumask =3D NULL; + + len =3D strlen(data); + if (!virStrncpy(vtoken, data, + len, sizeof(vtoken))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode %zu vcpus '%= s' too long for destination"), + vnodeCnt, data); + goto cleanup; + } + + if ((virBitmapParse(vtoken, &cpumask, VIR_DOMA= IN_CPUMASK_LEN) < 0) || + (virDomainNumaSetNodeCpumask(numa, vnodeCn= t, cpumask) =3D=3D NULL)) + goto cleanup; + + vcpus +=3D virBitmapCountBits(cpumask); + } else if (STRPREFIX(str, "vdistances")) { + size_t i, ndistances; + unsigned int value; + + len =3D strlen(data); + if (!virStrncpy(vtoken, data, + len, sizeof(vtoken))) { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode %zu vdistanc= es '%s' too long for destination"), + vnodeCnt, data); + } + + if (VIR_STRDUP(tmp, vtoken) < 0) + goto cleanup; + + if (!(token =3D virStringSplitCount(tmp, ",", = 0, &ndistances)) || + (virDomainNumaSetNodeDistanceCount(numa, v= nodeCnt, ndistances) !=3D ndistances)) + goto cleanup; + + for (i =3D 0; i < ndistances; i++) { + if ((virStrToLong_ui(token[i], NULL, 10, &= value) < 0) || + (virDomainNumaSetNodeDistance(numa, vn= odeCnt, i, value) !=3D value)) + goto cleanup; + } + } else { + virReportError(VIR_ERR_INTERNAL_ERROR, + _("vnuma vnode %zu invalid toke= n '%s'"), + vnodeCnt, str); + goto cleanup; + } + } + skipvnode: + vnode =3D vnode->next; + } + } + list =3D list->next; + vnodeCnt++; + } + cpu->type =3D VIR_CPU_TYPE_GUEST; + def->cpu =3D cpu; + } + + ret =3D 0; + + cleanup: + virStringListFree(token); + VIR_FREE(tmp); + + return ret; +} +#endif =20 static int xenParseXLDiskSrc(virDomainDiskDefPtr disk, char *srcstr) @@ -863,6 +1025,11 @@ xenParseXL(virConfPtr conf, if (xenParseXLOS(conf, def, caps) < 0) goto cleanup; =20 +#ifdef LIBXL_HAVE_VNUMA + if (xenParseXLVnuma(conf, def) < 0) + goto cleanup; +#endif + if (xenParseXLDisk(conf, def) < 0) goto cleanup; =20 @@ -1005,6 +1172,137 @@ xenFormatXLOS(virConfPtr conf, virDomainDefPtr def) return 0; } =20 +#ifdef LIBXL_HAVE_VNUMA +static int +xenFormatXLVnode(virConfValuePtr list, virBufferPtr buf) +{ + int ret =3D -1; + virConfValuePtr numaPnode, tmp; + + if (virBufferCheckError(buf) < 0) + goto cleanup; + + if (VIR_ALLOC(numaPnode) < 0) + goto cleanup; + + /* Place VNODE directive */ + numaPnode->type =3D VIR_CONF_STRING; + numaPnode->str =3D virBufferContentAndReset(buf); + + tmp =3D list->list; + while (tmp && tmp->next) + tmp =3D tmp->next; + if (tmp) + tmp->next =3D numaPnode; + else + list->list =3D numaPnode; + ret =3D 0; + + cleanup: + virBufferFreeAndReset(buf); + return ret; +} + +static int +xenFormatXLVnuma(virConfValuePtr list, + virDomainNumaPtr numa, size_t node, size_t nr_nodes) +{ + int ret =3D -1; + size_t i; + + virBuffer buf =3D VIR_BUFFER_INITIALIZER; + virConfValuePtr numaVnode, tmp; + + size_t nodeSize =3D virDomainNumaGetNodeMemorySize(numa, node) / 1024; + char *nodeVcpus =3D virBitmapFormat(virDomainNumaGetNodeCpumask(numa, = node)); + + if (VIR_ALLOC(numaVnode) < 0) + goto cleanup; + + numaVnode->type =3D VIR_CONF_LIST; + numaVnode->list =3D NULL; + + /* pnode */ + virBufferAsprintf(&buf, "pnode=3D%ld", node); + xenFormatXLVnode(numaVnode, &buf); + + /* size */ + virBufferAsprintf(&buf, "size=3D%ld", nodeSize); + xenFormatXLVnode(numaVnode, &buf); + + /* vcpus */ + virBufferAsprintf(&buf, "vcpus=3D%s", nodeVcpus); + xenFormatXLVnode(numaVnode, &buf); + + /* distances */ + virBufferAddLit(&buf, "vdistances=3D"); + for (i =3D 0; i < nr_nodes; i++) { + size_t distance =3D virDomainNumaGetNodeDistance(numa, node, i); + + /* + * Present the configured distance value. If not + * available set 10 for local or 21 for remote nodes. + */ + if (!distance) + distance =3D (node =3D=3D i) ? 10 : 21; + virBufferAsprintf(&buf, "%zu", distance); + if ((nr_nodes - i) > 1) + virBufferAddLit(&buf, ","); + } + xenFormatXLVnode(numaVnode, &buf); + + tmp =3D list->list; + while (tmp && tmp->next) + tmp =3D tmp->next; + if (tmp) + tmp->next =3D numaVnode; + else + list->list =3D numaVnode; + ret =3D 0; + + cleanup: + VIR_FREE(nodeVcpus); + return ret; +} + +static int +xenFormatXLDomainVnuma(virConfPtr conf, virDomainDefPtr def) +{ + virDomainNumaPtr numa =3D def->numa; + virConfValuePtr vnumaVal; + size_t i; + size_t nr_nodes; + + if (numa =3D=3D NULL) + return -1; + + if (VIR_ALLOC(vnumaVal) < 0) + return -1; + + vnumaVal->type =3D VIR_CONF_LIST; + vnumaVal->list =3D NULL; + + nr_nodes =3D virDomainNumaGetNodeCount(numa); + for (i =3D 0; i < nr_nodes; i++) { + if (xenFormatXLVnuma(vnumaVal, numa, i, nr_nodes) < 0) + goto cleanup; + } + + if (vnumaVal->list !=3D NULL) { + int ret =3D virConfSetValue(conf, "vnuma", vnumaVal); + vnumaVal =3D NULL; + if (ret < 0) + return -1; + } + VIR_FREE(vnumaVal); + + return 0; + + cleanup: + virConfFreeValue(vnumaVal); + return -1; +} +#endif =20 static char * xenFormatXLDiskSrcNet(virStorageSourcePtr src) @@ -1641,6 +1939,11 @@ xenFormatXL(virDomainDefPtr def, virConnectPtr conn) if (xenFormatXLOS(conf, def) < 0) goto cleanup; =20 +#ifdef LIBXL_HAVE_VNUMA + if (xenFormatXLDomainVnuma(conf, def) < 0) + goto cleanup; +#endif + if (xenFormatXLDomainDisks(conf, def) < 0) goto cleanup; =20 --=20 2.9.4 -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list