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(a)linux.vnet.ibm.com>
> ---
>
> 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