mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
Export KVM Host Power Management capabilities
This patch exports KVM Host Power Management capabilities as XML so that higher-level systems management software can make use of these features available in the host. The script "pm-is-supported" (from pm-utils package) is run to discover if Suspend-to-RAM (S3) or Suspend-to-Disk (S4) is supported by the host. If either of them are supported, then a new tag "<power_management>" is introduced in the XML under the <host> tag. However in case the query to check for power management features succeeded, but the host does not support any such feature, then the XML will contain an empty <power_management/> tag. In the event that the PM query itself failed, the XML will not contain any "power_management" tag. To use this, new APIs could be implemented in libvirt to exploit power management features such as S3/S4.
This commit is contained in:
parent
693d22d417
commit
e352b16400
1
AUTHORS
1
AUTHORS
@ -206,6 +206,7 @@ Patches have also been contributed by:
|
||||
Eli Qiao <taget@linux.vnet.ibm.com>
|
||||
Michael Wood <esiotrot@gmail.com>
|
||||
Bharata B Rao <bharata@linux.vnet.ibm.com>
|
||||
Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
|
||||
|
||||
[....send patches to get your name here....]
|
||||
|
||||
|
@ -28,6 +28,10 @@ BIOS you will see</p>
|
||||
<feature name='xtpr'/>
|
||||
...
|
||||
</cpu>
|
||||
<power_management>
|
||||
<S3/>
|
||||
<S4/>
|
||||
<power_management/>
|
||||
</host></span>
|
||||
|
||||
<!-- xen-3.0-x86_64 -->
|
||||
@ -61,11 +65,16 @@ BIOS you will see</p>
|
||||
...
|
||||
</capabilities></pre>
|
||||
<p>The first block (in red) indicates the host hardware capabilities, currently
|
||||
it is limited to the CPU properties but other information may be available,
|
||||
it shows the CPU architecture, topology, model name, and additional features
|
||||
which are not included in the model but the CPU provides them. Features of the
|
||||
chip are shown within the feature block (the block is similar to what you will
|
||||
find in a Xen fully virtualized domain description).</p>
|
||||
it is limited to the CPU properties and the power management features of
|
||||
the host platform, but other information may be available, it shows the CPU architecture,
|
||||
topology, model name, and additional features which are not included in the model but the
|
||||
CPU provides them. Features of the chip are shown within the feature block (the block is
|
||||
similar to what you will find in a Xen fully virtualized domain description). Further,
|
||||
the power management features supported by the host are shown, such as Suspend-to-RAM (S3)
|
||||
and Suspend-to-Disk (S4). In case the query for power management features succeeded but the
|
||||
host does not support any such feature, then an empty <power_management/>
|
||||
tag will be shown. Otherwise, if the query itself failed, no such tag will
|
||||
be displayed (i.e., there will not be any power_management block or empty tag in the XML).</p>
|
||||
<p>The second block (in blue) indicates the paravirtualization support of the
|
||||
Xen support, you will see the os_type of xen to indicate a paravirtual
|
||||
kernel, then architecture information and potential features.</p>
|
||||
|
@ -34,6 +34,9 @@
|
||||
<ref name='cpuspec'/>
|
||||
</optional>
|
||||
</element>
|
||||
<optional>
|
||||
<ref name='power_management'/>
|
||||
</optional>
|
||||
<optional>
|
||||
<ref name='migration'/>
|
||||
</optional>
|
||||
@ -105,6 +108,23 @@
|
||||
</zeroOrMore>
|
||||
</define>
|
||||
|
||||
<define name='power_management'>
|
||||
<element name='power_management'>
|
||||
<interleave>
|
||||
<optional>
|
||||
<element name='S3'>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
<optional>
|
||||
<element name='S4'>
|
||||
<empty/>
|
||||
</element>
|
||||
</optional>
|
||||
</interleave>
|
||||
</element>
|
||||
</define>
|
||||
|
||||
<define name='migration'>
|
||||
<element name='migration_features'>
|
||||
<optional>
|
||||
|
@ -84,6 +84,7 @@ typedef enum {
|
||||
VIR_FROM_LIBXL = 41, /* Error from libxenlight driver */
|
||||
VIR_FROM_LOCKING = 42, /* Error from lock manager */
|
||||
VIR_FROM_HYPERV = 43, /* Error from Hyper-V driver */
|
||||
VIR_FROM_CAPABILITIES = 44, /* Error from capabilities */
|
||||
} virErrorDomain;
|
||||
|
||||
|
||||
|
@ -506,6 +506,8 @@ Requires: nc
|
||||
Requires: gettext
|
||||
# Needed by virt-pki-validate script.
|
||||
Requires: gnutls-utils
|
||||
# Needed for probing the power management features of the host.
|
||||
Requires: pm-utils
|
||||
%if %{with_sasl}
|
||||
Requires: cyrus-sasl
|
||||
# Not technically required, but makes 'out-of-box' config
|
||||
|
@ -29,6 +29,13 @@
|
||||
#include "util.h"
|
||||
#include "uuid.h"
|
||||
#include "cpu_conf.h"
|
||||
#include "virterror_internal.h"
|
||||
|
||||
|
||||
#define VIR_FROM_THIS VIR_FROM_CAPABILITIES
|
||||
|
||||
VIR_ENUM_IMPL(virHostPMCapability, VIR_HOST_PM_LAST,
|
||||
"S3", "S4")
|
||||
|
||||
/**
|
||||
* virCapabilitiesNew:
|
||||
@ -201,7 +208,6 @@ virCapabilitiesAddHostFeature(virCapsPtr caps,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* virCapabilitiesAddHostMigrateTransport:
|
||||
* @caps: capabilities to extend
|
||||
@ -687,6 +693,25 @@ virCapabilitiesFormatXML(virCapsPtr caps)
|
||||
|
||||
virBufferAddLit(&xml, " </cpu>\n");
|
||||
|
||||
if (caps->host.powerMgmt_valid) {
|
||||
/* The PM query was successful. */
|
||||
if (caps->host.powerMgmt) {
|
||||
/* The host supports some PM features. */
|
||||
unsigned int pm = caps->host.powerMgmt;
|
||||
virBufferAddLit(&xml, " <power_management>\n");
|
||||
while (pm) {
|
||||
int bit = ffs(pm) - 1;
|
||||
virBufferAsprintf(&xml, " <%s/>\n",
|
||||
virHostPMCapabilityTypeToString(bit));
|
||||
pm &= ~(1U << bit);
|
||||
}
|
||||
virBufferAddLit(&xml, " </power_management>\n");
|
||||
} else {
|
||||
/* The host does not support any PM feature. */
|
||||
virBufferAddLit(&xml, " <power_management/>\n");
|
||||
}
|
||||
}
|
||||
|
||||
if (caps->host.offlineMigrate) {
|
||||
virBufferAddLit(&xml, " <migration_features>\n");
|
||||
if (caps->host.liveMigrate)
|
||||
|
@ -105,6 +105,10 @@ struct _virCapsHost {
|
||||
size_t nfeatures;
|
||||
size_t nfeatures_max;
|
||||
char **features;
|
||||
bool powerMgmt_valid;
|
||||
unsigned int powerMgmt; /* Bitmask of the PM capabilities.
|
||||
* See enum virHostPMCapability.
|
||||
*/
|
||||
int offlineMigrate;
|
||||
int liveMigrate;
|
||||
size_t nmigrateTrans;
|
||||
|
@ -1094,6 +1094,7 @@ virFormatMacAddr;
|
||||
virGenerateMacAddr;
|
||||
virGetGroupID;
|
||||
virGetHostname;
|
||||
virGetPMCapabilities;
|
||||
virGetUserDirectory;
|
||||
virGetUserID;
|
||||
virGetUserName;
|
||||
|
@ -848,6 +848,14 @@ virCapsPtr qemuCapsInit(virCapsPtr old_caps)
|
||||
old_caps->host.cpu = NULL;
|
||||
}
|
||||
|
||||
/* Add the power management features of the host */
|
||||
|
||||
if (virGetPMCapabilities(&caps->host.powerMgmt) < 0) {
|
||||
VIR_WARN("Failed to get host power management capabilities");
|
||||
caps->host.powerMgmt_valid = false;
|
||||
} else
|
||||
caps->host.powerMgmt_valid = true; /* The PM query succeeded. */
|
||||
|
||||
virCapabilitiesAddHostMigrateTransport(caps,
|
||||
"tcp");
|
||||
|
||||
|
@ -2621,3 +2621,53 @@ virTypedParameterArrayClear(virTypedParameterPtr params, int nparams)
|
||||
VIR_FREE(params[i].value.s);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Power Management Capabilities of the host system.
|
||||
* The script 'pm-is-supported' (from the pm-utils package) is run
|
||||
* to find out all the power management features supported by the host,
|
||||
* such as Suspend-to-RAM (S3) and Suspend-to-Disk (S4).
|
||||
*
|
||||
* @bitmask: Pointer to the bitmask which will be set appropriately to
|
||||
* indicate all the supported host power management features.
|
||||
*
|
||||
* Returns 0 if the query was successful, -1 upon failure.
|
||||
*/
|
||||
int
|
||||
virGetPMCapabilities(unsigned int *bitmask)
|
||||
{
|
||||
int ret = -1;
|
||||
int status;
|
||||
virCommandPtr cmd;
|
||||
|
||||
*bitmask = 0;
|
||||
|
||||
/* Check support for Suspend-to-RAM (S3) */
|
||||
cmd = virCommandNewArgList("pm-is-supported", "--suspend", NULL);
|
||||
if (virCommandRun(cmd, &status) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* Check return code of command == 0 for success
|
||||
* (i.e., the PM capability is supported)
|
||||
*/
|
||||
if (status == 0)
|
||||
*bitmask |= 1U << VIR_HOST_PM_S3;
|
||||
virCommandFree(cmd);
|
||||
|
||||
/* Check support for Suspend-to-Disk (S4) */
|
||||
cmd = virCommandNewArgList("pm-is-supported", "--hibernate", NULL);
|
||||
if (virCommandRun(cmd, &status) < 0)
|
||||
goto cleanup;
|
||||
|
||||
/* Check return code of command == 0 for success
|
||||
* (i.e., the PM capability is supported)
|
||||
*/
|
||||
if (status == 0)
|
||||
*bitmask |= 1U << VIR_HOST_PM_S4;
|
||||
|
||||
ret = 0;
|
||||
|
||||
cleanup:
|
||||
virCommandFree(cmd);
|
||||
return ret;
|
||||
}
|
||||
|
@ -260,4 +260,18 @@ int virEmitXMLWarning(int fd,
|
||||
const char *cmd) ATTRIBUTE_NONNULL(2) ATTRIBUTE_NONNULL(3);
|
||||
|
||||
void virTypedParameterArrayClear(virTypedParameterPtr params, int nparams);
|
||||
|
||||
/* Power Management Capabilities of the host system */
|
||||
|
||||
enum virHostPMCapability {
|
||||
VIR_HOST_PM_S3, /* Suspend-to-RAM */
|
||||
VIR_HOST_PM_S4, /* Suspend-to-Disk */
|
||||
|
||||
VIR_HOST_PM_LAST
|
||||
};
|
||||
|
||||
VIR_ENUM_DECL(virHostPMCapability)
|
||||
|
||||
int virGetPMCapabilities(unsigned int *);
|
||||
|
||||
#endif /* __VIR_UTIL_H__ */
|
||||
|
@ -175,6 +175,9 @@ static const char *virErrorDomainName(virErrorDomain domain) {
|
||||
case VIR_FROM_HYPERV:
|
||||
dom = "Hyper-V ";
|
||||
break;
|
||||
case VIR_FROM_CAPABILITIES:
|
||||
dom = "Capabilities ";
|
||||
break;
|
||||
}
|
||||
return(dom);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user