mirror of https://gitee.com/openkylin/libvirt.git
295 lines
12 KiB
Diff
295 lines
12 KiB
Diff
From 0fab10e5ed971ab4f960a53e9640b0672f4b8ac3 Mon Sep 17 00:00:00 2001
|
|
From: Eric Blake <eblake@redhat.com>
|
|
Date: Tue, 5 Oct 2010 08:18:52 -0600
|
|
Subject: [PATCH 12/15] vcpu: improve vcpu support in xen command line
|
|
|
|
This patch series focuses on xendConfigVersion 2 (xm_internal) and 3
|
|
(xend_internal), but leaves out changes for xenapi drivers.
|
|
|
|
See this link for more details about vcpu_avail for xm usage.
|
|
http://lists.xensource.com/archives/html/xen-devel/2009-11/msg01061.html
|
|
|
|
This relies on the fact that def->maxvcpus can be at most 32 with xen.
|
|
|
|
* src/xen/xend_internal.c (xenDaemonParseSxpr)
|
|
(sexpr_to_xend_domain_info, xenDaemonFormatSxpr): Use vcpu_avail
|
|
when current vcpus is less than maximum.
|
|
* src/xen/xm_internal.c (xenXMDomainConfigParse)
|
|
(xenXMDomainConfigFormat): Likewise.
|
|
* tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr: New file.
|
|
* tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr: Likewise.
|
|
* tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml: Likewise.
|
|
* tests/xmconfigdata/test-paravirt-vcpu.cfg: Likewise.
|
|
* tests/xmconfigdata/test-paravirt-vcpu.xml: Likewise.
|
|
* tests/xml2sexprtest.c (mymain): New test.
|
|
* tests/sexpr2xmltest.c (mymain): Likewise.
|
|
* tests/xmconfigtest.c (mymain): Likewise.
|
|
---
|
|
src/xen/xend_internal.c | 19 +++++++++++++--
|
|
src/xen/xm_internal.c | 10 ++++++-
|
|
tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr | 1 +
|
|
tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml | 27 +++++++++++++++++++++
|
|
tests/sexpr2xmltest.c | 1 +
|
|
tests/xmconfigdata/test-paravirt-vcpu.cfg | 17 +++++++++++++
|
|
tests/xmconfigdata/test-paravirt-vcpu.xml | 32 ++++++++++++++++++++++++++
|
|
tests/xmconfigtest.c | 1 +
|
|
tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr | 1 +
|
|
tests/xml2sexprtest.c | 1 +
|
|
10 files changed, 105 insertions(+), 5 deletions(-)
|
|
create mode 100644 tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr
|
|
create mode 100644 tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml
|
|
create mode 100644 tests/xmconfigdata/test-paravirt-vcpu.cfg
|
|
create mode 100644 tests/xmconfigdata/test-paravirt-vcpu.xml
|
|
create mode 100644 tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr
|
|
|
|
diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
|
|
index 456b477..dfc6415 100644
|
|
--- a/src/xen/xend_internal.c
|
|
+++ b/src/xen/xend_internal.c
|
|
@@ -44,6 +44,7 @@
|
|
#include "xen_hypervisor.h"
|
|
#include "xs_internal.h" /* To extract VNC port & Serial console TTY */
|
|
#include "memory.h"
|
|
+#include "count-one-bits.h"
|
|
|
|
/* required for cpumap_t */
|
|
#include <xen/dom0_ops.h>
|
|
@@ -2191,7 +2192,9 @@ xenDaemonParseSxpr(virConnectPtr conn,
|
|
}
|
|
|
|
def->maxvcpus = sexpr_int(root, "domain/vcpus");
|
|
- def->vcpus = def->maxvcpus;
|
|
+ def->vcpus = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
|
|
+ if (!def->vcpus || def->maxvcpus < def->vcpus)
|
|
+ def->vcpus = def->maxvcpus;
|
|
|
|
tmp = sexpr_node(root, "domain/on_poweroff");
|
|
if (tmp != NULL) {
|
|
@@ -2433,7 +2436,7 @@ sexpr_to_xend_domain_info(virDomainPtr domain, const struct sexpr *root,
|
|
virDomainInfoPtr info)
|
|
{
|
|
const char *flags;
|
|
-
|
|
+ int vcpus;
|
|
|
|
if ((root == NULL) || (info == NULL))
|
|
return (-1);
|
|
@@ -2464,7 +2467,11 @@ sexpr_to_xend_domain_info(virDomainPtr domain, const struct sexpr *root,
|
|
info->state = VIR_DOMAIN_NOSTATE;
|
|
}
|
|
info->cpuTime = sexpr_float(root, "domain/cpu_time") * 1000000000;
|
|
- info->nrVirtCpu = sexpr_int(root, "domain/vcpus");
|
|
+ vcpus = sexpr_int(root, "domain/vcpus");
|
|
+ info->nrVirtCpu = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
|
|
+ if (!info->nrVirtCpu || vcpus < info->nrVirtCpu)
|
|
+ info->nrVirtCpu = vcpus;
|
|
+
|
|
return (0);
|
|
}
|
|
|
|
@@ -5668,6 +5675,9 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
virBufferAsprintf(&buf, "(memory %lu)(maxmem %lu)",
|
|
def->mem.cur_balloon/1024, def->mem.max_balloon/1024);
|
|
virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
|
|
+ /* Computing the vcpu_avail bitmask works because MAX_VIRT_CPUS is 32. */
|
|
+ if (def->vcpus < def->maxvcpus)
|
|
+ virBufferAsprintf(&buf, "(vcpu_avail %u)", (1U << def->vcpus) - 1);
|
|
|
|
if (def->cpumask) {
|
|
char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
|
|
@@ -5763,6 +5773,9 @@ xenDaemonFormatSxpr(virConnectPtr conn,
|
|
virBufferAsprintf(&buf, "(kernel '%s')", def->os.loader);
|
|
|
|
virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
|
|
+ if (def->vcpus < def->maxvcpus)
|
|
+ virBufferAsprintf(&buf, "(vcpu_avail %u)",
|
|
+ (1U << def->vcpus) - 1);
|
|
|
|
for (i = 0 ; i < def->os.nBootDevs ; i++) {
|
|
switch (def->os.bootDevs[i]) {
|
|
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
|
|
index bf20a64..f7121ab 100644
|
|
--- a/src/xen/xm_internal.c
|
|
+++ b/src/xen/xm_internal.c
|
|
@@ -46,6 +46,7 @@
|
|
#include "util.h"
|
|
#include "memory.h"
|
|
#include "logging.h"
|
|
+#include "count-one-bits.h"
|
|
|
|
#define VIR_FROM_THIS VIR_FROM_XENXM
|
|
|
|
@@ -772,10 +773,12 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
|
|
def->mem.max_balloon *= 1024;
|
|
|
|
if (xenXMConfigGetULong(conf, "vcpus", &count, 1) < 0 ||
|
|
- (unsigned short) count != count)
|
|
+ MAX_VIRT_CPUS < count)
|
|
goto cleanup;
|
|
def->maxvcpus = count;
|
|
- def->vcpus = def->maxvcpus;
|
|
+ if (xenXMConfigGetULong(conf, "vcpu_avail", &count, -1) < 0)
|
|
+ goto cleanup;
|
|
+ def->vcpus = MIN(count_one_bits(count), def->maxvcpus);
|
|
|
|
if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
|
|
goto cleanup;
|
|
@@ -2246,6 +2249,9 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
|
|
|
|
if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
|
|
goto no_memory;
|
|
+ if (def->vcpus < def->maxvcpus &&
|
|
+ xenXMConfigSetInt(conf, "vcpu_avail", (1U << def->vcpus) - 1) < 0)
|
|
+ goto no_memory;
|
|
|
|
if ((def->cpumask != NULL) &&
|
|
((cpus = virDomainCpuSetFormat(def->cpumask,
|
|
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr
|
|
new file mode 100644
|
|
index 0000000..2be6822
|
|
--- /dev/null
|
|
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.sexpr
|
|
@@ -0,0 +1 @@
|
|
+(domain (domid 6)(name 'pvtest')(memory 420)(maxmem 420)(vcpus 4)(vcpu_avail 3)(uuid '596a5d2171f48fb2e068e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os ')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w'))))
|
|
diff --git a/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml
|
|
new file mode 100644
|
|
index 0000000..0d6bf11
|
|
--- /dev/null
|
|
+++ b/tests/sexpr2xmldata/sexpr2xml-pv-vcpus.xml
|
|
@@ -0,0 +1,27 @@
|
|
+<domain type='xen' id='6'>
|
|
+ <name>pvtest</name>
|
|
+ <uuid>596a5d21-71f4-8fb2-e068-e2386a5c413e</uuid>
|
|
+ <memory>430080</memory>
|
|
+ <currentMemory>430080</currentMemory>
|
|
+ <vcpu current='2'>4</vcpu>
|
|
+ <os>
|
|
+ <type>linux</type>
|
|
+ <kernel>/var/lib/xen/vmlinuz.2Dn2YT</kernel>
|
|
+ <initrd>/var/lib/xen/initrd.img.0u-Vhq</initrd>
|
|
+ <cmdline> method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os </cmdline>
|
|
+ </os>
|
|
+ <clock offset='utc'/>
|
|
+ <on_poweroff>destroy</on_poweroff>
|
|
+ <on_reboot>destroy</on_reboot>
|
|
+ <on_crash>destroy</on_crash>
|
|
+ <devices>
|
|
+ <disk type='file' device='disk'>
|
|
+ <driver name='file'/>
|
|
+ <source file='/root/some.img'/>
|
|
+ <target dev='xvda' bus='xen'/>
|
|
+ </disk>
|
|
+ <console type='pty'>
|
|
+ <target type='xen' port='0'/>
|
|
+ </console>
|
|
+ </devices>
|
|
+</domain>
|
|
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
|
|
index d62b44f..f100dd8 100644
|
|
--- a/tests/sexpr2xmltest.c
|
|
+++ b/tests/sexpr2xmltest.c
|
|
@@ -132,6 +132,7 @@ mymain(int argc, char **argv)
|
|
DO_TEST("pv-vfb-type-crash", "pv-vfb-type-crash", 3);
|
|
DO_TEST("fv-autoport", "fv-autoport", 3);
|
|
DO_TEST("pv-bootloader", "pv-bootloader", 1);
|
|
+ DO_TEST("pv-vcpus", "pv-vcpus", 1);
|
|
|
|
DO_TEST("disk-file", "disk-file", 2);
|
|
DO_TEST("disk-block", "disk-block", 2);
|
|
diff --git a/tests/xmconfigdata/test-paravirt-vcpu.cfg b/tests/xmconfigdata/test-paravirt-vcpu.cfg
|
|
new file mode 100644
|
|
index 0000000..24c78f4
|
|
--- /dev/null
|
|
+++ b/tests/xmconfigdata/test-paravirt-vcpu.cfg
|
|
@@ -0,0 +1,17 @@
|
|
+name = "XenGuest1"
|
|
+uuid = "c7a5fdb0-cdaf-9455-926a-d65c16db1809"
|
|
+maxmem = 579
|
|
+memory = 394
|
|
+vcpus = 4
|
|
+vcpu_avail = 3
|
|
+bootloader = "/usr/bin/pygrub"
|
|
+on_poweroff = "destroy"
|
|
+on_reboot = "restart"
|
|
+on_crash = "restart"
|
|
+sdl = 0
|
|
+vnc = 1
|
|
+vncunused = 1
|
|
+vnclisten = "127.0.0.1"
|
|
+vncpasswd = "123poi"
|
|
+disk = [ "phy:/dev/HostVG/XenGuest1,xvda,w" ]
|
|
+vif = [ "mac=00:16:3e:66:94:9c,bridge=br0,script=vif-bridge" ]
|
|
diff --git a/tests/xmconfigdata/test-paravirt-vcpu.xml b/tests/xmconfigdata/test-paravirt-vcpu.xml
|
|
new file mode 100644
|
|
index 0000000..0be9456
|
|
--- /dev/null
|
|
+++ b/tests/xmconfigdata/test-paravirt-vcpu.xml
|
|
@@ -0,0 +1,32 @@
|
|
+<domain type='xen'>
|
|
+ <name>XenGuest1</name>
|
|
+ <uuid>c7a5fdb0-cdaf-9455-926a-d65c16db1809</uuid>
|
|
+ <memory>592896</memory>
|
|
+ <currentMemory>403456</currentMemory>
|
|
+ <vcpu current='2'>4</vcpu>
|
|
+ <bootloader>/usr/bin/pygrub</bootloader>
|
|
+ <os>
|
|
+ <type arch='i686' machine='xenpv'>linux</type>
|
|
+ </os>
|
|
+ <clock offset='utc'/>
|
|
+ <on_poweroff>destroy</on_poweroff>
|
|
+ <on_reboot>restart</on_reboot>
|
|
+ <on_crash>restart</on_crash>
|
|
+ <devices>
|
|
+ <disk type='block' device='disk'>
|
|
+ <driver name='phy'/>
|
|
+ <source dev='/dev/HostVG/XenGuest1'/>
|
|
+ <target dev='xvda' bus='xen'/>
|
|
+ </disk>
|
|
+ <interface type='bridge'>
|
|
+ <mac address='00:16:3e:66:94:9c'/>
|
|
+ <source bridge='br0'/>
|
|
+ <script path='vif-bridge'/>
|
|
+ </interface>
|
|
+ <console type='pty'>
|
|
+ <target type='xen' port='0'/>
|
|
+ </console>
|
|
+ <input type='mouse' bus='xen'/>
|
|
+ <graphics type='vnc' port='-1' autoport='yes' listen='127.0.0.1' passwd='123poi'/>
|
|
+ </devices>
|
|
+</domain>
|
|
diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c
|
|
index 221b322..ea00747 100644
|
|
--- a/tests/xmconfigtest.c
|
|
+++ b/tests/xmconfigtest.c
|
|
@@ -210,6 +210,7 @@ mymain(int argc, char **argv)
|
|
DO_TEST("paravirt-new-pvfb-vncdisplay", 3);
|
|
DO_TEST("paravirt-net-e1000", 3);
|
|
DO_TEST("paravirt-net-vifname", 3);
|
|
+ DO_TEST("paravirt-vcpu", 2);
|
|
DO_TEST("fullvirt-old-cdrom", 1);
|
|
DO_TEST("fullvirt-new-cdrom", 2);
|
|
DO_TEST("fullvirt-utc", 2);
|
|
diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr
|
|
new file mode 100644
|
|
index 0000000..e886545
|
|
--- /dev/null
|
|
+++ b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.sexpr
|
|
@@ -0,0 +1 @@
|
|
+(vm (name 'pvtest')(memory 420)(maxmem 420)(vcpus 4)(vcpu_avail 3)(uuid '596a5d21-71f4-8fb2-e068-e2386a5c413e')(on_poweroff 'destroy')(on_reboot 'destroy')(on_crash 'destroy')(image (linux (kernel '/var/lib/xen/vmlinuz.2Dn2YT')(ramdisk '/var/lib/xen/initrd.img.0u-Vhq')(args ' method=http://download.fedora.devel.redhat.com/pub/fedora/linux/core/test/5.91/x86_64/os ')))(device (vbd (dev 'xvda')(uname 'file:/root/some.img')(mode 'w'))))
|
|
\ No newline at end of file
|
|
diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c
|
|
index 77cf760..9cf8d39 100644
|
|
--- a/tests/xml2sexprtest.c
|
|
+++ b/tests/xml2sexprtest.c
|
|
@@ -118,6 +118,7 @@ mymain(int argc, char **argv)
|
|
DO_TEST("pv-vfb-new", "pv-vfb-new", "pvtest", 3);
|
|
DO_TEST("pv-vfb-new-auto", "pv-vfb-new-auto", "pvtest", 3);
|
|
DO_TEST("pv-bootloader", "pv-bootloader", "pvtest", 1);
|
|
+ DO_TEST("pv-vcpus", "pv-vcpus", "pvtest", 1);
|
|
|
|
DO_TEST("disk-file", "disk-file", "pvtest", 2);
|
|
DO_TEST("disk-block", "disk-block", "pvtest", 2);
|
|
--
|
|
1.7.2.3
|
|
|