[libvirt] [PATCH v4 2/4] vcpupin: implement the code to address the new API in the qemu driver

Osier Yang jyang at redhat.com
Thu Jun 9 09:42:23 UTC 2011


On 06/09/2011 11:38 AM, Taku Izumi wrote:
>
> This patch implements the code to address the new API
> (virDomainPinVcpuFlags)
> in the qemu driver.
>
> Signed-off-by: Taku Izumi<izumi.taku at jp.fujitsu.com>
> ---
>   src/qemu/qemu_driver.c |   99
> +++++++++++++++++++++++++++++++++++++------------
>   1 file changed, 76 insertions(+), 23 deletions(-)
>
> Index: libvirt/src/qemu/qemu_driver.c
> ===================================================================
> --- libvirt.orig/src/qemu/qemu_driver.c
> +++ libvirt/src/qemu/qemu_driver.c
> @@ -2880,17 +2880,24 @@ qemudDomainSetVcpus(virDomainPtr dom, un
>
>
>   static int
> -qemudDomainPinVcpu(virDomainPtr dom,
> -                   unsigned int vcpu,
> -                   unsigned char *cpumap,
> -                   int maplen) {
> +qemudDomainPinVcpuFlags(virDomainPtr dom,
> +                        unsigned int vcpu,
> +                        unsigned char *cpumap,
> +                        int maplen,
> +                        unsigned int flags) {
> +
>       struct qemud_driver *driver = dom->conn->privateData;
>       virDomainObjPtr vm;
> +    virDomainDefPtr persistentDef = NULL;
>       int maxcpu, hostcpus;
>       virNodeInfo nodeinfo;
>       int ret = -1;
> +    bool isActive;
>       qemuDomainObjPrivatePtr priv;
>
> +    virCheckFlags(VIR_DOMAIN_AFFECT_LIVE |
> +                  VIR_DOMAIN_AFFECT_CONFIG, -1);
> +
>       qemuDriverLock(driver);
>       vm = virDomainFindByUUID(&driver->domains, dom->uuid);
>       qemuDriverUnlock(driver);
> @@ -2903,9 +2910,18 @@ qemudDomainPinVcpu(virDomainPtr dom,
>           goto cleanup;
>       }
>
> -    if (!virDomainObjIsActive(vm)) {
> -        qemuReportError(VIR_ERR_OPERATION_INVALID,
> -                        "%s",_("cannot pin vcpus on an inactive domain"));
> +    isActive = virDomainObjIsActive(vm);
> +    if (flags == VIR_DOMAIN_AFFECT_CURRENT) {
> +        if (isActive)
> +            flags = VIR_DOMAIN_AFFECT_LIVE;
> +        else
> +            flags = VIR_DOMAIN_AFFECT_CONFIG;
> +    }
> +
> +    if (!isActive&&  (flags&  VIR_DOMAIN_AFFECT_LIVE)) {
> +        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                        _("a domain is inactive; can change only "
> +                          "persistent config"));
>           goto cleanup;
>       }
>
> @@ -2918,27 +2934,54 @@ qemudDomainPinVcpu(virDomainPtr dom,
>           goto cleanup;
>       }
>
> -    if (nodeGetInfo(dom->conn,&nodeinfo)<  0)
> -        goto cleanup;
> +    if (flags&  VIR_DOMAIN_AFFECT_CONFIG) {
> +        if (!vm->persistent) {
> +            qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                   _("cannot change persistent config of a transient
> domain"));

Indention

> +            goto cleanup;
> +        }
> +        if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps,
> vm)))
> +            goto cleanup;
> +    }
>
> -    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> -    maxcpu = maplen * 8;
> -    if (maxcpu>  hostcpus)
> -        maxcpu = hostcpus;
> +    if (flags&  VIR_DOMAIN_AFFECT_LIVE) {
>
> -    if (priv->vcpupids != NULL) {
> -        if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
> -                                      cpumap, maplen, maxcpu)<  0)
> +        if (nodeGetInfo(dom->conn,&nodeinfo)<  0)
>               goto cleanup;
> -    } else {
> -        qemuReportError(VIR_ERR_NO_SUPPORT,
> -                        "%s", _("cpu affinity is not supported"));
> -        goto cleanup;
> +
> +        hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> +        maxcpu = maplen * 8;
> +        if (maxcpu>  hostcpus)
> +            maxcpu = hostcpus;
> +
> +        if (priv->vcpupids != NULL) {
> +            if (virProcessInfoSetAffinity(priv->vcpupids[vcpu],
> +                                          cpumap, maplen, maxcpu)<  0)
> +                goto cleanup;
> +        } else {
> +            qemuReportError(VIR_ERR_NO_SUPPORT,
> +                            "%s", _("cpu affinity is not supported"));
> +            goto cleanup;
> +        }
> +
> +        if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu)<  0) {
> +            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                            _("failed to update or add vcpupin xml of "
> +                              "a running domain"));
> +            goto cleanup;
> +        }
> +
>       }
>
> -    if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu)<  0) {
> -        qemuReportError(VIR_ERR_INTERNAL_ERROR,
> -                        "%s", _("failed to update or add vcpupin xml"));
> +    if (flags&  VIR_DOMAIN_AFFECT_CONFIG) {
> +
> +        if (virDomainVcpupinAdd(persistentDef, cpumap, maplen, vcpu)<  0) {
> +            qemuReportError(VIR_ERR_INTERNAL_ERROR, "%s",
> +                            _("failed to update or add vcpupin xml of "
> +                              "a persistent domain"));
> +            goto cleanup;
> +        }
> +        ret = virDomainSaveConfig(driver->configDir, persistentDef);
>           goto cleanup;
>       }
>
> @@ -2951,6 +2994,15 @@ cleanup:
>   }
>
>   static int
> +qemudDomainPinVcpu(virDomainPtr dom,
> +                   unsigned int vcpu,
> +                   unsigned char *cpumap,
> +                   int maplen) {
> +    return qemudDomainPinVcpuFlags(dom, vcpu, cpumap, maplen,
> +                                   VIR_DOMAIN_AFFECT_LIVE);
> +}
> +
> +static int
>   qemudDomainGetVcpus(virDomainPtr dom,
>                       virVcpuInfoPtr info,
>                       int maxinfo,
> @@ -8014,6 +8066,7 @@ static virDriver qemuDriver = {
>       .domainSetVcpusFlags = qemudDomainSetVcpusFlags, /* 0.8.5 */
>       .domainGetVcpusFlags = qemudDomainGetVcpusFlags, /* 0.8.5 */
>       .domainPinVcpu = qemudDomainPinVcpu, /* 0.4.4 */
> +    .domainPinVcpuFlags = qemudDomainPinVcpuFlags, /* 0.9.2 */

Here should be 0.9.3, 0.9.2 is already out.


>       .domainGetVcpus = qemudDomainGetVcpus, /* 0.4.4 */
>       .domainGetMaxVcpus = qemudDomainGetMaxVcpus, /* 0.4.4 */
>       .domainGetSecurityLabel = qemudDomainGetSecurityLabel, /* 0.6.1 */
>
>




More information about the libvir-list mailing list