From: Matthias Bolte Date: Sun, 3 Apr 2011 12:43:55 +0000 (+0200) Subject: vmx: Support persistent CPU shares X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=81800ff64716b2c28c91af366cf3aae20c5148d1;p=libvirt.git vmx: Support persistent CPU shares --- diff --git a/src/vmx/vmx.c b/src/vmx/vmx.c index 9f4d5fbbb1..1d4abf0a46 100644 --- a/src/vmx/vmx.c +++ b/src/vmx/vmx.c @@ -55,6 +55,8 @@ def->mem.cur_balloon = <=> sched.mem.max = "mem.min_guarantee = <=> sched.mem.minsize = "" # defaults to 0 def->maxvcpus = <=> numvcpus = "" # must be 1 or a multiple of 2, defaults to 1 def->cpumask = <=> sched.cpu.affinity = "" +def->cputune.shares = <=> sched.cpu.shares = "" # with handling for special values + # "high", "normal", "low" @@ -1200,6 +1202,7 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx) long long sched_mem_minsize = 0; long long numvcpus = 0; char *sched_cpu_affinity = NULL; + char *sched_cpu_shares = NULL; char *guestOS = NULL; bool smbios_reflecthost = false; int controller; @@ -1449,6 +1452,30 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx) } } + /* vmx:sched.cpu.shares -> def:cputune.shares */ + if (virVMXGetConfigString(conf, "sched.cpu.shares", &sched_cpu_shares, + true) < 0) { + goto cleanup; + } + + if (sched_cpu_shares != NULL) { + /* See http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.SharesInfo.Level.html */ + if (STRCASEEQ(sched_cpu_shares, "low")) { + def->cputune.shares = def->vcpus * 500; + } else if (STRCASEEQ(sched_cpu_shares, "normal")) { + def->cputune.shares = def->vcpus * 1000; + } else if (STRCASEEQ(sched_cpu_shares, "high")) { + def->cputune.shares = def->vcpus * 2000; + } else if (virStrToLong_ul(sched_cpu_shares, NULL, 10, + &def->cputune.shares) < 0) { + VMX_ERROR(VIR_ERR_INTERNAL_ERROR, + _("Expecting VMX entry 'sched.cpu.shares' to be an " + "unsigned integer or 'low', 'normal' or 'high' but " + "found '%s'"), sched_cpu_shares); + goto cleanup; + } + } + /* def:lifecycle */ def->onReboot = VIR_DOMAIN_LIFECYCLE_RESTART; def->onPoweroff = VIR_DOMAIN_LIFECYCLE_DESTROY; @@ -1715,6 +1742,7 @@ virVMXParseConfig(virVMXContext *ctx, virCapsPtr caps, const char *vmx) virConfFree(conf); VIR_FREE(encoding); VIR_FREE(sched_cpu_affinity); + VIR_FREE(sched_cpu_shares); VIR_FREE(guestOS); return def; @@ -2998,6 +3026,21 @@ virVMXFormatConfig(virVMXContext *ctx, virCapsPtr caps, virDomainDefPtr def, virBufferAddLit(&buffer, "\"\n"); } + /* def:cputune.shares -> vmx:sched.cpu.shares */ + if (def->cputune.shares > 0) { + /* See http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.SharesInfo.Level.html */ + if (def->cputune.shares == def->vcpus * 500) { + virBufferAddLit(&buffer, "sched.cpu.shares = \"low\"\n"); + } else if (def->cputune.shares == def->vcpus * 1000) { + virBufferAddLit(&buffer, "sched.cpu.shares = \"normal\"\n"); + } else if (def->cputune.shares == def->vcpus * 2000) { + virBufferAddLit(&buffer, "sched.cpu.shares = \"high\"\n"); + } else { + virBufferVSprintf(&buffer, "sched.cpu.shares = \"%lu\"\n", + def->cputune.shares); + } + } + /* def:graphics */ for (i = 0; i < def->ngraphics; ++i) { switch (def->graphics[i]->type) { diff --git a/tests/vmx2xmldata/vmx2xml-case-insensitive-1.vmx b/tests/vmx2xmldata/vmx2xml-case-insensitive-1.vmx index bd36cf86e5..8641c5c01b 100644 --- a/tests/vmx2xmldata/vmx2xml-case-insensitive-1.vmx +++ b/tests/vmx2xmldata/vmx2xml-case-insensitive-1.vmx @@ -35,7 +35,7 @@ UUID.BIOS = "50 11 5E 16 9B DC 49 D7-F1 71 53 C4 D7 F9 17 10" SNAPSHOT.ACTION = "KEEP" SCHED.CPU.MIN = "0" SCHED.CPU.UNITS = "MHZ" -SCHED.CPU.SHARES = "NORMAL" +SCHED.CPU.SHARES = "4223" SCHED.MEM.MINSIZE = "0" SCHED.MEM.SHARES = "NORMAL" TOOLSCRIPTS.AFTERPOWERON = "TRUE" diff --git a/tests/vmx2xmldata/vmx2xml-case-insensitive-1.xml b/tests/vmx2xmldata/vmx2xml-case-insensitive-1.xml index 7a5ff5bc31..ef6edd8135 100644 --- a/tests/vmx2xmldata/vmx2xml-case-insensitive-1.xml +++ b/tests/vmx2xmldata/vmx2xml-case-insensitive-1.xml @@ -4,6 +4,9 @@ 1048576 1048576 1 + + 4223 + hvm diff --git a/tests/vmx2xmldata/vmx2xml-case-insensitive-2.xml b/tests/vmx2xmldata/vmx2xml-case-insensitive-2.xml index 18d64611fc..02771b98cd 100644 --- a/tests/vmx2xmldata/vmx2xml-case-insensitive-2.xml +++ b/tests/vmx2xmldata/vmx2xml-case-insensitive-2.xml @@ -4,6 +4,9 @@ 1048576 1048576 1 + + 1000 + hvm diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.vmx b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.vmx index 4392062fbc..78741aed4f 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.vmx +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.vmx @@ -36,7 +36,7 @@ uuid.bios = "50 11 5e 16 9b dc 49 d7-f1 71 53 c4 d7 f9 17 10" snapshot.action = "keep" sched.cpu.min = "0" sched.cpu.units = "mhz" -sched.cpu.shares = "normal" +sched.cpu.shares = "low" sched.mem.minsize = "0" sched.mem.shares = "normal" toolScripts.afterPowerOn = "true" diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.xml index 5e67e746fd..e8f9307725 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-1.xml @@ -4,6 +4,9 @@ 1048576 1048576 1 + + 500 + hvm diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-4.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-4.xml index 419df518de..2824d66028 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-4.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-4.xml @@ -4,6 +4,9 @@ 524288 524288 1 + + 1000 + hvm diff --git a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml index 004016324b..6f0a9d1c44 100644 --- a/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml +++ b/tests/vmx2xmldata/vmx2xml-esx-in-the-wild-5.xml @@ -8,6 +8,9 @@ 262144 2 + + 2000 + hvm diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.vmx b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.vmx index e72ca803f8..9059197fb2 100644 --- a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.vmx +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.vmx @@ -6,6 +6,7 @@ uuid.bios = "50 11 5e 16 9b dc 49 d7-f1 71 53 c4 d7 f9 17 10" displayName = "Fedora11" memsize = "1024" numvcpus = "1" +sched.cpu.shares = "low" scsi0.present = "true" scsi0.virtualDev = "lsilogic" scsi0:0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.xml b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.xml index 3f4ff8830d..ea597785c3 100644 --- a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.xml +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-1.xml @@ -4,6 +4,9 @@ 1048576 1048576 1 + + 500 + hvm diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.vmx b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.vmx index 627fcfb949..504997f0f9 100644 --- a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.vmx +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.vmx @@ -6,6 +6,7 @@ uuid.bios = "56 4d 9b ef ac d9 b4 e0-c8 f0 ae a8 b9 10 35 15" displayName = "virtMonServ1" memsize = "512" numvcpus = "1" +sched.cpu.shares = "normal" scsi0.present = "true" scsi0.virtualDev = "lsilogic" scsi0:0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.xml b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.xml index 078753a94f..443aacd4ab 100644 --- a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.xml +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-4.xml @@ -4,6 +4,9 @@ 524288 524288 1 + + 1000 + hvm diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.vmx b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.vmx index cc2485f7c7..2e3b85691d 100644 --- a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.vmx +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.vmx @@ -8,6 +8,7 @@ annotation = "Centos 5.5 64bit Server" memsize = "2048" sched.mem.minsize = "256" numvcpus = "2" +sched.cpu.shares = "normal" scsi0.present = "true" scsi0.virtualDev = "lsilogic" scsi0:0.present = "true" diff --git a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.xml b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.xml index d55bf6be7e..f28c15e979 100644 --- a/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.xml +++ b/tests/xml2vmxdata/xml2vmx-esx-in-the-wild-5.xml @@ -8,6 +8,9 @@ 262144 2 + + 2000 + hvm