[libvirt] [PATCH] Support for getting/setting number of cpus in VirtualBox

Daniel P. Berrange berrange at redhat.com
Tue Aug 11 10:07:20 UTC 2009


On Fri, Aug 07, 2009 at 04:08:13PM +0200, Pritesh Kothari wrote:
> Hi All,
> 
> I have just added support for getting/setting number of cpus in VirtualBox.
> The patch for the same is include below.
> 
> Regards,
> Pritesh

> commit 3dcaf67d0bb4aa58c4e2224779bebcf2263068b8
> Author: Pritesh Kothari <Pritesh.Kothari at Sun.com>
> Date:   Fri Aug 7 15:49:16 2009 +0200
> 
>     libvirt: support for getting/setting number of cpus
> 
> diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
> index d3158ef..32bfb4d 100644
> --- a/src/vbox/vbox_tmpl.c
> +++ b/src/vbox/vbox_tmpl.c
> @@ -1527,6 +1527,82 @@ cleanup:
>      return ret;
>  }
>  
> +static int vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
> +    nsresult rc;
> +    vboxGlobalData *data = dom->conn->privateData;
> +    IMachine *machine    = NULL;
> +    vboxIID  *iid        = NULL;
> +    PRUint32  CPUCount   = nvcpus;
> +    int       ret        = -1;
> +
> +#if VBOX_API_VERSION == 2002
> +    if (VIR_ALLOC(iid) < 0) {
> +        virReportOOMError(dom->conn);
> +        goto cleanup;
> +    }
> +#endif
> +
> +    if(data->vboxObj) {
> +
> +        vboxIIDFromUUID(dom->uuid, iid);
> +
> +        rc = data->vboxObj->vtbl->OpenSession(data->vboxObj, data->vboxSession, iid);
> +        if (NS_SUCCEEDED(rc)) {
> +            data->vboxSession->vtbl->GetMachine(data->vboxSession, &machine);
> +            if (machine) {
> +                rc = machine->vtbl->SetCPUCount(machine, CPUCount);
> +                if (NS_SUCCEEDED(rc)) {
> +                    machine->vtbl->SaveSettings(machine);
> +                    ret = 0;
> +                } else {
> +                    vboxError(dom->conn, VIR_ERR_INTERNAL_ERROR, "%s: %u, rc=%08x",
> +                              "could not set the number of cpus of the domain to",
> +                              CPUCount, (unsigned)rc);
> +                }
> +                machine->vtbl->nsisupports.Release((nsISupports *)machine);
> +            } else {
> +                vboxError(dom->conn, VIR_ERR_INVALID_DOMAIN,
> +                          "no domain with matching id %d", dom->id);
> +            }
> +        } else {
> +            vboxError(dom->conn, VIR_ERR_INVALID_DOMAIN,
> +                      "can't open session to the domain with id %d", dom->id);
> +        }
> +        data->vboxSession->vtbl->Close(data->vboxSession);
> +    }
> +
> +#if VBOX_API_VERSION == 2002
> +cleanup:
> +#endif
> +    vboxIIDFree(iid);
> +    return ret;
> +}
> +
> +static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
> +    vboxGlobalData *data = dom->conn->privateData;
> +    PRUint32 maxCPUCount = 0;
> +    int ret = -1;
> +
> +    /* Currently every domain supports the same number of max cpus
> +     * as that supported by vbox and thus take it directly from
> +     * the systemproperties.
> +     */
> +    if(data->vboxObj) {
> +        ISystemProperties *systemProperties = NULL;
> +
> +        data->vboxObj->vtbl->GetSystemProperties(data->vboxObj, &systemProperties);
> +        if (systemProperties) {
> +            systemProperties->vtbl->GetMaxGuestCPUCount(systemProperties, &maxCPUCount);
> +            systemProperties->vtbl->nsisupports.Release((nsISupports *)systemProperties);
> +        }
> +    }
> +
> +    if (maxCPUCount > 0)
> +        ret = maxCPUCount;
> +
> +    return ret;
> +}
> +
>  static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
>      nsresult rc;
>      vboxGlobalData *data = dom->conn->privateData;
> @@ -5579,10 +5655,10 @@ virDriver NAME(Driver) = {
>      vboxDomainSave, /* domainSave */
>      NULL, /* domainRestore */
>      NULL, /* domainCoreDump */
> -    NULL, /* domainSetVcpus */
> +    vboxDomainSetVcpus, /* domainSetVcpus */
>      NULL, /* domainPinVcpu */
>      NULL, /* domainGetVcpus */
> -    NULL, /* domainGetMaxVcpus */
> +    vboxDomainGetMaxVcpus, /* domainGetMaxVcpus */
>      NULL, /* domainGetSecurityLabel */
>      NULL, /* nodeGetSecurityModel */
>      vboxDomainDumpXML, /* domainDumpXML */

ACK

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list