[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [libvirt] [PATCH 5/8] cputune: support cputune for qemu driver



On Tue, Mar 29, 2011 at 02:32:23PM +0800, Osier Yang wrote:
> When domain startup, setting cpu affinity and cpu shares according
> to the cputune xml specified in domain xml.
> 
> Modify "qemudDomainPinVcpu" to update domain config for vcpupin,
> and modify "qemuSetSchedulerParameters" to update domain config
> for cpu shares.
> 
> * src/qemu/qemu_cgroup.c
> * src/qemu/qemu_driver.c
> * src/qemu/qemu_process.c
> ---
>  src/qemu/qemu_cgroup.c  |   15 +++++++++
>  src/qemu/qemu_driver.c  |    8 +++++
>  src/qemu/qemu_process.c |   79 +++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 102 insertions(+), 0 deletions(-)
> 
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index 935517f..8cf45da 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -343,6 +343,21 @@ int qemuSetupCgroup(struct qemud_driver *driver,
>                   vm->def->name);
>      }
> 
> +    if (qemuCgroupControllerActive(driver, VIR_CGROUP_CONTROLLER_CPU)) {
> +        if (vm->def->cputune.shares != 0) {
> +            rc = virCgroupSetCpuShares(cgroup, vm->def->cputune.shares);
> +            if(rc != 0) {
> +                virReportSystemError(-rc,
> +                                     _("Unable to set io cpu shares for domain %s"),
> +                                     vm->def->name);
> +                goto cleanup;
> +            }
> +        }
> +    } else {
> +        qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED,
> +                        _("CPU tuning is not available on this host"));
> +    }
> +
>  done:
>      virCgroupFree(&cgroup);
>      return 0;
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index e97c1d9..28a5298 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2681,6 +2681,12 @@ qemudDomainPinVcpu(virDomainPtr dom,
>      }
>      ret = 0;
> 
> +    if (virDomainVcpupinAdd(vm->def, cpumap, maplen, vcpu) < 0) {
> +        qemuReportError(VIR_ERR_INTERNAL_ERROR,
> +                        "%s", _("failed to update or add vcpupin xml"));

  Hum, is the error message really appropriate there ?

> +        goto cleanup;
> +    }
> +
>  cleanup:
>      if (vm)
>          virDomainObjUnlock(vm);
> @@ -4644,6 +4650,8 @@ static int qemuSetSchedulerParameters(virDomainPtr dom,
>                                       _("unable to set cpu shares tunable"));
>                  goto cleanup;
>              }
> +
> +            vm->def->cputune.shares = params[i].value.ul;
>          } else {
>              qemuReportError(VIR_ERR_INVALID_ARG,
>                              _("Invalid parameter `%s'"), param->field);
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 209c8cf..e974a67 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1143,6 +1143,81 @@ qemuProcessInitCpuAffinity(virDomainObjPtr vm)
>      return 0;
>  }
> 
> +/* Set CPU affinites for vcpus if vcpupin xml provided. */
> +static int
> +qemuProcessSetVcpuAffinites(virConnectPtr conn,
> +                            virDomainObjPtr vm)
> +{
> +    qemuDomainObjPrivatePtr priv = vm->privateData;
> +    virDomainDefPtr def = vm->def;
> +    virNodeInfo nodeinfo;
> +    pid_t vcpupid;
> +    unsigned char *cpumask;
> +    int vcpu, cpumaplen, hostcpus, maxcpu;
> +
> +    if (virNodeGetInfo(conn, &nodeinfo) != 0) {
> +        return  -1;
> +    }
> +
> +    if (!def->cputune.nvcpupin)
> +        return 0;
> +
> +    if (priv->vcpupids == NULL) {
> +        qemuReportError(VIR_ERR_NO_SUPPORT,
> +                        "%s", _("cpu affinity is not supported"));
> +        return -1;
> +    }
> +
> +    hostcpus = VIR_NODEINFO_MAXCPUS(nodeinfo);
> +    cpumaplen = VIR_CPU_MAPLEN(hostcpus);
> +    maxcpu = cpumaplen * 8;
> +
> +    if (maxcpu > hostcpus)
> +        maxcpu = hostcpus;
> +
> +    for (vcpu = 0; vcpu < def->cputune.nvcpupin; vcpu++) {
> +        if (vcpu != def->cputune.vcpupin[vcpu]->vcpuid)
> +            continue;
> +
> +        int i;
> +        unsigned char *cpumap = NULL;
> +
> +        if (VIR_ALLOC_VAR(cpumap, char, cpumaplen) < 0) {
> +            virReportOOMError();
> +            return -1;
> +        }
> +
> +        /* Initialize cpumap to all 0s. */
> +        for (i = 0; i < cpumaplen; i++)
> +            cpumap[i] = 0;

  that should not be needed as VIR_ALLOC_* zeroes the memory area

> +        cpumask = (unsigned char *)def->cputune.vcpupin[vcpu]->cpumask;
> +        vcpupid = priv->vcpupids[vcpu];
> +
> +        /* Convert cpumask to bitmap here. */
> +        for (i = 0; i < VIR_DOMAIN_CPUMASK_LEN; i++) {
> +            int cur = 0;
> +            int mod = 0;
> +
> +            if (i) {
> +                cur = i / 8;
> +                mod = i % 8;
> +            }
> +
> +            if (cpumask[i])
> +                cpumap[cur] |= 1 << mod;
> +        }
> +
> +        if (virProcessInfoSetAffinity(vcpupid,
> +                                      cpumap,
> +                                      cpumaplen,
> +                                      maxcpu) < 0) {
> +            return -1;
> +        }
> +    }
> +
> +    return 0;
> +}
> 
>  static int
>  qemuProcessInitPasswords(virConnectPtr conn,
> @@ -2217,6 +2292,10 @@ int qemuProcessStart(virConnectPtr conn,
>      if (qemuProcessDetectVcpuPIDs(driver, vm) < 0)
>          goto cleanup;
> 
> +    VIR_DEBUG0("Setting VCPU affinities");
> +    if (qemuProcessSetVcpuAffinites(conn, vm) < 0)
> +        goto cleanup;
> +
>      VIR_DEBUG0("Setting any required VM passwords");
>      if (qemuProcessInitPasswords(conn, driver, vm, qemuCaps) < 0)
>          goto cleanup;

  A couple of things to double check there,

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel veillard com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]