[libvirt] [RFC v4] Export KVM Host Power Management capabilities

Eric Blake eblake at redhat.com
Tue Aug 9 16:02:17 UTC 2011


On 08/09/2011 09:29 AM, Srivatsa S. Bhat wrote:
> +    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) {

Our style is to use space after keywords and before opening '(' (that 
is, you should be using 'if (', 'while ('); we only omit space on 
function calls (your use of 'virBufferAddLit(' is correct).

> +++ b/src/qemu/qemu_capabilities.c
> @@ -794,6 +794,8 @@ virCapsPtr qemuCapsInit(virCapsPtr old_caps)
>       struct utsname utsname;
>       virCapsPtr caps;
>       int i;
> +    int status = -1;
> +    unsigned int pmbitmask = 0;

You don't need this temporary.  Instead,...

>       char *xenner = NULL;
>
>       /* Really, this never fails - look at the man-page. */
> @@ -824,6 +826,22 @@ virCapsPtr qemuCapsInit(virCapsPtr old_caps)
>           old_caps->host.cpu = NULL;
>       }
>
> +    /* Add the power management features of the host */
> +
> +    status = virGetPMCapabilities(&pmbitmask);
> +    if(status<  0) {
> +        caps->host.powerMgmt_valid = false;

VIR_ALLOC guaranteed that false was already the default.

> +        VIR_WARN("Failed to get host power management capabilities");
> +    } else {
> +        /* The PM query succeeded. */

...you can just do the assignment in place:

if (virGetPMCapabilities(&caps->host.powerMgmt) < 0)
     VIR_WARN("Failed to get host power management capabilities");
else
     caps->host.powerMgmt_valid = true;

> +int
> +virGetPMCapabilities(unsigned int * bitmask)

Our style does not use space after '*' for pointers:

unsigned int *bitmask

> +    if((path = virFindFileInPath("pm-is-supported")) == NULL) {
> +        virUtilError(VIR_ERR_INTERNAL_ERROR,
> +                     "%s", _("Failed to get the path of pm-is-supported"));
> +        return -1;
> +    }

Overkill - virCommand already does this check on your behalf.

> +
> +    /* Check support for Suspend-to-RAM (S3) */
> +    cmd = virCommandNew(path);
> +    virCommandAddArg(cmd, "--suspend");
> +    if(virCommandRun(cmd,&status)<  0) {
> +        virUtilError(VIR_ERR_INTERNAL_ERROR,
> +                     "%s", _("Failed to run command"
> +                             "'pm-is-supported --suspend'"));

Overkill - virCommand already issues a (much better) error message on 
your behalf.

I'd use:

int ret = -1;
int status;

cmd = virCommandNewArgList("pm-is-supported", "--suspend", NULL);
if (virCommandRun(cmd, &status) < 0)
     goto cleanup;
if (status == 0)
     *bitmask |= 1U << VIR_HOST_PM_S3;
virCommandFree(cmd);
cmd = virCommandNewArgList("pm-is-supported", "--hibernate", NULL);
if (virCommandRun(cmd, &status) < 0)
     goto cleanup;
if (status == 0)
     *bitmask |= 1U << VIR_HOST_PM_S4;
ret = 0;

cleanup:
virCommandFree(cmd);
return ret;

-- 
Eric Blake   eblake at redhat.com    +1-801-349-2682
Libvirt virtualization library http://libvirt.org




More information about the libvir-list mailing list