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:
Srivatsa S. Bhat 2011-11-22 11:31:22 +08:00 committed by Daniel Veillard
parent 693d22d417
commit e352b16400
12 changed files with 144 additions and 6 deletions

View File

@ -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....]

View File

@ -28,6 +28,10 @@ BIOS you will see</p>
&lt;feature name='xtpr'/&gt;
...
&lt;/cpu&gt;
&lt;power_management&gt;
&lt;S3/&gt;
&lt;S4/&gt;
&lt;power_management/&gt;
&lt;/host&gt;</span>
&lt;!-- xen-3.0-x86_64 --&gt;
@ -61,11 +65,16 @@ BIOS you will see</p>
...
&lt;/capabilities&gt;</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 &lt;power_management/&gt;
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>

View File

@ -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>

View File

@ -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;

View File

@ -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

View File

@ -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)

View File

@ -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;

View File

@ -1094,6 +1094,7 @@ virFormatMacAddr;
virGenerateMacAddr;
virGetGroupID;
virGetHostname;
virGetPMCapabilities;
virGetUserDirectory;
virGetUserID;
virGetUserName;

View File

@ -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");

View File

@ -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;
}

View File

@ -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__ */

View File

@ -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);
}