diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 8e9bba0dbe..33c0c37fbf 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -1056,6 +1056,128 @@ virCapabilitiesFormatMemoryBandwidth(virBufferPtr buf, return 0; } + +static int +virCapabilitiesFormatHostXML(virCapsPtr caps, + virBufferPtr buf) +{ + size_t i, j; + char host_uuid[VIR_UUID_STRING_BUFLEN]; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + if (virUUIDIsValid(caps->host.host_uuid)) { + virUUIDFormat(caps->host.host_uuid, host_uuid); + virBufferAsprintf(buf, "%s\n", host_uuid); + } + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + + if (caps->host.arch) + virBufferAsprintf(buf, "%s\n", + virArchToString(caps->host.arch)); + if (caps->host.nfeatures) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + for (i = 0; i < caps->host.nfeatures; i++) { + virBufferAsprintf(buf, "<%s/>\n", + caps->host.features[i]); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + virCPUDefFormatBuf(buf, caps->host.cpu); + + for (i = 0; i < caps->host.nPagesSize; i++) { + virBufferAsprintf(buf, "\n", + caps->host.pagesSize[i]); + } + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + + /* The PM query was successful. */ + if (caps->host.powerMgmt) { + /* The host supports some PM features. */ + unsigned int pm = caps->host.powerMgmt; + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + while (pm) { + int bit = ffs(pm) - 1; + virBufferAsprintf(buf, "<%s/>\n", + virCapsHostPMTargetTypeToString(bit)); + pm &= ~(1U << bit); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } else { + /* The host does not support any PM feature. */ + virBufferAddLit(buf, "\n"); + } + + virBufferAsprintf(buf, "\n", + caps->host.iommu ? "yes" : "no"); + + if (caps->host.offlineMigrate) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + if (caps->host.liveMigrate) + virBufferAddLit(buf, "\n"); + if (caps->host.nmigrateTrans) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + for (i = 0; i < caps->host.nmigrateTrans; i++) { + virBufferAsprintf(buf, "%s\n", + caps->host.migrateTrans[i]); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + if (caps->host.netprefix) + virBufferAsprintf(buf, "%s\n", + caps->host.netprefix); + + if (caps->host.nnumaCell && + virCapabilitiesFormatNUMATopology(buf, caps->host.nnumaCell, + caps->host.numaCell) < 0) + goto error; + + if (virCapabilitiesFormatCaches(buf, &caps->host.cache) < 0) + goto error; + + if (virCapabilitiesFormatMemoryBandwidth(buf, &caps->host.memBW) < 0) + goto error; + + for (i = 0; i < caps->host.nsecModels; i++) { + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + virBufferAsprintf(buf, "%s\n", + caps->host.secModels[i].model); + virBufferAsprintf(buf, "%s\n", + caps->host.secModels[i].doi); + for (j = 0; j < caps->host.secModels[i].nlabels; j++) { + virBufferAsprintf(buf, "%s\n", + caps->host.secModels[i].labels[j].type, + caps->host.secModels[i].labels[j].label); + } + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + } + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n\n"); + + return 0; + + error: + return -1; +} + + /** * virCapabilitiesFormatXML: * @caps: capabilities to format @@ -1069,118 +1191,13 @@ virCapabilitiesFormatXML(virCapsPtr caps) { virBuffer buf = VIR_BUFFER_INITIALIZER; size_t i, j, k; - char host_uuid[VIR_UUID_STRING_BUFLEN]; virBufferAddLit(&buf, "\n\n"); virBufferAdjustIndent(&buf, 2); - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - if (virUUIDIsValid(caps->host.host_uuid)) { - virUUIDFormat(caps->host.host_uuid, host_uuid); - virBufferAsprintf(&buf, "%s\n", host_uuid); - } - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - if (caps->host.arch) - virBufferAsprintf(&buf, "%s\n", - virArchToString(caps->host.arch)); - if (caps->host.nfeatures) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - for (i = 0; i < caps->host.nfeatures; i++) { - virBufferAsprintf(&buf, "<%s/>\n", - caps->host.features[i]); - } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - virCPUDefFormatBuf(&buf, caps->host.cpu); - - for (i = 0; i < caps->host.nPagesSize; i++) { - virBufferAsprintf(&buf, "\n", - caps->host.pagesSize[i]); - } - - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - - /* The PM query was successful. */ - if (caps->host.powerMgmt) { - /* The host supports some PM features. */ - unsigned int pm = caps->host.powerMgmt; - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - while (pm) { - int bit = ffs(pm) - 1; - virBufferAsprintf(&buf, "<%s/>\n", - virCapsHostPMTargetTypeToString(bit)); - pm &= ~(1U << bit); - } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } else { - /* The host does not support any PM feature. */ - virBufferAddLit(&buf, "\n"); - } - - virBufferAsprintf(&buf, "\n", - caps->host.iommu ? "yes" : "no"); - - if (caps->host.offlineMigrate) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - if (caps->host.liveMigrate) - virBufferAddLit(&buf, "\n"); - if (caps->host.nmigrateTrans) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - for (i = 0; i < caps->host.nmigrateTrans; i++) { - virBufferAsprintf(&buf, "%s\n", - caps->host.migrateTrans[i]); - } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - - if (caps->host.netprefix) - virBufferAsprintf(&buf, "%s\n", - caps->host.netprefix); - - if (caps->host.nnumaCell && - virCapabilitiesFormatNUMATopology(&buf, caps->host.nnumaCell, - caps->host.numaCell) < 0) + if (virCapabilitiesFormatHostXML(caps, &buf) < 0) goto error; - if (virCapabilitiesFormatCaches(&buf, &caps->host.cache) < 0) - goto error; - - if (virCapabilitiesFormatMemoryBandwidth(&buf, &caps->host.memBW) < 0) - goto error; - - for (i = 0; i < caps->host.nsecModels; i++) { - virBufferAddLit(&buf, "\n"); - virBufferAdjustIndent(&buf, 2); - virBufferAsprintf(&buf, "%s\n", - caps->host.secModels[i].model); - virBufferAsprintf(&buf, "%s\n", - caps->host.secModels[i].doi); - for (j = 0; j < caps->host.secModels[i].nlabels; j++) { - virBufferAsprintf(&buf, "%s\n", - caps->host.secModels[i].labels[j].type, - caps->host.secModels[i].labels[j].label); - } - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n"); - } - - virBufferAdjustIndent(&buf, -2); - virBufferAddLit(&buf, "\n\n"); - - for (i = 0; i < caps->nguests; i++) { virBufferAddLit(&buf, "\n"); virBufferAdjustIndent(&buf, 2);