From: Jedrzej Wasiukiewicz Date: Thu, 14 May 2026 14:41:03 +0000 (+0200) Subject: conf: report energy monitoring in host capabilities X-Git-Tag: v12.4.0-rc1~80 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6389d2987e421e14969ab652a0c2bccc92fdb09d;p=thirdparty%2Flibvirt.git conf: report energy monitoring in host capabilities Expose PERF_PKG_MON energy monitoring capabilities in the host capabilities XML. Changes: - Add virCapabilitiesFormatEnergy() to emit XML block - Add virCapabilitiesInitEnergy() to init from PERF_PKG_MON info - Add element and energyMonitorFeature to capability.rng - Update qemu_driver to support VIR_RESCTRL_MONITOR_TYPE_ENERGY - Add virCapsHostEnergy struct Signed-off-by: Jedrzej Wasiukiewicz Signed-off-by: Christopher M. Cantalupo Reviewed-by: Michal Privoznik --- diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c index 1821e36e61..e83de6d1bc 100644 --- a/src/conf/capabilities.c +++ b/src/conf/capabilities.c @@ -263,6 +263,8 @@ virCapsDispose(void *object) virResctrlInfoMonFree(caps->host.memBW.monitor); g_free(caps->host.memBW.nodes); + virResctrlInfoMonFree(caps->host.energy.monitor); + g_free(caps->host.netprefix); g_free(caps->host.pagesSize); virCPUDefFree(caps->host.cpu); @@ -1057,6 +1059,26 @@ virCapabilitiesFormatMemoryBandwidth(virBuffer *buf, } +static int +virCapabilitiesFormatEnergy(virBuffer *buf, + virCapsHostEnergy *energy) +{ + if (!energy->monitor) + return 0; + + virBufferAddLit(buf, "\n"); + virBufferAdjustIndent(buf, 2); + + if (virCapabilitiesFormatResctrlMonitor(buf, energy->monitor) < 0) + return -1; + + virBufferAdjustIndent(buf, -2); + virBufferAddLit(buf, "\n"); + + return 0; +} + + static int virCapabilitiesFormatHostXML(virCapsHost *host, virBuffer *buf) @@ -1156,6 +1178,9 @@ virCapabilitiesFormatHostXML(virCapsHost *host, if (virCapabilitiesFormatMemoryBandwidth(buf, &host->memBW) < 0) return -1; + if (virCapabilitiesFormatEnergy(buf, &host->energy) < 0) + return -1; + for (i = 0; i < host->nsecModels; i++) { virBufferAddLit(buf, "\n"); virBufferAdjustIndent(buf, 2); @@ -2143,6 +2168,20 @@ virCapabilitiesInitResctrlMemory(virCaps *caps) } +static int +virCapabilitiesInitEnergy(virCaps *caps) +{ + const char *prefix = virResctrlMonitorPrefixTypeToString( + VIR_RESCTRL_MONITOR_TYPE_ENERGY); + + if (virResctrlInfoGetMonitorPrefix(caps->host.resctrl, prefix, + &caps->host.energy.monitor) < 0) + return -1; + + return 0; +} + + int virCapabilitiesInitCaches(virCaps *caps) { @@ -2294,6 +2333,9 @@ virCapabilitiesInitCaches(virCaps *caps) &caps->host.cache.monitor) < 0) return -1; + if (virCapabilitiesInitEnergy(caps) < 0) + return -1; + return 0; } diff --git a/src/conf/capabilities.h b/src/conf/capabilities.h index daea835817..0482e4297a 100644 --- a/src/conf/capabilities.h +++ b/src/conf/capabilities.h @@ -162,6 +162,10 @@ struct _virCapsHostMemBW { virResctrlInfoMon *monitor; }; +struct _virCapsHostEnergy { + virResctrlInfoMon *monitor; +}; + struct _virCapsHost { virArch arch; size_t nfeatures; @@ -184,6 +188,8 @@ struct _virCapsHost { virCapsHostMemBW memBW; + virCapsHostEnergy energy; + size_t nsecModels; virCapsHostSecModel *secModels; diff --git a/src/conf/schemas/capability.rng b/src/conf/schemas/capability.rng index 8ef6e9a282..6160067dc7 100644 --- a/src/conf/schemas/capability.rng +++ b/src/conf/schemas/capability.rng @@ -45,6 +45,9 @@ + + + @@ -333,6 +336,30 @@ + + + core_energy + activity + + + + + + + + + + + + + + + + + + + + diff --git a/src/conf/virconftypes.h b/src/conf/virconftypes.h index 0596791a4d..f1a200bfe2 100644 --- a/src/conf/virconftypes.h +++ b/src/conf/virconftypes.h @@ -52,6 +52,8 @@ typedef struct _virCapsHostMemBW virCapsHostMemBW; typedef struct _virCapsHostMemBWNode virCapsHostMemBWNode; +typedef struct _virCapsHostEnergy virCapsHostEnergy; + typedef struct _virCapsHostNUMA virCapsHostNUMA; typedef struct _virCapsHostNUMACell virCapsHostNUMACell; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 2d509cd2b9..a3d648e268 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -17086,6 +17086,9 @@ qemuDomainGetResctrlMonData(virQEMUDriver *driver, features = caps->host.memBW.monitor->features; break; case VIR_RESCTRL_MONITOR_TYPE_ENERGY: + if (caps->host.energy.monitor) + features = caps->host.energy.monitor->features; + break; case VIR_RESCTRL_MONITOR_TYPE_UNSUPPORT: case VIR_RESCTRL_MONITOR_TYPE_LAST: virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",