On 11/29/2011 12:37 PM, Daniel Veillard wrote: > On Thu, Nov 24, 2011 at 02:22:41PM +0530, Srivatsa S. Bhat wrote: >> Some systems support a feature known as 'Hybrid-Suspend', apart from the >> usual system-wide sleep states such as Suspend-to-RAM (S3) or Suspend-to-Disk >> (S4). Add the functionality to discover this power management feature and >> export it in the capabilities XML under the <power_management> tag. >> >> This addition was suggested in [1]. >> >> References: >> 1. http://www.redhat.com/archives/libvir-list/2011-November/msg01298.html >> >> Signed-off-by: Srivatsa S. Bhat <srivatsa.bhat@xxxxxxxxxxxxxxxxxx> >> --- >> >> docs/formatcaps.html.in | 12 +++-- >> docs/schemas/capability.rng | 5 ++ >> src/conf/capabilities.c | 2 - >> src/util/util.c | 99 ++++++++++++++++++++++++++++++------------- >> src/util/util.h | 8 ++- >> 5 files changed, 88 insertions(+), 38 deletions(-) >> >> diff --git a/docs/formatcaps.html.in b/docs/formatcaps.html.in >> index ce6f9a6..c5fb925 100644 >> --- a/docs/formatcaps.html.in >> +++ b/docs/formatcaps.html.in >> @@ -31,6 +31,7 @@ BIOS you will see</p> >> <power_management> >> <S3/> >> <S4/> >> + <Hybrid-Suspend/> >> <power_management/> >> </host></span> >> >> @@ -70,11 +71,12 @@ the host platform, but other information may be available, it shows the CPU arch >> 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> >> +the power management features supported by the host are shown, such as Suspend-to-RAM (S3), >> +Suspend-to-Disk (S4) and Hybrid-Suspend (a combination of S3 and 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> >> diff --git a/docs/schemas/capability.rng b/docs/schemas/capability.rng >> index 645769e..6cf2188 100644 >> --- a/docs/schemas/capability.rng >> +++ b/docs/schemas/capability.rng >> @@ -121,6 +121,11 @@ >> <empty/> >> </element> >> </optional> >> + <optional> >> + <element name='Hybrid-Suspend'> >> + <empty/> >> + </element> >> + </optional> >> </interleave> >> </element> >> </define> >> diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c >> index 87b60b0..8468861 100644 >> --- a/src/conf/capabilities.c >> +++ b/src/conf/capabilities.c >> @@ -35,7 +35,7 @@ >> #define VIR_FROM_THIS VIR_FROM_CAPABILITIES >> >> VIR_ENUM_IMPL(virHostPMCapability, VIR_HOST_PM_LAST, >> - "S3", "S4") >> + "S3", "S4", "Hybrid-Suspend") >> >> /** >> * virCapabilitiesNew: >> diff --git a/src/util/util.c b/src/util/util.c >> index ce697fb..ccd1a0e 100644 >> --- a/src/util/util.c >> +++ b/src/util/util.c >> @@ -2623,47 +2623,50 @@ virTypedParameterArrayClear(virTypedParameterPtr params, int nparams) >> } >> >> /** >> - * 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). >> + * virDiscoverHostPMFeature: >> + * @bitmask: The bitmask which should be populated with the result of >> + * the query >> + * @feature: The power management feature to check whether it is supported >> + * by the host. Values could be: >> + * VIR_HOST_PM_S3 for Suspend-to-RAM >> + * VIR_HOST_PM_S4 for Suspend-to-Disk >> + * VIR_HOST_PM_HYBRID_SUSPEND for Hybrid-Suspend >> * >> - * @bitmask: Pointer to the bitmask which will be set appropriately to >> - * indicate all the supported host power management features. >> + * Run the script 'pm-is-supported' (from the pm-utils package) >> + * to find out if @feature is supported by the host. >> * >> - * Returns 0 if the query was successful, -1 upon failure. >> + * Returns 0 if the query was successful, -1 on failure. >> */ >> int >> -virGetPMCapabilities(unsigned int *bitmask) >> +virDiscoverHostPMFeature(unsigned int *bitmask, unsigned int feature) >> { >> - int ret = -1; >> - int status; >> virCommandPtr cmd; >> + int status; >> + int ret = -1; >> >> - *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); >> + switch (feature) { >> + case VIR_HOST_PM_S3: >> + cmd = virCommandNewArgList("pm-is-supported", "--suspend", NULL); >> + break; >> + case VIR_HOST_PM_S4: >> + cmd = virCommandNewArgList("pm-is-supported", "--hibernate", NULL); >> + break; >> + case VIR_HOST_PM_HYBRID_SUSPEND: >> + cmd = virCommandNewArgList("pm-is-supported", "--suspend-hybrid", NULL); >> + break; >> + default: >> + return ret; >> + } >> >> - /* 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) >> - */ >> + /* >> + * Check return code of command == 0 for success >> + * (i.e., the PM capability is supported) >> + */ >> if (status == 0) >> - *bitmask |= 1U << VIR_HOST_PM_S4; >> + *bitmask |= 1U << feature; >> >> ret = 0; >> >> @@ -2671,3 +2674,41 @@ cleanup: >> virCommandFree(cmd); >> return ret; >> } >> + >> +/** >> + * virGetPMCapabilities: >> + * >> + * Get the Power Management Capabilities that the host system supports, >> + * such as Suspend-to-RAM (S3), Suspend-to-Disk (S4) and Hybrid-Suspend >> + * (a combination of S3 and 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 on failure. >> + */ >> +int >> +virGetPMCapabilities(unsigned int *bitmask) >> +{ >> + int ret; >> + >> + *bitmask = 0; >> + >> + /* Check support for Suspend-to-RAM (S3) */ >> + ret = virDiscoverHostPMFeature(bitmask, VIR_HOST_PM_S3); >> + if (ret < 0) >> + return -1; >> + >> + /* Check support for Suspend-to-Disk (S4) */ >> + ret = virDiscoverHostPMFeature(bitmask, VIR_HOST_PM_S4); >> + if (ret < 0) >> + return -1; >> + >> + /* Check support for Hybrid-Suspend */ >> + ret = virDiscoverHostPMFeature(bitmask, VIR_HOST_PM_HYBRID_SUSPEND); >> + if (ret < 0) >> + return -1; >> + >> + return 0; >> +} >> + >> diff --git a/src/util/util.h b/src/util/util.h >> index 5afcf58..eda60d2 100644 >> --- a/src/util/util.h >> +++ b/src/util/util.h >> @@ -264,14 +264,16 @@ 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_S3, /* Suspend-to-RAM */ >> + VIR_HOST_PM_S4, /* Suspend-to-Disk */ >> + VIR_HOST_PM_HYBRID_SUSPEND, /* Hybrid-Suspend */ >> >> VIR_HOST_PM_LAST >> }; >> >> VIR_ENUM_DECL(virHostPMCapability) >> >> -int virGetPMCapabilities(unsigned int *); >> +int virDiscoverHostPMFeature(unsigned int *bitmask, unsigned int feature); >> +int virGetPMCapabilities(unsigned int *bitmask); > > ACK, that looks reasonable, I actually have machines with and without > that mode. I had to cleanup the patch a bit to apply to the > documentation and pass "make synatx-check" though, I will push later, > > thanks, > Thank you very much! -- Regards, Srivatsa S. Bhat IBM Linux Technology Center -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list