[libvirt] [RFC/PATCH REPOST] Adding persistent entry for cpu tunable
Osier Yang
jyang at redhat.com
Fri Jan 28 07:19:11 UTC 2011
于 2011年01月28日 13:23, Nikunj A. Dadhania 写道:
> From: Nikunj A. Dadhania<nikunj at linux.vnet.ibm.com>
>
> Make cpu share persistent and add support for parsing them.
>
> docs/formatdomain.html.in: Document cputune element
> src/conf/domain_conf.c,src/conf/domain_conf.h: Add cputune element parsing
> src/lxc/lxc_controller.c: Use the parsed cputune shares value
> src/qemu/qemu_cgroup.c: Use the parsed cputune shares value
AFAIK, hacking on domain XML schema is also needed,
docs/schema/domain.rng
>
> Signed-off-by: Nikunj A. Dadhania<nikunj at linux.vnet.ibm.com>
> ---
>
> docs/formatdomain.html.in | 11 +++++++++++
> src/conf/domain_conf.c | 14 ++++++++++++++
> src/conf/domain_conf.h | 3 +++
> src/lxc/lxc_controller.c | 10 ++++++++++
> src/qemu/qemu_cgroup.c | 15 +++++++++++++++
> 5 files changed, 53 insertions(+), 0 deletions(-)
>
> diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
> index 55e2cbd..522dc06 100644
> --- a/docs/formatdomain.html.in
> +++ b/docs/formatdomain.html.in
> @@ -280,6 +280,9 @@
> <swap_hard_limit>2097152</swap_hard_limit>
> <min_guarantee>65536</min_guarantee>
> </memtune>
> +<cputune>
> +<shares>1024</shares>
> +</cputune>
> <vcpu cpuset="1-4,^3,6" current="1">2</vcpu>
> ...</pre>
>
> @@ -317,6 +320,14 @@
> <dd> The optional<code>min_guarantee</code> element is the guaranteed
> minimum memory allocation for the guest. The units for this value are
> kilobytes (i.e. blocks of 1024 bytes)</dd>
> +<dt><code>cputune</code></dt>
> +<dd> The optional<code>cputune</code> element provides details
> + regarding the cpu tuneable parameters for the domain. If this is
> + omitted, it defaults to the OS provided defaults.</dd>
> +<dt><code>shares</code></dt>
> +<dd> The optional<code>shares</code> element is the proportional
> + weighted share for the domain. If this is omitted, it defaults to the OS
> + provided defaults.</dd>
> <dt><code>vcpu</code></dt>
> <dd>The content of this element defines the maximum number of virtual
> CPUs allocated for the guest OS, which must be between 1 and
> diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
> index 645767e..63c8927 100644
> --- a/src/conf/domain_conf.c
> +++ b/src/conf/domain_conf.c
> @@ -4904,6 +4904,11 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
> &def->mem.swap_hard_limit)< 0)
> def->mem.swap_hard_limit = 0;
>
> + /* Extract cpu tunables */
> + if (virXPathULong("string(./cputune/shares[1])", ctxt,
> +&def->cputune.shares)< 0)
> + def->cputune.shares = 0;
> +
> n = virXPathULong("string(./vcpu[1])", ctxt,&count);
> if (n == -2) {
> virDomainReportError(VIR_ERR_XML_ERROR, "%s",
> @@ -7313,6 +7318,15 @@ char *virDomainDefFormat(virDomainDefPtr def,
> def->mem.swap_hard_limit)
> virBufferVSprintf(&buf, "</memtune>\n");
>
> + if (def->cputune.shares)
> + virBufferVSprintf(&buf, "<cputune>\n");
> + if (def->cputune.shares) {
> + virBufferVSprintf(&buf, "<shares>%lu</shares>\n",
> + def->cputune.shares);
> + }
> + if (def->cputune.shares)
> + virBufferVSprintf(&buf, "</cputune>\n");
> +
Above 3 'if' clauses can be merged?
> if (def->mem.hugepage_backed) {
> virBufferAddLit(&buf, "<memoryBacking>\n");
> virBufferAddLit(&buf, "<hugepages/>\n");
> diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
> index cf7bdc0..a2c83d3 100644
> --- a/src/conf/domain_conf.h
> +++ b/src/conf/domain_conf.h
> @@ -981,6 +981,9 @@ struct _virDomainDef {
> unsigned short maxvcpus;
> int cpumasklen;
> char *cpumask;
> + struct {
> + unsigned long shares; /* proportional weight */
> + } cputune;
>
> /* These 3 are based on virDomainLifeCycleAction enum flags */
> int onReboot;
> diff --git a/src/lxc/lxc_controller.c b/src/lxc/lxc_controller.c
> index af0b70c..24edb49 100644
> --- a/src/lxc/lxc_controller.c
> +++ b/src/lxc/lxc_controller.c
> @@ -144,6 +144,16 @@ static int lxcSetContainerResources(virDomainDefPtr def)
> }
> }
>
> + if(def->cputune.shares) {
> + rc = virCgroupSetCpuShares(cgroup, def->cputune.shares);
> + if (rc != 0) {
> + virReportSystemError(-rc,
> + _("Unable to set cpu shares for domain %s"),
> + def->name);
> + goto cleanup;
> + }
> + }
> +
> rc = virCgroupDenyAllDevices(cgroup);
> if (rc != 0) {
> virReportSystemError(-rc,
> diff --git a/src/qemu/qemu_cgroup.c b/src/qemu/qemu_cgroup.c
> index e5536c0..d4e73bd 100644
> --- a/src/qemu/qemu_cgroup.c
> +++ b/src/qemu/qemu_cgroup.c
> @@ -304,6 +304,21 @@ int qemuSetupCgroup(struct qemud_driver *driver,
> vm->def->name);
> }
>
> + if ((rc = 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 cpu shares for domain %s"),
> + vm->def->name);
> + goto cleanup;
> + }
> + }
> + } else {
> + VIR_WARN("CPU cgroup is disabled in qemu configuration file: %s",
> + vm->def->name);
> + }
s/CPU cgroup/cpu controller/ ? Or perhaps "cgroup controller 'cpu'"
is better, and the other possibility here is it's not mounted?
> +
> done:
> virCgroupFree(&cgroup);
> return 0;
>
> --
> 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