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

Osier Yang jyang at redhat.com
Thu Mar 31 07:33:10 UTC 2011


于 2011年03月31日 13:38, Taku Izumi 写道:
>
> 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 |   89 ++++++++++++++++++++++++++++++++++++-------------
>   1 file changed, 67 insertions(+), 22 deletions(-)
>
> Index: libvirt/src/qemu/qemu_driver.c
> ===================================================================
> --- libvirt.orig/src/qemu/qemu_driver.c
> +++ libvirt/src/qemu/qemu_driver.c
> @@ -2624,17 +2624,29 @@ 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;
>       qemuDomainObjPrivatePtr priv;
>
> +    virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
> +                  VIR_DOMAIN_VCPU_CONFIG, -1);
> +
> +    if ((flags&  (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_MEM_CONFIG)) == 0) {

s/VIR_DOMAIN_MEM_CONFIG/VIR_DOMAIN_VCPU_CONFIG/

This allows both "LIVE" and "CONFIG" are set, and you use two
"if" clauses later for both of them, (
if (flags&  VIR_DOMAIN_VCPU_CONFIG), and
if (flags&  VIR_DOMAIN_VCPU_LIVE) ) so there should be problem.

IMHO it should be: Exactly one of "LIVE" or "CONFIG" is set.

> +        qemuReportError(VIR_ERR_INVALID_ARG,
> +                        _("invalid flag combination: (0x%x)"), flags);
> +        return -1;
> +    }
> +
>       qemuDriverLock(driver);
>       vm = virDomainFindByUUID(&driver->domains, dom->uuid);
>       qemuDriverUnlock(driver);
> @@ -2647,7 +2659,7 @@ qemudDomainPinVcpu(virDomainPtr dom,
>           goto cleanup;
>       }
>
> -    if (!virDomainObjIsActive(vm)) {
> +    if (!virDomainObjIsActive(vm)&&  (flags&  VIR_DOMAIN_VCPU_LIVE)) {
>           qemuReportError(VIR_ERR_OPERATION_INVALID,
>                           "%s",_("cannot pin vcpus on an inactive domain"));
>           goto cleanup;
> @@ -2662,27 +2674,52 @@ qemudDomainPinVcpu(virDomainPtr dom,
>           goto cleanup;
>       }
>
> -    if (nodeGetInfo(dom->conn,&nodeinfo)<  0)
> -        goto cleanup;
> +    if (flags&  VIR_DOMAIN_VCPU_CONFIG) {
> +        if (!vm->persistent) {
> +            qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
> +                   _("cannot change persistent config of a transient domain"));
> +            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_VCPU_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"));

Indention, :-)

> +            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_VCPU_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"));

likewise

> +            goto cleanup;
> +        }
> +        ret = virDomainSaveConfig(driver->configDir, persistentDef);
>           goto cleanup;
>       }
>
> @@ -2695,6 +2732,14 @@ cleanup:
>   }
>
>   static int
> +qemudDomainPinVcpu(virDomainPtr dom,
> +                   unsigned int vcpu,
> +                   unsigned char *cpumap,
> +                   int maplen) {
> +    return qemudDomainPinVcpuFlags(dom, vcpu, cpumap, maplen, VIR_DOMAIN_VCPU_LIVE);
> +}
> +
> +static int
>   qemudDomainGetVcpus(virDomainPtr dom,
>                       virVcpuInfoPtr info,
>                       int maxinfo,
> @@ -6854,7 +6899,7 @@ static virDriver qemuDriver = {
>       qemudDomainSetVcpusFlags, /* domainSetVcpusFlags */
>       qemudDomainGetVcpusFlags, /* domainGetVcpusFlags */
>       qemudDomainPinVcpu, /* domainPinVcpu */
> -    NULL, /* domainPinVcpuFlags */
> +    qemudDomainPinVcpuFlags, /* domainPinVcpuFlags */
>       qemudDomainGetVcpus, /* domainGetVcpus */
>       qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
>       qemudDomainGetSecurityLabel, /* domainGetSecurityLabel */
>
>
> --
> libvir-list mailing list
> libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list




More information about the libvir-list mailing list