Now that they are not linked any more remove them.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
docs/Makefile.am | 4 +-
docs/api_extension/0001-add-to-xml.patch | 145 ----
docs/api_extension/0002-add-new-public-API.patch | 62 --
.../0003-define-internal-driver-API.patch | 222 -------
.../0004-implement-the-public-APIs.patch | 188 ------
.../0005-implement-the-remote-protocol.patch | 421 ------------
...06-make-old-API-trivially-wrap-to-new-API.patch | 735 ---------------------
docs/api_extension/0007-add-virsh-support.patch | 388 -----------
docs/api_extension/0008-support-new-xml.patch | 519 ---------------
.../0009-support-all-flags-in-test-driver.patch | 197 ------
...improve-vcpu-support-in-qemu-command-line.patch | 122 ----
...0011-complete-vcpu-support-in-qemu-driver.patch | 169 -----
...-improve-vcpu-support-in-xen-command-line.patch | 294 ---------
.../0013-improve-getting-xen-vcpu-counts.patch | 216 ------
.../0014-improve-setting-xen-vcpu-counts.patch | 342 ----------
docs/api_extension/0015-remove-dead-xen-code.patch | 228 -------
16 files changed, 1 insertion(+), 4251 deletions(-)
delete mode 100644 docs/api_extension/0001-add-to-xml.patch
delete mode 100644 docs/api_extension/0002-add-new-public-API.patch
delete mode 100644 docs/api_extension/0003-define-internal-driver-API.patch
delete mode 100644 docs/api_extension/0004-implement-the-public-APIs.patch
delete mode 100644 docs/api_extension/0005-implement-the-remote-protocol.patch
delete mode 100644 docs/api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch
delete mode 100644 docs/api_extension/0007-add-virsh-support.patch
delete mode 100644 docs/api_extension/0008-support-new-xml.patch
delete mode 100644 docs/api_extension/0009-support-all-flags-in-test-driver.patch
delete mode 100644
docs/api_extension/0010-improve-vcpu-support-in-qemu-command-line.patch
delete mode 100644 docs/api_extension/0011-complete-vcpu-support-in-qemu-driver.patch
delete mode 100644
docs/api_extension/0012-improve-vcpu-support-in-xen-command-line.patch
delete mode 100644 docs/api_extension/0013-improve-getting-xen-vcpu-counts.patch
delete mode 100644 docs/api_extension/0014-improve-setting-xen-vcpu-counts.patch
delete mode 100644 docs/api_extension/0015-remove-dead-xen-code.patch
diff --git a/docs/Makefile.am b/docs/Makefile.am
index 9620587a77..bd7bc1a431 100644
--- a/docs/Makefile.am
+++ b/docs/Makefile.am
@@ -132,8 +132,6 @@ dot_php_in = $(notdir $(wildcard $(srcdir)/*.php.in))
dot_php_code_in = $(dot_php_in:%.php.in=%.php.code.in)
dot_php = $(dot_php_in:%.php.in=%.php)
-patches = $(patsubst $(srcdir)/%,%,$(wildcard $(srcdir)/api_extension/*.patch))
-
xml = \
libvirt-api.xml \
libvirt-refs.xml
@@ -177,7 +175,7 @@ EXTRA_DIST= \
$(dot_html) $(dot_html_in) $(gif) $(apihtml) $(apipng) \
$(devhelphtml) $(devhelppng) $(devhelpcss) $(devhelpxsl) \
$(xml) $(qemu_xml) $(lxc_xml) $(admin_xml) $(fig) $(png) $(css) \
- $(logofiles) $(patches) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
+ $(logofiles) $(dot_php_in) $(dot_php_code_in) $(dot_php)\
$(internals_html_in) $(internals_html) $(fonts) \
aclperms.htmlinc \
hvsupport.pl \
diff --git a/docs/api_extension/0001-add-to-xml.patch
b/docs/api_extension/0001-add-to-xml.patch
deleted file mode 100644
index 9fee869d11..0000000000
--- a/docs/api_extension/0001-add-to-xml.patch
+++ /dev/null
@@ -1,145 +0,0 @@
-From a74f4e44649906dcd82151f7ef837f66d7fa2ab1 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Mon, 27 Sep 2010 17:36:06 -0600
-Subject: [PATCH 01/15] vcpu: add current attribute to <vcpu> element
-
-Syntax agreed on in
-https://www.redhat.com/archives/libvir-list/2010-September/msg00476.html
-
-<domain ...>
- <vcpu current='x'>y</vcpu>
-...
-
-can now be used to specify 1 <= x <= y current vcpus, in relation
-to the boot-time max of y vcpus. If current is omitted, then
-current and max are assumed to be the same value.
-
-* docs/schemas/domain.rng: Add new attribute.
-* docs/formatdomain.html.in: Document it.
-* tests/qemuxml2argvdata/qemuxml2argv-smp.xml: Add to
-domainschematest.
-* tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml: Likewise.
----
- docs/formatdomain.html.in | 9 +++++--
- docs/schemas/domain.rng | 5 ++++
- tests/qemuxml2argvdata/qemuxml2argv-smp.xml | 28 +++++++++++++++++++++++++++
- tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml | 22 +++++++++++++++++++++
- 4 files changed, 61 insertions(+), 3 deletions(-)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-smp.xml
- create mode 100644 tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
-
-diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
-index a8a1fac..96de121 100644
---- a/docs/formatdomain.html.in
-+++ b/docs/formatdomain.html.in
-@@ -200,7 +200,7 @@
- <swap_hard_limit>2097152</swap_hard_limit>
- <min_guarantee>65536</min_guarantee>
- </memtune>
-- <vcpu cpuset="1-4,^3,6">2</vcpu>
-+ <vcpu cpuset="1-4,^3,6"
current="1">2</vcpu>
- ...</pre>
-
- <dl>
-@@ -238,7 +238,7 @@
- minimum memory allocation for the guest. The units for this value are
- kilobytes (i.e. blocks of 1024 bytes)</dd>
- <dt><code>vcpu</code></dt>
-- <dd>The content of this element defines the number of virtual
-+ <dd>The content of this element defines the maximum number of virtual
- CPUs allocated for the guest OS, which must be between 1 and
- the maximum supported by the hypervisor. <span
class="since">Since
- 0.4.4</span>, this element can contain an optional
-@@ -246,7 +246,10 @@
- list of physical CPU numbers that virtual CPUs can be pinned
- to. Each element in that list is either a single CPU number,
- a range of CPU numbers, or a caret followed by a CPU number to
-- be excluded from a previous range.
-+ be excluded from a previous range. <span class="since">Since
-+ 0.8.5</span>, the optional attribute <code>current</code> can
-+ be used to specify whether fewer than the maximum number of
-+ virtual CPUs should be enabled.
- </dd>
- </dl>
-
-diff --git a/docs/schemas/domain.rng b/docs/schemas/domain.rng
-index f230263..a934a77 100644
---- a/docs/schemas/domain.rng
-+++ b/docs/schemas/domain.rng
-@@ -337,6 +337,11 @@
- <ref name="cpuset"/>
- </attribute>
- </optional>
-+ <optional>
-+ <attribute name="current">
-+ <ref name="countCPU"/>
-+ </attribute>
-+ </optional>
- <ref name="countCPU"/>
- </element>
- </optional>
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.xml
b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml
-new file mode 100644
-index 0000000..975f873
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.xml
-@@ -0,0 +1,28 @@
-+<domain type='qemu'>
-+ <name>QEMUGuest1</name>
-+ <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
-+ <memory>219200</memory>
-+ <currentMemory>219200</currentMemory>
-+ <vcpu current='1'>2</vcpu>
-+ <os>
-+ <type arch='i686' machine='pc'>hvm</type>
-+ <boot dev='hd'/>
-+ </os>
-+ <cpu>
-+ <topology sockets='2' cores='1' threads='1'/>
-+ </cpu>
-+ <clock offset='utc'/>
-+ <on_poweroff>destroy</on_poweroff>
-+ <on_reboot>restart</on_reboot>
-+ <on_crash>destroy</on_crash>
-+ <devices>
-+ <emulator>/usr/bin/qemu</emulator>
-+ <disk type='block' device='disk'>
-+ <source dev='/dev/HostVG/QEMUGuest1'/>
-+ <target dev='hda' bus='ide'/>
-+ <address type='drive' controller='0' bus='0'
unit='0'/>
-+ </disk>
-+ <controller type='ide' index='0'/>
-+ <memballoon model='virtio'/>
-+ </devices>
-+</domain>
-diff --git a/tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
-new file mode 100644
-index 0000000..d061e11
---- /dev/null
-+++ b/tests/xml2sexprdata/xml2sexpr-pv-vcpus.xml
-@@ -0,0 +1,22 @@
-+<domain type='xen' id='15'>
-+ <name>pvtest</name>
-+ <uuid>596a5d2171f48fb2e068e2386a5c413e</uuid>
-+ <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...
</cmdline>
-+ </os>
-+ <memory>430080</memory>
-+ <vcpu current='2'>4</vcpu>
-+ <on_poweroff>destroy</on_poweroff>
-+ <on_reboot>destroy</on_reboot>
-+ <on_crash>destroy</on_crash>
-+ <devices>
-+ <disk type='file' device='disk'>
-+ <source file='/root/some.img'/>
-+ <target dev='xvda'/>
-+ </disk>
-+ <console tty='/dev/pts/4'/>
-+ </devices>
-+</domain>
---
-1.7.2.3
-
diff --git a/docs/api_extension/0002-add-new-public-API.patch
b/docs/api_extension/0002-add-new-public-API.patch
deleted file mode 100644
index df93440a31..0000000000
--- a/docs/api_extension/0002-add-new-public-API.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From ea3f5c68093429c6ad507b45689cdf209c2c257b Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Fri, 24 Sep 2010 16:48:45 -0600
-Subject: [PATCH 02/15] vcpu: add new public API
-
-API agreed on in
-https://www.redhat.com/archives/libvir-list/2010-September/msg00456.html,
-but modified for enum names to be consistent with virDomainDeviceModifyFlags.
-
-* include/libvirt/libvirt.h.in (virDomainVcpuFlags)
-(virDomainSetVcpusFlags, virDomainGetVcpusFlags): New
-declarations.
-* src/libvirt_public.syms: Export new symbols.
----
- include/libvirt/libvirt.h.in | 15 +++++++++++++++
- src/libvirt_public.syms | 2 ++
- 2 files changed, 17 insertions(+), 0 deletions(-)
-
-diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
-index 2eba61e..d0cc4c0 100644
---- a/include/libvirt/libvirt.h.in
-+++ b/include/libvirt/libvirt.h.in
-@@ -915,8 +915,23 @@ struct _virVcpuInfo {
- };
- typedef virVcpuInfo *virVcpuInfoPtr;
-
-+/* Flags for controlling virtual CPU hot-plugging. */
-+typedef enum {
-+ /* Must choose at least one of these two bits; SetVcpus can choose both */
-+ VIR_DOMAIN_VCPU_LIVE = (1 << 0), /* Affect active domain */
-+ VIR_DOMAIN_VCPU_CONFIG = (1 << 1), /* Affect next boot */
-+
-+ /* Additional flags to be bit-wise OR'd in */
-+ VIR_DOMAIN_VCPU_MAXIMUM = (1 << 2), /* Max rather than current count */
-+} virDomainVcpuFlags;
-+
- int virDomainSetVcpus (virDomainPtr domain,
- unsigned int nvcpus);
-+int virDomainSetVcpusFlags (virDomainPtr domain,
-+ unsigned int nvcpus,
-+ unsigned int flags);
-+int virDomainGetVcpusFlags (virDomainPtr domain,
-+ unsigned int flags);
-
- int virDomainPinVcpu (virDomainPtr domain,
- unsigned int vcpu,
-diff --git a/src/libvirt_public.syms b/src/libvirt_public.syms
-index fceb516..a8091b1 100644
---- a/src/libvirt_public.syms
-+++ b/src/libvirt_public.syms
-@@ -409,6 +409,8 @@ LIBVIRT_0.8.5 {
- global:
- virDomainSetMemoryParameters;
- virDomainGetMemoryParameters;
-+ virDomainGetVcpusFlags;
-+ virDomainSetVcpusFlags;
- } LIBVIRT_0.8.2;
-
- # .... define new API here using predicted next version number ....
---
-1.7.2.3
-
diff --git a/docs/api_extension/0003-define-internal-driver-API.patch
b/docs/api_extension/0003-define-internal-driver-API.patch
deleted file mode 100644
index 2156d974c5..0000000000
--- a/docs/api_extension/0003-define-internal-driver-API.patch
+++ /dev/null
@@ -1,222 +0,0 @@
-From dd255d64053e9960cd375994ce8f056522e12acc Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Mon, 27 Sep 2010 09:18:22 -0600
-Subject: [PATCH 03/15] vcpu: define internal driver API
-
-* src/driver.h (virDrvDomainSetVcpusFlags)
-(virDrvDomainGetVcpusFlags): New typedefs.
-(_virDriver): New callback members.
-* src/esx/esx_driver.c (esxDriver): Add stub for driver.
-* src/lxc/lxc_driver.c (lxcDriver): Likewise.
-* src/opennebula/one_driver.c (oneDriver): Likewise.
-* src/openvz/openvz_driver.c (openvzDriver): Likewise.
-* src/phyp/phyp_driver.c (phypDriver): Likewise.
-* src/qemu/qemu_driver.c (qemuDriver): Likewise.
-* src/remote/remote_driver.c (remote_driver): Likewise.
-* src/test/test_driver.c (testDriver): Likewise.
-* src/uml/uml_driver.c (umlDriver): Likewise.
-* src/vbox/vbox_tmpl.c (Driver): Likewise.
-* src/xen/xen_driver.c (xenUnifiedDriver): Likewise.
-* src/xenapi/xenapi_driver.c (xenapiDriver): Likewise.
----
- src/driver.h | 9 +++++++++
- src/esx/esx_driver.c | 2 ++
- src/lxc/lxc_driver.c | 2 ++
- src/opennebula/one_driver.c | 2 ++
- src/openvz/openvz_driver.c | 2 ++
- src/phyp/phyp_driver.c | 2 ++
- src/qemu/qemu_driver.c | 2 ++
- src/remote/remote_driver.c | 2 ++
- src/test/test_driver.c | 2 ++
- src/uml/uml_driver.c | 2 ++
- src/vbox/vbox_tmpl.c | 2 ++
- src/xen/xen_driver.c | 2 ++
- src/xenapi/xenapi_driver.c | 2 ++
- 13 files changed, 33 insertions(+), 0 deletions(-)
-
-diff --git a/src/driver.h b/src/driver.h
-index 32aeb04..79a96c1 100644
---- a/src/driver.h
-+++ b/src/driver.h
-@@ -185,6 +185,13 @@ typedef int
- (*virDrvDomainSetVcpus) (virDomainPtr domain,
- unsigned int nvcpus);
- typedef int
-+ (*virDrvDomainSetVcpusFlags) (virDomainPtr domain,
-+ unsigned int nvcpus,
-+ unsigned int flags);
-+typedef int
-+ (*virDrvDomainGetVcpusFlags) (virDomainPtr domain,
-+ unsigned int flags);
-+typedef int
- (*virDrvDomainPinVcpu) (virDomainPtr domain,
- unsigned int vcpu,
- unsigned char *cpumap,
-@@ -520,6 +527,8 @@ struct _virDriver {
- virDrvDomainRestore domainRestore;
- virDrvDomainCoreDump domainCoreDump;
- virDrvDomainSetVcpus domainSetVcpus;
-+ virDrvDomainSetVcpusFlags domainSetVcpusFlags;
-+ virDrvDomainGetVcpusFlags domainGetVcpusFlags;
- virDrvDomainPinVcpu domainPinVcpu;
- virDrvDomainGetVcpus domainGetVcpus;
- virDrvDomainGetMaxVcpus domainGetMaxVcpus;
-diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
-index 1b4ee29..2a32374 100644
---- a/src/esx/esx_driver.c
-+++ b/src/esx/esx_driver.c
-@@ -4160,6 +4160,8 @@ static virDriver esxDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- esxDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- esxDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
-index df814da..7563a8c 100644
---- a/src/lxc/lxc_driver.c
-+++ b/src/lxc/lxc_driver.c
-@@ -2768,6 +2768,8 @@ static virDriver lxcDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- NULL, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- NULL, /* domainGetMaxVcpus */
-diff --git a/src/opennebula/one_driver.c b/src/opennebula/one_driver.c
-index ced9a38..199fca3 100644
---- a/src/opennebula/one_driver.c
-+++ b/src/opennebula/one_driver.c
-@@ -751,6 +751,8 @@ static virDriver oneDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- NULL, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- NULL, /* domainGetMaxVcpus */
-diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
-index 92cf4a1..9d19aeb 100644
---- a/src/openvz/openvz_driver.c
-+++ b/src/openvz/openvz_driver.c
-@@ -1590,6 +1590,8 @@ static virDriver openvzDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- openvzDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- openvzDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
-index e63d8d9..6e0a5e9 100644
---- a/src/phyp/phyp_driver.c
-+++ b/src/phyp/phyp_driver.c
-@@ -3941,6 +3941,8 @@ static virDriver phypDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- phypDomainSetCPU, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- phypGetLparCPUMAX, /* domainGetMaxVcpus */
-diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
-index abd8e9d..3d17e04 100644
---- a/src/qemu/qemu_driver.c
-+++ b/src/qemu/qemu_driver.c
-@@ -12938,6 +12938,8 @@ static virDriver qemuDriver = {
- qemudDomainRestore, /* domainRestore */
- qemudDomainCoreDump, /* domainCoreDump */
- qemudDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- qemudDomainPinVcpu, /* domainPinVcpu */
- qemudDomainGetVcpus, /* domainGetVcpus */
- qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
-index 0b10406..1a687ad 100644
---- a/src/remote/remote_driver.c
-+++ b/src/remote/remote_driver.c
-@@ -10468,6 +10468,8 @@ static virDriver remote_driver = {
- remoteDomainRestore, /* domainRestore */
- remoteDomainCoreDump, /* domainCoreDump */
- remoteDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- remoteDomainPinVcpu, /* domainPinVcpu */
- remoteDomainGetVcpus, /* domainGetVcpus */
- remoteDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/test/test_driver.c b/src/test/test_driver.c
-index 7d4d119..6a00558 100644
---- a/src/test/test_driver.c
-+++ b/src/test/test_driver.c
-@@ -5260,6 +5260,8 @@ static virDriver testDriver = {
- testDomainRestore, /* domainRestore */
- testDomainCoreDump, /* domainCoreDump */
- testSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- testDomainPinVcpu, /* domainPinVcpu */
- testDomainGetVcpus, /* domainGetVcpus */
- testDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/uml/uml_driver.c b/src/uml/uml_driver.c
-index 3dcd321..5161012 100644
---- a/src/uml/uml_driver.c
-+++ b/src/uml/uml_driver.c
-@@ -2129,6 +2129,8 @@ static virDriver umlDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- NULL, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- NULL, /* domainGetMaxVcpus */
-diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
-index 7e7d8e4..cb9193a 100644
---- a/src/vbox/vbox_tmpl.c
-+++ b/src/vbox/vbox_tmpl.c
-@@ -8267,6 +8267,8 @@ virDriver NAME(Driver) = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- vboxDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- vboxDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
-index c2a4de3..7d67ced 100644
---- a/src/xen/xen_driver.c
-+++ b/src/xen/xen_driver.c
-@@ -1951,6 +1951,8 @@ static virDriver xenUnifiedDriver = {
- xenUnifiedDomainRestore, /* domainRestore */
- xenUnifiedDomainCoreDump, /* domainCoreDump */
- xenUnifiedDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- xenUnifiedDomainPinVcpu, /* domainPinVcpu */
- xenUnifiedDomainGetVcpus, /* domainGetVcpus */
- xenUnifiedDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
-index e62a139..753169c 100644
---- a/src/xenapi/xenapi_driver.c
-+++ b/src/xenapi/xenapi_driver.c
-@@ -1754,6 +1754,8 @@ static virDriver xenapiDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- xenapiDomainSetVcpus, /* domainSetVcpus */
-+ NULL, /* domainSetVcpusFlags */
-+ NULL, /* domainGetVcpusFlags */
- xenapiDomainPinVcpu, /* domainPinVcpu */
- xenapiDomainGetVcpus, /* domainGetVcpus */
- xenapiDomainGetMaxVcpus, /* domainGetMaxVcpus */
---
-1.7.2.3
-
diff --git a/docs/api_extension/0004-implement-the-public-APIs.patch
b/docs/api_extension/0004-implement-the-public-APIs.patch
deleted file mode 100644
index 7f13f0ae6b..0000000000
--- a/docs/api_extension/0004-implement-the-public-APIs.patch
+++ /dev/null
@@ -1,188 +0,0 @@
-From 9d2c60799271d605f82dfd4bfa6ed7d14ad87e26 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Mon, 27 Sep 2010 09:37:22 -0600
-Subject: [PATCH 04/15] vcpu: implement the public APIs
-
-Factors common checks (such as nonzero vcpu count) up front, but
-drivers will still need to do additional flag checks.
-
-* src/libvirt.c (virDomainSetVcpusFlags, virDomainGetVcpusFlags):
-New functions.
-(virDomainSetVcpus, virDomainGetMaxVcpus): Refer to new API.
----
- src/libvirt.c | 140 ++++++++++++++++++++++++++++++++++++++++++++++++++++++---
- 1 files changed, 134 insertions(+), 6 deletions(-)
-
-diff --git a/src/libvirt.c b/src/libvirt.c
-index 629d97b..1b39210 100644
---- a/src/libvirt.c
-+++ b/src/libvirt.c
-@@ -5192,7 +5192,9 @@ error:
- * This function requires privileged access to the hypervisor.
- *
- * This command only changes the runtime configuration of the domain,
-- * so can only be called on an active domain.
-+ * so can only be called on an active domain. It is hypervisor-dependent
-+ * whether it also affects persistent configuration; for more control,
-+ * use virDomainSetVcpusFlags().
- *
- * Returns 0 in case of success, -1 in case of failure.
- */
-@@ -5237,13 +5239,139 @@ error:
- }
-
- /**
-+ * virDomainSetVcpusFlags:
-+ * @domain: pointer to domain object, or NULL for Domain0
-+ * @nvcpus: the new number of virtual CPUs for this domain, must be at least 1
-+ * @flags: an OR'ed set of virDomainVcpuFlags
-+ *
-+ * Dynamically change the number of virtual CPUs used by the domain.
-+ * Note that this call may fail if the underlying virtualization hypervisor
-+ * does not support it or if growing the number is arbitrary limited.
-+ * This function requires privileged access to the hypervisor.
-+ *
-+ * @flags must include VIR_DOMAIN_VCPU_LIVE to affect a running
-+ * domain (which may fail if domain is not active), or
-+ * VIR_DOMAIN_VCPU_CONFIG to affect the next boot via the XML
-+ * description of the domain. Both flags may be set.
-+ *
-+ * If @flags includes VIR_DOMAIN_VCPU_MAXIMUM, then
-+ * VIR_DOMAIN_VCPU_LIVE must be clear, and only the maximum virtual
-+ * CPU limit is altered; generally, this value must be less than or
-+ * equal to virConnectGetMaxVcpus(). Otherwise, this call affects the
-+ * current virtual CPU limit, which must be less than or equal to the
-+ * maximum limit.
-+ *
-+ * Returns 0 in case of success, -1 in case of failure.
-+ */
-+
-+int
-+virDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
-+ unsigned int flags)
-+{
-+ virConnectPtr conn;
-+ VIR_DEBUG("domain=%p, nvcpus=%u, flags=%u", domain, nvcpus, flags);
-+
-+ virResetLastError();
-+
-+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
-+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
-+ virDispatchError(NULL);
-+ return (-1);
-+ }
-+ if (domain->conn->flags & VIR_CONNECT_RO) {
-+ virLibDomainError(domain, VIR_ERR_OPERATION_DENIED, __FUNCTION__);
-+ goto error;
-+ }
-+
-+ /* Perform some argument validation common to all implementations. */
-+ if (nvcpus < 1 || (unsigned short) nvcpus != nvcpus ||
-+ (flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0) {
-+ virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
-+ goto error;
-+ }
-+ conn = domain->conn;
-+
-+ if (conn->driver->domainSetVcpusFlags) {
-+ int ret;
-+ ret = conn->driver->domainSetVcpusFlags (domain, nvcpus, flags);
-+ if (ret < 0)
-+ goto error;
-+ return ret;
-+ }
-+
-+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
-+
-+error:
-+ virDispatchError(domain->conn);
-+ return -1;
-+}
-+
-+/**
-+ * virDomainGetVcpusFlags:
-+ * @domain: pointer to domain object, or NULL for Domain0
-+ * @flags: an OR'ed set of virDomainVcpuFlags
-+ *
-+ * Query the number of virtual CPUs used by the domain. Note that
-+ * this call may fail if the underlying virtualization hypervisor does
-+ * not support it. This function requires privileged access to the
-+ * hypervisor.
-+ *
-+ * @flags must include either VIR_DOMAIN_VCPU_ACTIVE to query a
-+ * running domain (which will fail if domain is not active), or
-+ * VIR_DOMAIN_VCPU_PERSISTENT to query the XML description of the
-+ * domain. It is an error to set both flags.
-+ *
-+ * If @flags includes VIR_DOMAIN_VCPU_MAXIMUM, then the maximum
-+ * virtual CPU limit is queried. Otherwise, this call queries the
-+ * current virtual CPU limit.
-+ *
-+ * Returns 0 in case of success, -1 in case of failure.
-+ */
-+
-+int
-+virDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
-+{
-+ virConnectPtr conn;
-+ VIR_DEBUG("domain=%p, flags=%u", domain, flags);
-+
-+ virResetLastError();
-+
-+ if (!VIR_IS_CONNECTED_DOMAIN(domain)) {
-+ virLibDomainError(NULL, VIR_ERR_INVALID_DOMAIN, __FUNCTION__);
-+ virDispatchError(NULL);
-+ return (-1);
-+ }
-+
-+ /* Exactly one of these two flags should be set. */
-+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
-+ virLibDomainError(domain, VIR_ERR_INVALID_ARG, __FUNCTION__);
-+ goto error;
-+ }
-+ conn = domain->conn;
-+
-+ if (conn->driver->domainGetVcpusFlags) {
-+ int ret;
-+ ret = conn->driver->domainGetVcpusFlags (domain, flags);
-+ if (ret < 0)
-+ goto error;
-+ return ret;
-+ }
-+
-+ virLibConnError (conn, VIR_ERR_NO_SUPPORT, __FUNCTION__);
-+
-+error:
-+ virDispatchError(domain->conn);
-+ return -1;
-+}
-+
-+/**
- * virDomainPinVcpu:
- * @domain: pointer to domain object, or NULL for Domain0
- * @vcpu: virtual CPU number
- * @cpumap: pointer to a bit map of real CPUs (in 8-bit bytes) (IN)
-- * Each bit set to 1 means that corresponding CPU is usable.
-- * Bytes are stored in little-endian order: CPU0-7, 8-15...
-- * In each byte, lowest CPU number is least significant bit.
-+ * Each bit set to 1 means that corresponding CPU is usable.
-+ * Bytes are stored in little-endian order: CPU0-7, 8-15...
-+ * In each byte, lowest CPU number is least significant bit.
- * @maplen: number of bytes in cpumap, from 1 up to size of CPU map in
- * underlying virtualization system (Xen...).
- * If maplen < size, missing bytes are set to zero.
-@@ -5371,9 +5499,9 @@ error:
- *
- * Provides the maximum number of virtual CPUs supported for
- * the guest VM. If the guest is inactive, this is basically
-- * the same as virConnectGetMaxVcpus. If the guest is running
-+ * the same as virConnectGetMaxVcpus(). If the guest is running
- * this will reflect the maximum number of virtual CPUs the
-- * guest was booted with.
-+ * guest was booted with. For more details, see virDomainGetVcpusFlags().
- *
- * Returns the maximum of virtual CPU or -1 in case of error.
- */
---
-1.7.2.3
-
diff --git a/docs/api_extension/0005-implement-the-remote-protocol.patch
b/docs/api_extension/0005-implement-the-remote-protocol.patch
deleted file mode 100644
index 77912a033d..0000000000
--- a/docs/api_extension/0005-implement-the-remote-protocol.patch
+++ /dev/null
@@ -1,421 +0,0 @@
-From eb826444f90c2563dadf148630b0cd6a9b41ba1e Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Mon, 27 Sep 2010 10:10:06 -0600
-Subject: [PATCH 05/15] vcpu: implement the remote protocol
-
-Done by editing the first three files, then running
-'make -C src rpcgen', then editing src/remote_protocol-structs
-to match.
-
-* daemon/remote.c (remoteDispatchDomainSetVcpusFlags)
-(remoteDispatchDomainGetVcpusFlags): New functions.
-* src/remote/remote_driver.c (remoteDomainSetVcpusFlags)
-(remoteDomainGetVcpusFlags, remote_driver): Client side
-serialization.
-* src/remote/remote_protocol.x
-(remote_domain_set_vcpus_flags_args)
-(remote_domain_get_vcpus_flags_args)
-(remote_domain_get_vcpus_flags_ret)
-(REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS)
-(REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS): Define wire format.
-* daemon/remote_dispatch_args.h: Regenerate.
-* daemon/remote_dispatch_prototypes.h: Likewise.
-* daemon/remote_dispatch_table.h: Likewise.
-* src/remote/remote_protocol.c: Likewise.
-* src/remote/remote_protocol.h: Likewise.
-* src/remote_protocol-structs: Likewise.
----
- daemon/remote.c | 53 ++++++++++++++++++++++++++++++++
- daemon/remote_dispatch_args.h | 2 +
- daemon/remote_dispatch_prototypes.h | 16 ++++++++++
- daemon/remote_dispatch_ret.h | 1 +
- daemon/remote_dispatch_table.h | 10 ++++++
- src/remote/remote_driver.c | 57 +++++++++++++++++++++++++++++++++-
- src/remote/remote_protocol.c | 33 ++++++++++++++++++++
- src/remote/remote_protocol.h | 26 ++++++++++++++++
- src/remote/remote_protocol.x | 19 +++++++++++-
- src/remote_protocol-structs | 12 +++++++
- 10 files changed, 226 insertions(+), 3 deletions(-)
-
-diff --git a/daemon/remote.c b/daemon/remote.c
-index 7a96e29..323f00c 100644
---- a/daemon/remote.c
-+++ b/daemon/remote.c
-@@ -1751,6 +1751,33 @@ oom:
- }
-
- static int
-+remoteDispatchDomainGetVcpusFlags (struct qemud_server *server ATTRIBUTE_UNUSED,
-+ struct qemud_client *client ATTRIBUTE_UNUSED,
-+ virConnectPtr conn,
-+ remote_message_header *hdr ATTRIBUTE_UNUSED,
-+ remote_error *rerr,
-+ remote_domain_get_vcpus_flags_args *args,
-+ remote_domain_get_vcpus_flags_ret *ret)
-+{
-+ virDomainPtr dom;
-+
-+ dom = get_nonnull_domain (conn, args->dom);
-+ if (dom == NULL) {
-+ remoteDispatchConnError(rerr, conn);
-+ return -1;
-+ }
-+
-+ ret->num = virDomainGetVcpusFlags (dom, args->flags);
-+ if (ret->num == -1) {
-+ virDomainFree(dom);
-+ remoteDispatchConnError(rerr, conn);
-+ return -1;
-+ }
-+ virDomainFree(dom);
-+ return 0;
-+}
-+
-+static int
- remoteDispatchDomainMigratePrepare (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client ATTRIBUTE_UNUSED,
- virConnectPtr conn,
-@@ -2568,6 +2595,32 @@ remoteDispatchDomainSetVcpus (struct qemud_server *server
ATTRIBUTE_UNUSED,
- }
-
- static int
-+remoteDispatchDomainSetVcpusFlags (struct qemud_server *server ATTRIBUTE_UNUSED,
-+ struct qemud_client *client ATTRIBUTE_UNUSED,
-+ virConnectPtr conn,
-+ remote_message_header *hdr ATTRIBUTE_UNUSED,
-+ remote_error *rerr,
-+ remote_domain_set_vcpus_flags_args *args,
-+ void *ret ATTRIBUTE_UNUSED)
-+{
-+ virDomainPtr dom;
-+
-+ dom = get_nonnull_domain (conn, args->dom);
-+ if (dom == NULL) {
-+ remoteDispatchConnError(rerr, conn);
-+ return -1;
-+ }
-+
-+ if (virDomainSetVcpusFlags (dom, args->nvcpus, args->flags) == -1) {
-+ virDomainFree(dom);
-+ remoteDispatchConnError(rerr, conn);
-+ return -1;
-+ }
-+ virDomainFree(dom);
-+ return 0;
-+}
-+
-+static int
- remoteDispatchDomainShutdown (struct qemud_server *server ATTRIBUTE_UNUSED,
- struct qemud_client *client ATTRIBUTE_UNUSED,
- virConnectPtr conn,
-diff --git a/daemon/remote_dispatch_args.h b/daemon/remote_dispatch_args.h
-index d8528b6..9583e9c 100644
---- a/daemon/remote_dispatch_args.h
-+++ b/daemon/remote_dispatch_args.h
-@@ -167,3 +167,5 @@
- remote_domain_create_with_flags_args val_remote_domain_create_with_flags_args;
- remote_domain_set_memory_parameters_args
val_remote_domain_set_memory_parameters_args;
- remote_domain_get_memory_parameters_args
val_remote_domain_get_memory_parameters_args;
-+ remote_domain_set_vcpus_flags_args val_remote_domain_set_vcpus_flags_args;
-+ remote_domain_get_vcpus_flags_args val_remote_domain_get_vcpus_flags_args;
-diff --git a/daemon/remote_dispatch_prototypes.h b/daemon/remote_dispatch_prototypes.h
-index b674bb4..6b35851 100644
---- a/daemon/remote_dispatch_prototypes.h
-+++ b/daemon/remote_dispatch_prototypes.h
-@@ -306,6 +306,14 @@ static int remoteDispatchDomainGetVcpus(
- remote_error *err,
- remote_domain_get_vcpus_args *args,
- remote_domain_get_vcpus_ret *ret);
-+static int remoteDispatchDomainGetVcpusFlags(
-+ struct qemud_server *server,
-+ struct qemud_client *client,
-+ virConnectPtr conn,
-+ remote_message_header *hdr,
-+ remote_error *err,
-+ remote_domain_get_vcpus_flags_args *args,
-+ remote_domain_get_vcpus_flags_ret *ret);
- static int remoteDispatchDomainHasCurrentSnapshot(
- struct qemud_server *server,
- struct qemud_client *client,
-@@ -554,6 +562,14 @@ static int remoteDispatchDomainSetVcpus(
- remote_error *err,
- remote_domain_set_vcpus_args *args,
- void *ret);
-+static int remoteDispatchDomainSetVcpusFlags(
-+ struct qemud_server *server,
-+ struct qemud_client *client,
-+ virConnectPtr conn,
-+ remote_message_header *hdr,
-+ remote_error *err,
-+ remote_domain_set_vcpus_flags_args *args,
-+ void *ret);
- static int remoteDispatchDomainShutdown(
- struct qemud_server *server,
- struct qemud_client *client,
-diff --git a/daemon/remote_dispatch_ret.h b/daemon/remote_dispatch_ret.h
-index 17c9bca..3723b00 100644
---- a/daemon/remote_dispatch_ret.h
-+++ b/daemon/remote_dispatch_ret.h
-@@ -136,3 +136,4 @@
- remote_domain_get_block_info_ret val_remote_domain_get_block_info_ret;
- remote_domain_create_with_flags_ret val_remote_domain_create_with_flags_ret;
- remote_domain_get_memory_parameters_ret
val_remote_domain_get_memory_parameters_ret;
-+ remote_domain_get_vcpus_flags_ret val_remote_domain_get_vcpus_flags_ret;
-diff --git a/daemon/remote_dispatch_table.h b/daemon/remote_dispatch_table.h
-index 47d95eb..dd2adc7 100644
---- a/daemon/remote_dispatch_table.h
-+++ b/daemon/remote_dispatch_table.h
-@@ -997,3 +997,13 @@
- .args_filter = (xdrproc_t) xdr_remote_domain_get_memory_parameters_args,
- .ret_filter = (xdrproc_t) xdr_remote_domain_get_memory_parameters_ret,
- },
-+{ /* DomainSetVcpusFlags => 199 */
-+ .fn = (dispatch_fn) remoteDispatchDomainSetVcpusFlags,
-+ .args_filter = (xdrproc_t) xdr_remote_domain_set_vcpus_flags_args,
-+ .ret_filter = (xdrproc_t) xdr_void,
-+},
-+{ /* DomainGetVcpusFlags => 200 */
-+ .fn = (dispatch_fn) remoteDispatchDomainGetVcpusFlags,
-+ .args_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args,
-+ .ret_filter = (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret,
-+},
-diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
-index 1a687ad..37c37ef 100644
---- a/src/remote/remote_driver.c
-+++ b/src/remote/remote_driver.c
-@@ -2580,6 +2580,59 @@ done:
- }
-
- static int
-+remoteDomainSetVcpusFlags (virDomainPtr domain, unsigned int nvcpus,
-+ unsigned int flags)
-+{
-+ int rv = -1;
-+ remote_domain_set_vcpus_flags_args args;
-+ struct private_data *priv = domain->conn->privateData;
-+
-+ remoteDriverLock(priv);
-+
-+ make_nonnull_domain (&args.dom, domain);
-+ args.nvcpus = nvcpus;
-+ args.flags = flags;
-+
-+ if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS,
-+ (xdrproc_t) xdr_remote_domain_set_vcpus_flags_args,
-+ (char *) &args,
-+ (xdrproc_t) xdr_void, (char *) NULL) == -1)
-+ goto done;
-+
-+ rv = 0;
-+
-+done:
-+ remoteDriverUnlock(priv);
-+ return rv;
-+}
-+
-+static int
-+remoteDomainGetVcpusFlags (virDomainPtr domain, unsigned int flags)
-+{
-+ int rv = -1;
-+ remote_domain_get_vcpus_flags_args args;
-+ remote_domain_get_vcpus_flags_ret ret;
-+ struct private_data *priv = domain->conn->privateData;
-+
-+ remoteDriverLock(priv);
-+
-+ make_nonnull_domain (&args.dom, domain);
-+ args.flags = flags;
-+
-+ memset (&ret, 0, sizeof ret);
-+ if (call (domain->conn, priv, 0, REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS,
-+ (xdrproc_t) xdr_remote_domain_get_vcpus_flags_args, (char *) &args,
-+ (xdrproc_t) xdr_remote_domain_get_vcpus_flags_ret, (char *) &ret) ==
-1)
-+ goto done;
-+
-+ rv = ret.num;
-+
-+done:
-+ remoteDriverUnlock(priv);
-+ return rv;
-+}
-+
-+static int
- remoteDomainPinVcpu (virDomainPtr domain,
- unsigned int vcpu,
- unsigned char *cpumap,
-@@ -10468,8 +10521,8 @@ static virDriver remote_driver = {
- remoteDomainRestore, /* domainRestore */
- remoteDomainCoreDump, /* domainCoreDump */
- remoteDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ remoteDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ remoteDomainGetVcpusFlags, /* domainGetVcpusFlags */
- remoteDomainPinVcpu, /* domainPinVcpu */
- remoteDomainGetVcpus, /* domainGetVcpus */
- remoteDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/remote/remote_protocol.c b/src/remote/remote_protocol.c
-index 5c55713..38ea050 100644
---- a/src/remote/remote_protocol.c
-+++ b/src/remote/remote_protocol.c
-@@ -1355,6 +1355,39 @@ xdr_remote_domain_set_vcpus_args (XDR *xdrs,
remote_domain_set_vcpus_args *objp)
- }
-
- bool_t
-+xdr_remote_domain_set_vcpus_flags_args (XDR *xdrs, remote_domain_set_vcpus_flags_args
*objp)
-+{
-+
-+ if (!xdr_remote_nonnull_domain (xdrs, &objp->dom))
-+ return FALSE;
-+ if (!xdr_u_int (xdrs, &objp->nvcpus))
-+ return FALSE;
-+ if (!xdr_u_int (xdrs, &objp->flags))
-+ return FALSE;
-+ return TRUE;
-+}
-+
-+bool_t
-+xdr_remote_domain_get_vcpus_flags_args (XDR *xdrs, remote_domain_get_vcpus_flags_args
*objp)
-+{
-+
-+ if (!xdr_remote_nonnull_domain (xdrs, &objp->dom))
-+ return FALSE;
-+ if (!xdr_u_int (xdrs, &objp->flags))
-+ return FALSE;
-+ return TRUE;
-+}
-+
-+bool_t
-+xdr_remote_domain_get_vcpus_flags_ret (XDR *xdrs, remote_domain_get_vcpus_flags_ret
*objp)
-+{
-+
-+ if (!xdr_int (xdrs, &objp->num))
-+ return FALSE;
-+ return TRUE;
-+}
-+
-+bool_t
- xdr_remote_domain_pin_vcpu_args (XDR *xdrs, remote_domain_pin_vcpu_args *objp)
- {
- char **objp_cpp0 = (char **) (void *) &objp->cpumap.cpumap_val;
-diff --git a/src/remote/remote_protocol.h b/src/remote/remote_protocol.h
-index 756da11..d75e76c 100644
---- a/src/remote/remote_protocol.h
-+++ b/src/remote/remote_protocol.h
-@@ -750,6 +750,24 @@ struct remote_domain_set_vcpus_args {
- };
- typedef struct remote_domain_set_vcpus_args remote_domain_set_vcpus_args;
-
-+struct remote_domain_set_vcpus_flags_args {
-+ remote_nonnull_domain dom;
-+ u_int nvcpus;
-+ u_int flags;
-+};
-+typedef struct remote_domain_set_vcpus_flags_args remote_domain_set_vcpus_flags_args;
-+
-+struct remote_domain_get_vcpus_flags_args {
-+ remote_nonnull_domain dom;
-+ u_int flags;
-+};
-+typedef struct remote_domain_get_vcpus_flags_args remote_domain_get_vcpus_flags_args;
-+
-+struct remote_domain_get_vcpus_flags_ret {
-+ int num;
-+};
-+typedef struct remote_domain_get_vcpus_flags_ret remote_domain_get_vcpus_flags_ret;
-+
- struct remote_domain_pin_vcpu_args {
- remote_nonnull_domain dom;
- int vcpu;
-@@ -2281,6 +2299,8 @@ enum remote_procedure {
- REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196,
- REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
- REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
-+ REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
-+ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200,
- };
- typedef enum remote_procedure remote_procedure;
-
-@@ -2422,6 +2442,9 @@ extern bool_t xdr_remote_domain_define_xml_args (XDR *,
remote_domain_define_xm
- extern bool_t xdr_remote_domain_define_xml_ret (XDR *, remote_domain_define_xml_ret*);
- extern bool_t xdr_remote_domain_undefine_args (XDR *, remote_domain_undefine_args*);
- extern bool_t xdr_remote_domain_set_vcpus_args (XDR *, remote_domain_set_vcpus_args*);
-+extern bool_t xdr_remote_domain_set_vcpus_flags_args (XDR *,
remote_domain_set_vcpus_flags_args*);
-+extern bool_t xdr_remote_domain_get_vcpus_flags_args (XDR *,
remote_domain_get_vcpus_flags_args*);
-+extern bool_t xdr_remote_domain_get_vcpus_flags_ret (XDR *,
remote_domain_get_vcpus_flags_ret*);
- extern bool_t xdr_remote_domain_pin_vcpu_args (XDR *, remote_domain_pin_vcpu_args*);
- extern bool_t xdr_remote_domain_get_vcpus_args (XDR *, remote_domain_get_vcpus_args*);
- extern bool_t xdr_remote_domain_get_vcpus_ret (XDR *, remote_domain_get_vcpus_ret*);
-@@ -2762,6 +2785,9 @@ extern bool_t xdr_remote_domain_define_xml_args ();
- extern bool_t xdr_remote_domain_define_xml_ret ();
- extern bool_t xdr_remote_domain_undefine_args ();
- extern bool_t xdr_remote_domain_set_vcpus_args ();
-+extern bool_t xdr_remote_domain_set_vcpus_flags_args ();
-+extern bool_t xdr_remote_domain_get_vcpus_flags_args ();
-+extern bool_t xdr_remote_domain_get_vcpus_flags_ret ();
- extern bool_t xdr_remote_domain_pin_vcpu_args ();
- extern bool_t xdr_remote_domain_get_vcpus_args ();
- extern bool_t xdr_remote_domain_get_vcpus_ret ();
-diff --git a/src/remote/remote_protocol.x b/src/remote/remote_protocol.x
-index e80fb5f..d57e6d0 100644
---- a/src/remote/remote_protocol.x
-+++ b/src/remote/remote_protocol.x
-@@ -768,6 +768,21 @@ struct remote_domain_set_vcpus_args {
- int nvcpus;
- };
-
-+struct remote_domain_set_vcpus_flags_args {
-+ remote_nonnull_domain dom;
-+ unsigned int nvcpus;
-+ unsigned int flags;
-+};
-+
-+struct remote_domain_get_vcpus_flags_args {
-+ remote_nonnull_domain dom;
-+ unsigned int flags;
-+};
-+
-+struct remote_domain_get_vcpus_flags_ret {
-+ int num;
-+};
-+
- struct remote_domain_pin_vcpu_args {
- remote_nonnull_domain dom;
- int vcpu;
-@@ -2062,7 +2077,9 @@ enum remote_procedure {
- REMOTE_PROC_DOMAIN_EVENT_IO_ERROR_REASON = 195,
- REMOTE_PROC_DOMAIN_CREATE_WITH_FLAGS = 196,
- REMOTE_PROC_DOMAIN_SET_MEMORY_PARAMETERS = 197,
-- REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198
-+ REMOTE_PROC_DOMAIN_GET_MEMORY_PARAMETERS = 198,
-+ REMOTE_PROC_DOMAIN_SET_VCPUS_FLAGS = 199,
-+ REMOTE_PROC_DOMAIN_GET_VCPUS_FLAGS = 200
-
- /*
- * Notice how the entries are grouped in sets of 10 ?
-diff --git a/src/remote_protocol-structs b/src/remote_protocol-structs
-index 838423e..d505886 100644
---- a/src/remote_protocol-structs
-+++ b/src/remote_protocol-structs
-@@ -461,6 +461,18 @@ struct remote_domain_set_vcpus_args {
- remote_nonnull_domain dom;
- int nvcpus;
- };
-+struct remote_domain_set_vcpus_flags_args {
-+ remote_nonnull_domain dom;
-+ u_int nvcpus;
-+ u_int flags;
-+};
-+struct remote_domain_get_vcpus_flags_args {
-+ remote_nonnull_domain dom;
-+ u_int flags;
-+};
-+struct remote_domain_get_vcpus_flags_ret {
-+ int num;
-+};
- struct remote_domain_pin_vcpu_args {
- remote_nonnull_domain dom;
- int vcpu;
---
-1.7.2.3
-
diff --git a/docs/api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch
b/docs/api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch
deleted file mode 100644
index 1ef51fef46..0000000000
--- a/docs/api_extension/0006-make-old-API-trivially-wrap-to-new-API.patch
+++ /dev/null
@@ -1,735 +0,0 @@
-From 50c51f13e2af04afac46e181c4ed62581545a488 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Mon, 27 Sep 2010 16:37:53 -0600
-Subject: [PATCH 06/15] vcpu: make old API trivially wrap to new API
-
-Note - this wrapping is completely mechanical; the old API will
-function identically, since the new API validates that the exact
-same flags are provided by the old API. On a per-driver basis,
-it may make sense to have the old API pass a different set of flags,
-but that should be done in the per-driver patch that implements
-the full range of flag support in the new API.
-
-* src/esx/esx_driver.c (esxDomainSetVcpus, escDomainGetMaxVpcus):
-Move guts...
-(esxDomainSetVcpusFlags, esxDomainGetVcpusFlags): ...to new
-functions.
-(esxDriver): Trivially support the new API.
-* src/openvz/openvz_driver.c (openvzDomainSetVcpus)
-(openvzDomainSetVcpusFlags, openvzDomainGetMaxVcpus)
-(openvzDomainGetVcpusFlags, openvzDriver): Likewise.
-* src/phyp/phyp_driver.c (phypDomainSetCPU)
-(phypDomainSetVcpusFlags, phypGetLparCPUMAX)
-(phypDomainGetVcpusFlags, phypDriver): Likewise.
-* src/qemu/qemu_driver.c (qemudDomainSetVcpus)
-(qemudDomainSetVcpusFlags, qemudDomainGetMaxVcpus)
-(qemudDomainGetVcpusFlags, qemuDriver): Likewise.
-* src/test/test_driver.c (testSetVcpus, testDomainSetVcpusFlags)
-(testDomainGetMaxVcpus, testDomainGetVcpusFlags, testDriver):
-Likewise.
-* src/vbox/vbox_tmpl.c (vboxDomainSetVcpus)
-(vboxDomainSetVcpusFlags, virDomainGetMaxVcpus)
-(virDomainGetVcpusFlags, virDriver): Likewise.
-* src/xen/xen_driver.c (xenUnifiedDomainSetVcpus)
-(xenUnifiedDomainSetVcpusFlags, xenUnifiedDomainGetMaxVcpus)
-(xenUnifiedDomainGetVcpusFlags, xenUnifiedDriver): Likewise.
-* src/xenapi/xenapi_driver.c (xenapiDomainSetVcpus)
-(xenapiDomainSetVcpusFlags, xenapiDomainGetMaxVcpus)
-(xenapiDomainGetVcpusFlags, xenapiDriver): Likewise.
-(xenapiError): New helper macro.
----
- src/esx/esx_driver.c | 32 +++++++++++++++++++---
- src/openvz/openvz_driver.c | 34 +++++++++++++++++++++---
- src/phyp/phyp_driver.c | 32 ++++++++++++++++++++---
- src/qemu/qemu_driver.c | 38 +++++++++++++++++++++++++---
- src/test/test_driver.c | 36 ++++++++++++++++++++++---
- src/vbox/vbox_tmpl.c | 36 +++++++++++++++++++++++---
- src/xen/xen_driver.c | 34 ++++++++++++++++++++++---
- src/xenapi/xenapi_driver.c | 60 ++++++++++++++++++++++++++++++++++++++------
- 8 files changed, 263 insertions(+), 39 deletions(-)
-
-diff --git a/src/esx/esx_driver.c b/src/esx/esx_driver.c
-index 2a32374..b3e1284 100644
---- a/src/esx/esx_driver.c
-+++ b/src/esx/esx_driver.c
-@@ -2384,7 +2384,8 @@ esxDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info)
-
-
- static int
--esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
-+esxDomainSetVcpusFlags(virDomainPtr domain, unsigned int nvcpus,
-+ unsigned int flags)
- {
- int result = -1;
- esxPrivate *priv = domain->conn->privateData;
-@@ -2394,6 +2395,11 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
- esxVI_ManagedObjectReference *task = NULL;
- esxVI_TaskInfoState taskInfoState;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ ESX_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- if (nvcpus < 1) {
- ESX_ERROR(VIR_ERR_INVALID_ARG, "%s",
- _("Requested number of virtual CPUs must at least be 1"));
-@@ -2453,15 +2459,26 @@ esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
- }
-
-
-+static int
-+esxDomainSetVcpus(virDomainPtr domain, unsigned int nvcpus)
-+{
-+ return esxDomainSetVcpusFlags(domain, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
-
- static int
--esxDomainGetMaxVcpus(virDomainPtr domain)
-+esxDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
- {
- esxPrivate *priv = domain->conn->privateData;
- esxVI_String *propertyNameList = NULL;
- esxVI_ObjectContent *hostSystem = NULL;
- esxVI_DynamicProperty *dynamicProperty = NULL;
-
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ ESX_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- if (priv->maxVcpus > 0) {
- return priv->maxVcpus;
- }
-@@ -2507,7 +2524,12 @@ esxDomainGetMaxVcpus(virDomainPtr domain)
- return priv->maxVcpus;
- }
-
--
-+static int
-+esxDomainGetMaxVcpus(virDomainPtr domain)
-+{
-+ return esxDomainGetVcpusFlags(domain, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-
- static char *
- esxDomainDumpXML(virDomainPtr domain, int flags)
-@@ -4160,8 +4182,8 @@ static virDriver esxDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- esxDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ esxDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ esxDomainGetVcpusFlags, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- esxDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
-index 9d19aeb..0f3cfdf 100644
---- a/src/openvz/openvz_driver.c
-+++ b/src/openvz/openvz_driver.c
-@@ -67,7 +67,6 @@
- static int openvzGetProcessInfo(unsigned long long *cpuTime, int vpsid);
- static int openvzGetMaxVCPUs(virConnectPtr conn, const char *type);
- static int openvzDomainGetMaxVcpus(virDomainPtr dom);
--static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus);
- static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
- unsigned int nvcpus);
- static int openvzDomainSetMemoryInternal(virDomainObjPtr vm,
-@@ -1211,11 +1210,24 @@ static int openvzGetMaxVCPUs(virConnectPtr conn
ATTRIBUTE_UNUSED,
- return -1;
- }
-
-+static int
-+openvzDomainGetVcpusFlags(virDomainPtr dom ATTRIBUTE_UNUSED,
-+ unsigned int flags)
-+{
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ openvzError(VIR_ERR_INVALID_ARG, _("unsupported flags (0x%x)"),
flags);
-+ return -1;
-+ }
-
--static int openvzDomainGetMaxVcpus(virDomainPtr dom ATTRIBUTE_UNUSED) {
- return openvzGetMaxVCPUs(NULL, "openvz");
- }
-
-+static int openvzDomainGetMaxVcpus(virDomainPtr dom)
-+{
-+ return openvzDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
- static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
- unsigned int nvcpus)
- {
-@@ -1241,12 +1253,18 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
- return 0;
- }
-
--static int openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
-+static int openvzDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
-+ unsigned int flags)
- {
- virDomainObjPtr vm;
- struct openvz_driver *driver = dom->conn->privateData;
- int ret = -1;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ openvzError(VIR_ERR_INVALID_ARG, _("unsupported flags (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- openvzDriverLock(driver);
- vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- openvzDriverUnlock(driver);
-@@ -1272,6 +1290,12 @@ cleanup:
- return ret;
- }
-
-+static int
-+openvzDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
-+{
-+ return openvzDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
- static virDrvOpenStatus openvzOpen(virConnectPtr conn,
- virConnectAuthPtr auth ATTRIBUTE_UNUSED,
- int flags ATTRIBUTE_UNUSED)
-@@ -1590,8 +1614,8 @@ static virDriver openvzDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- openvzDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ openvzDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ openvzDomainGetVcpusFlags, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- openvzDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
-index 6e0a5e9..e284ae0 100644
---- a/src/phyp/phyp_driver.c
-+++ b/src/phyp/phyp_driver.c
-@@ -1497,15 +1497,27 @@ phypGetLparCPU(virConnectPtr conn, const char *managed_system,
int lpar_id)
- }
-
- static int
--phypGetLparCPUMAX(virDomainPtr dom)
-+phypDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
- {
- phyp_driverPtr phyp_driver = dom->conn->privateData;
- char *managed_system = phyp_driver->managed_system;
-
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ PHYP_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- return phypGetLparCPUGeneric(dom->conn, managed_system, dom->id, 1);
- }
-
- static int
-+phypGetLparCPUMAX(virDomainPtr dom)
-+{
-+ return phypDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
-+static int
- phypGetRemoteSlot(virConnectPtr conn, const char *managed_system,
- const char *lpar_name)
- {
-@@ -3831,7 +3843,8 @@ phypConnectGetCapabilities(virConnectPtr conn)
- }
-
- static int
--phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
-+phypDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
-+ unsigned int flags)
- {
- ConnectionData *connection_data = dom->conn->networkPrivateData;
- phyp_driverPtr phyp_driver = dom->conn->privateData;
-@@ -3846,6 +3859,11 @@ phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
- unsigned int amount = 0;
- virBuffer buf = VIR_BUFFER_INITIALIZER;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ PHYP_ERROR(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- if ((ncpus = phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0)
- return 0;
-
-@@ -3891,6 +3909,12 @@ phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
-
- }
-
-+static int
-+phypDomainSetCPU(virDomainPtr dom, unsigned int nvcpus)
-+{
-+ return phypDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
- static virDrvOpenStatus
- phypVIOSDriverOpen(virConnectPtr conn,
- virConnectAuthPtr auth ATTRIBUTE_UNUSED,
-@@ -3941,8 +3965,8 @@ static virDriver phypDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- phypDomainSetCPU, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ phypDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ phypDomainGetVcpusFlags, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- phypGetLparCPUMAX, /* domainGetMaxVcpus */
-diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
-index 3d17e04..7a2ea8f 100644
---- a/src/qemu/qemu_driver.c
-+++ b/src/qemu/qemu_driver.c
-@@ -5934,13 +5934,22 @@ unsupported:
- }
-
-
--static int qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
-+static int
-+qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
-+ unsigned int flags)
-+{
- struct qemud_driver *driver = dom->conn->privateData;
- virDomainObjPtr vm;
- const char * type;
- int max;
- int ret = -1;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-+ flags);
-+ return -1;
-+ }
-+
- qemuDriverLock(driver);
- vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
-@@ -5994,6 +6003,12 @@ cleanup:
- return ret;
- }
-
-+static int
-+qemudDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
-+{
-+ return qemudDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
-
- static int
- qemudDomainPinVcpu(virDomainPtr dom,
-@@ -6150,12 +6165,20 @@ cleanup:
- }
-
-
--static int qemudDomainGetMaxVcpus(virDomainPtr dom) {
-+static int
-+qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
-+{
- struct qemud_driver *driver = dom->conn->privateData;
- virDomainObjPtr vm;
- const char *type;
- int ret = -1;
-
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-+ flags);
-+ return -1;
-+ }
-+
- qemuDriverLock(driver);
- vm = virDomainFindByUUID(&driver->domains, dom->uuid);
- qemuDriverUnlock(driver);
-@@ -6183,6 +6206,13 @@ cleanup:
- return ret;
- }
-
-+static int
-+qemudDomainGetMaxVcpus(virDomainPtr dom)
-+{
-+ return qemudDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
- static int qemudDomainGetSecurityLabel(virDomainPtr dom, virSecurityLabelPtr seclabel)
- {
- struct qemud_driver *driver = (struct qemud_driver *)dom->conn->privateData;
-@@ -12938,8 +12968,8 @@ static virDriver qemuDriver = {
- qemudDomainRestore, /* domainRestore */
- qemudDomainCoreDump, /* domainCoreDump */
- qemudDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ qemudDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ qemudDomainGetVcpusFlags, /* domainGetVcpusFlags */
- qemudDomainPinVcpu, /* domainPinVcpu */
- qemudDomainGetVcpus, /* domainGetVcpus */
- qemudDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/test/test_driver.c b/src/test/test_driver.c
-index 6a00558..b70c80d 100644
---- a/src/test/test_driver.c
-+++ b/src/test/test_driver.c
-@@ -2029,17 +2029,37 @@ cleanup:
- return ret;
- }
-
--static int testDomainGetMaxVcpus(virDomainPtr domain)
-+static int
-+testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
- {
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- return testGetMaxVCPUs(domain->conn, "test");
- }
-
--static int testSetVcpus(virDomainPtr domain,
-- unsigned int nrCpus) {
-+static int
-+testDomainGetMaxVcpus(virDomainPtr domain)
-+{
-+ return testDomainGetVcpusFlags(domain, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
-+static int
-+testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
-+ unsigned int flags)
-+{
- testConnPtr privconn = domain->conn->privateData;
- virDomainObjPtr privdom = NULL;
- int ret = -1, maxvcpus;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- /* Do this first before locking */
- maxvcpus = testDomainGetMaxVcpus(domain);
- if (maxvcpus < 0)
-@@ -2082,6 +2102,12 @@ cleanup:
- return ret;
- }
-
-+static int
-+testSetVcpus(virDomainPtr domain, unsigned int nrCpus)
-+{
-+ return testDomainSetVcpusFlags(domain, nrCpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
- static int testDomainGetVcpus(virDomainPtr domain,
- virVcpuInfoPtr info,
- int maxinfo,
-@@ -5260,8 +5286,8 @@ static virDriver testDriver = {
- testDomainRestore, /* domainRestore */
- testDomainCoreDump, /* domainCoreDump */
- testSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ testDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ testDomainGetVcpusFlags, /* domainGetVcpusFlags */
- testDomainPinVcpu, /* domainPinVcpu */
- testDomainGetVcpus, /* domainGetVcpus */
- testDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
-index cb9193a..0cbe8b3 100644
---- a/src/vbox/vbox_tmpl.c
-+++ b/src/vbox/vbox_tmpl.c
-@@ -1839,13 +1839,21 @@ cleanup:
- return ret;
- }
-
--static int vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus) {
-+static int
-+vboxDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
-+ unsigned int flags)
-+{
- VBOX_OBJECT_CHECK(dom->conn, int, -1);
- IMachine *machine = NULL;
- vboxIID *iid = NULL;
- PRUint32 CPUCount = nvcpus;
- nsresult rc;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ vboxError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- #if VBOX_API_VERSION == 2002
- if (VIR_ALLOC(iid) < 0) {
- virReportOOMError();
-@@ -1887,11 +1895,24 @@ cleanup:
- return ret;
- }
-
--static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
-+static int
-+vboxDomainSetVcpus(virDomainPtr dom, unsigned int nvcpus)
-+{
-+ return vboxDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
-+static int
-+vboxDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
-+{
- VBOX_OBJECT_CHECK(dom->conn, int, -1);
- ISystemProperties *systemProperties = NULL;
- PRUint32 maxCPUCount = 0;
-
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ vboxError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ return -1;
-+ }
-+
- /* Currently every domain supports the same number of max cpus
- * as that supported by vbox and thus take it directly from
- * the systemproperties.
-@@ -1909,6 +1930,13 @@ static int vboxDomainGetMaxVcpus(virDomainPtr dom) {
- return ret;
- }
-
-+static int
-+vboxDomainGetMaxVcpus(virDomainPtr dom)
-+{
-+ return vboxDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
- static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
- VBOX_OBJECT_CHECK(dom->conn, char *, NULL);
- virDomainDefPtr def = NULL;
-@@ -8267,8 +8295,8 @@ virDriver NAME(Driver) = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- vboxDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ vboxDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ vboxDomainGetVcpusFlags, /* domainGetVcpusFlags */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
- vboxDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
-index 7d67ced..d6c9c57 100644
---- a/src/xen/xen_driver.c
-+++ b/src/xen/xen_driver.c
-@@ -1069,11 +1069,18 @@ xenUnifiedDomainCoreDump (virDomainPtr dom, const char *to, int
flags)
- }
-
- static int
--xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
-+xenUnifiedDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
-+ unsigned int flags)
- {
- GET_PRIVATE(dom->conn);
- int i;
-
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-+ flags);
-+ return -1;
-+ }
-+
- /* Try non-hypervisor methods first, then hypervisor direct method
- * as a last resort.
- */
-@@ -1093,6 +1100,12 @@ xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
- }
-
- static int
-+xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
-+{
-+ return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
-+static int
- xenUnifiedDomainPinVcpu (virDomainPtr dom, unsigned int vcpu,
- unsigned char *cpumap, int maplen)
- {
-@@ -1126,11 +1139,17 @@ xenUnifiedDomainGetVcpus (virDomainPtr dom,
- }
-
- static int
--xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
-+xenUnifiedDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
- {
- GET_PRIVATE(dom->conn);
- int i, ret;
-
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-+ flags);
-+ return -1;
-+ }
-+
- for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
- if (priv->opened[i] && drivers[i]->domainGetMaxVcpus) {
- ret = drivers[i]->domainGetMaxVcpus (dom);
-@@ -1140,6 +1159,13 @@ xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
- return -1;
- }
-
-+static int
-+xenUnifiedDomainGetMaxVcpus (virDomainPtr dom)
-+{
-+ return xenUnifiedDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
- static char *
- xenUnifiedDomainDumpXML (virDomainPtr dom, int flags)
- {
-@@ -1951,8 +1977,8 @@ static virDriver xenUnifiedDriver = {
- xenUnifiedDomainRestore, /* domainRestore */
- xenUnifiedDomainCoreDump, /* domainCoreDump */
- xenUnifiedDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ xenUnifiedDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ xenUnifiedDomainGetVcpusFlags, /* domainGetVcpusFlags */
- xenUnifiedDomainPinVcpu, /* domainPinVcpu */
- xenUnifiedDomainGetVcpus, /* domainGetVcpus */
- xenUnifiedDomainGetMaxVcpus, /* domainGetMaxVcpus */
-diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
-index 753169c..7d4ab8d 100644
---- a/src/xenapi/xenapi_driver.c
-+++ b/src/xenapi/xenapi_driver.c
-@@ -40,6 +40,11 @@
- #include "xenapi_driver_private.h"
- #include "xenapi_utils.h"
-
-+#define VIR_FROM_THIS VIR_FROM_XENAPI
-+
-+#define xenapiError(code, ...) \
-+ virReportErrorHelper(NULL, VIR_FROM_THIS, code, __FILE__, \
-+ __FUNCTION__, __LINE__, __VA_ARGS__)
-
- /*
- * getCapsObject
-@@ -987,19 +992,26 @@ xenapiDomainGetInfo (virDomainPtr dom, virDomainInfoPtr info)
-
-
- /*
-- * xenapiDomainSetVcpus
-+ * xenapiDomainSetVcpusFlags
- *
- * Sets the VCPUs on the domain
- * Return 0 on success or -1 in case of error
- */
- static int
--xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
-+xenapiDomainSetVcpusFlags (virDomainPtr dom, unsigned int nvcpus,
-+ unsigned int flags)
- {
--
- /* vm.set_vcpus_max */
- xen_vm vm;
- xen_vm_set *vms;
- xen_session *session = ((struct _xenapiPrivate
*)(dom->conn->privateData))->session;
-+
-+ if (flags != VIR_DOMAIN_VCPU_LIVE) {
-+ xenapiError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-+ flags);
-+ return -1;
-+ }
-+
- if (xen_vm_get_by_name_label(session, &vms, dom->name) &&
vms->size > 0) {
- if (vms->size != 1) {
- xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
-@@ -1019,6 +1031,18 @@ xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
- }
-
- /*
-+ * xenapiDomainSetVcpus
-+ *
-+ * Sets the VCPUs on the domain
-+ * Return 0 on success or -1 in case of error
-+ */
-+static int
-+xenapiDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
-+{
-+ return xenapiDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+}
-+
-+/*
- * xenapiDomainPinVcpu
- *
- * Dynamically change the real CPUs which can be allocated to a virtual CPU
-@@ -1140,19 +1164,26 @@ xenapiDomainGetVcpus (virDomainPtr dom,
- }
-
- /*
-- * xenapiDomainGetMaxVcpus
-+ * xenapiDomainGetVcpusFlags
- *
- *
-- * Returns maximum number of Vcpus on success or -1 in case of error
-+ * Returns Vcpus count on success or -1 in case of error
- */
- static int
--xenapiDomainGetMaxVcpus (virDomainPtr dom)
-+xenapiDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
- {
- xen_vm vm;
- xen_vm_set *vms;
- int64_t maxvcpu = 0;
- enum xen_vm_power_state state;
- xen_session *session = ((struct _xenapiPrivate
*)(dom->conn->privateData))->session;
-+
-+ if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ xenapiError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-+ flags);
-+ return -1;
-+ }
-+
- if (xen_vm_get_by_name_label(session, &vms, dom->name) &&
vms->size > 0) {
- if (vms->size != 1) {
- xenapiSessionErrorHandler(dom->conn, VIR_ERR_INTERNAL_ERROR,
-@@ -1176,6 +1207,19 @@ xenapiDomainGetMaxVcpus (virDomainPtr dom)
- }
-
- /*
-+ * xenapiDomainGetMaxVcpus
-+ *
-+ *
-+ * Returns maximum number of Vcpus on success or -1 in case of error
-+ */
-+static int
-+xenapiDomainGetMaxVcpus (virDomainPtr dom)
-+{
-+ return xenapiDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_MAXIMUM));
-+}
-+
-+/*
- * xenapiDomainDumpXML
- *
- *
-@@ -1754,8 +1798,8 @@ static virDriver xenapiDriver = {
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
- xenapiDomainSetVcpus, /* domainSetVcpus */
-- NULL, /* domainSetVcpusFlags */
-- NULL, /* domainGetVcpusFlags */
-+ xenapiDomainSetVcpusFlags, /* domainSetVcpusFlags */
-+ xenapiDomainGetVcpusFlags, /* domainGetVcpusFlags */
- xenapiDomainPinVcpu, /* domainPinVcpu */
- xenapiDomainGetVcpus, /* domainGetVcpus */
- xenapiDomainGetMaxVcpus, /* domainGetMaxVcpus */
---
-1.7.2.3
-
diff --git a/docs/api_extension/0007-add-virsh-support.patch
b/docs/api_extension/0007-add-virsh-support.patch
deleted file mode 100644
index 8c5494e04d..0000000000
--- a/docs/api_extension/0007-add-virsh-support.patch
+++ /dev/null
@@ -1,388 +0,0 @@
-From bf945ee97b72d3b0c4fc2da04530f5294f529d66 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Wed, 29 Sep 2010 15:20:23 -0600
-Subject: [PATCH 08/15] vcpu: add virsh support
-
-* tools/virsh.c (cmdSetvcpus): Add new flags. Let invalid
-commands through to driver, to ease testing of hypervisor argument
-validation.
-(cmdMaxvcpus, cmdVcpucount): New commands.
-(commands): Add new commands.
-* tools/virsh.pod (setvcpus, vcpucount, maxvcpus): Document new
-behavior.
----
- tools/virsh.c | 247 ++++++++++++++++++++++++++++++++++++++++++++++++++-----
- tools/virsh.pod | 38 ++++++++-
- 2 files changed, 262 insertions(+), 23 deletions(-)
-
-diff --git a/tools/virsh.c b/tools/virsh.c
-index 4f8c495..7fb7fbd 100644
---- a/tools/virsh.c
-+++ b/tools/virsh.c
-@@ -2281,10 +2281,216 @@ cmdFreecell(vshControl *ctl, const vshCmd *cmd)
- }
-
- /*
-+ * "maxvcpus" command
-+ */
-+static const vshCmdInfo info_maxvcpus[] = {
-+ {"help", N_("connection vcpu maximum")},
-+ {"desc", N_("Show maximum number of virtual CPUs for guests on this
connection.")},
-+ {NULL, NULL}
-+};
-+
-+static const vshCmdOptDef opts_maxvcpus[] = {
-+ {"type", VSH_OT_STRING, 0, N_("domain type")},
-+ {NULL, 0, 0, NULL}
-+};
-+
-+static int
-+cmdMaxvcpus(vshControl *ctl, const vshCmd *cmd)
-+{
-+ char *type;
-+ int vcpus;
-+
-+ type = vshCommandOptString(cmd, "type", NULL);
-+
-+ if (!vshConnectionUsability(ctl, ctl->conn))
-+ return FALSE;
-+
-+ vcpus = virConnectGetMaxVcpus(ctl->conn, type);
-+ if (vcpus < 0)
-+ return FALSE;
-+ vshPrint(ctl, "%d\n", vcpus);
-+
-+ return TRUE;
-+}
-+
-+/*
-+ * "vcpucount" command
-+ */
-+static const vshCmdInfo info_vcpucount[] = {
-+ {"help", N_("domain vcpu counts")},
-+ {"desc", N_("Returns the number of virtual CPUs used by the
domain.")},
-+ {NULL, NULL}
-+};
-+
-+static const vshCmdOptDef opts_vcpucount[] = {
-+ {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
-+ {"maximum", VSH_OT_BOOL, 0, N_("get maximum cap on vcpus")},
-+ {"current", VSH_OT_BOOL, 0, N_("get current vcpu usage")},
-+ {"config", VSH_OT_BOOL, 0, N_("get value to be used on next
boot")},
-+ {"live", VSH_OT_BOOL, 0, N_("get value from running domain")},
-+ {NULL, 0, 0, NULL}
-+};
-+
-+static int
-+cmdVcpucount(vshControl *ctl, const vshCmd *cmd)
-+{
-+ virDomainPtr dom;
-+ int ret = TRUE;
-+ int maximum = vshCommandOptBool(cmd, "maximum");
-+ int current = vshCommandOptBool(cmd, "current");
-+ int config = vshCommandOptBool(cmd, "config");
-+ int live = vshCommandOptBool(cmd, "live");
-+ bool all = maximum + current + config + live == 0;
-+ int count;
-+
-+ if (maximum && current) {
-+ vshError(ctl, "%s",
-+ _("--maximum and --current cannot both be specified"));
-+ return FALSE;
-+ }
-+ if (config && live) {
-+ vshError(ctl, "%s",
-+ _("--config and --live cannot both be specified"));
-+ return FALSE;
-+ }
-+ /* We want one of each pair of mutually exclusive options; that
-+ * is, use of flags requires exactly two options. */
-+ if (maximum + current + config + live == 1) {
-+ vshError(ctl,
-+ _("when using --%s, either --%s or --%s must be specified"),
-+ (maximum ? "maximum" : current ? "current"
-+ : config ? "config" : "live"),
-+ maximum + current ? "config" : "maximum",
-+ maximum + current ? "live" : "current");
-+ return FALSE;
-+ }
-+
-+ if (!vshConnectionUsability(ctl, ctl->conn))
-+ return FALSE;
-+
-+ if (!(dom = vshCommandOptDomain(ctl, cmd, NULL)))
-+ return FALSE;
-+
-+ /* In all cases, try the new API first; if it fails because we are
-+ * talking to an older client, try a fallback API before giving
-+ * up. */
-+ if (all || (maximum && config)) {
-+ count = virDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_MAXIMUM |
-+ VIR_DOMAIN_VCPU_CONFIG));
-+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
-+ || last_error->code == VIR_ERR_INVALID_ARG)) {
-+ char *tmp;
-+ char *xml = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
-+ if (xml && (tmp = strstr(xml, "<vcpu"))) {
-+ tmp = strchr(tmp, '>');
-+ if (!tmp || virStrToLong_i(tmp + 1, &tmp, 10, &count) < 0)
-+ count = -1;
-+ }
-+ VIR_FREE(xml);
-+ }
-+
-+ if (count < 0) {
-+ virshReportError(ctl);
-+ ret = FALSE;
-+ } else if (all) {
-+ vshPrint(ctl, "%-12s %-12s %3d\n", _("maximum"),
_("config"),
-+ count);
-+ } else {
-+ vshPrint(ctl, "%d\n", count);
-+ }
-+ virFreeError(last_error);
-+ last_error = NULL;
-+ }
-+
-+ if (all || (maximum && live)) {
-+ count = virDomainGetVcpusFlags(dom, (VIR_DOMAIN_VCPU_MAXIMUM |
-+ VIR_DOMAIN_VCPU_LIVE));
-+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
-+ || last_error->code == VIR_ERR_INVALID_ARG)) {
-+ count = virDomainGetMaxVcpus(dom);
-+ }
-+
-+ if (count < 0) {
-+ virshReportError(ctl);
-+ ret = FALSE;
-+ } else if (all) {
-+ vshPrint(ctl, "%-12s %-12s %3d\n", _("maximum"),
_("live"),
-+ count);
-+ } else {
-+ vshPrint(ctl, "%d\n", count);
-+ }
-+ virFreeError(last_error);
-+ last_error = NULL;
-+ }
-+
-+ if (all || (current && config)) {
-+ count = virDomainGetVcpusFlags(dom, VIR_DOMAIN_VCPU_CONFIG);
-+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
-+ || last_error->code == VIR_ERR_INVALID_ARG)) {
-+ char *tmp, *end;
-+ char *xml = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE);
-+ if (xml && (tmp = strstr(xml, "<vcpu"))) {
-+ end = strchr(tmp, '>');
-+ if (end) {
-+ *end = '\0';
-+ tmp = strstr(tmp, "current=");
-+ if (!tmp)
-+ tmp = end + 1;
-+ else {
-+ tmp += strlen("current=");
-+ tmp += *tmp == '\'' || *tmp == '"';
-+ }
-+ }
-+ if (!tmp || virStrToLong_i(tmp, &tmp, 10, &count) < 0)
-+ count = -1;
-+ }
-+ VIR_FREE(xml);
-+ }
-+
-+ if (count < 0) {
-+ virshReportError(ctl);
-+ ret = FALSE;
-+ } else if (all) {
-+ vshPrint(ctl, "%-12s %-12s %3d\n", _("current"),
_("config"),
-+ count);
-+ } else {
-+ vshPrint(ctl, "%d\n", count);
-+ }
-+ virFreeError(last_error);
-+ last_error = NULL;
-+ }
-+
-+ if (all || (current && live)) {
-+ count = virDomainGetVcpusFlags(dom, VIR_DOMAIN_VCPU_LIVE);
-+ if (count < 0 && (last_error->code == VIR_ERR_NO_SUPPORT
-+ || last_error->code == VIR_ERR_INVALID_ARG)) {
-+ virDomainInfo info;
-+ if (virDomainGetInfo(dom, &info) == 0)
-+ count = info.nrVirtCpu;
-+ }
-+
-+ if (count < 0) {
-+ virshReportError(ctl);
-+ ret = FALSE;
-+ } else if (all) {
-+ vshPrint(ctl, "%-12s %-12s %3d\n", _("current"),
_("live"),
-+ count);
-+ } else {
-+ vshPrint(ctl, "%d\n", count);
-+ }
-+ virFreeError(last_error);
-+ last_error = NULL;
-+ }
-+
-+ virDomainFree(dom);
-+ return ret;
-+}
-+
-+/*
- * "vcpuinfo" command
- */
- static const vshCmdInfo info_vcpuinfo[] = {
-- {"help", N_("domain vcpu information")},
-+ {"help", N_("detailed domain vcpu information")},
- {"desc", N_("Returns basic information about the domain virtual
CPUs.")},
- {NULL, NULL}
- };
-@@ -2514,6 +2720,9 @@ static const vshCmdInfo info_setvcpus[] = {
- static const vshCmdOptDef opts_setvcpus[] = {
- {"domain", VSH_OT_DATA, VSH_OFLAG_REQ, N_("domain name, id or
uuid")},
- {"count", VSH_OT_DATA, VSH_OFLAG_REQ, N_("number of virtual
CPUs")},
-+ {"maximum", VSH_OT_BOOL, 0, N_("set maximum limit on next
boot")},
-+ {"config", VSH_OT_BOOL, 0, N_("affect next boot")},
-+ {"live", VSH_OT_BOOL, 0, N_("affect running domain")},
- {NULL, 0, 0, NULL}
- };
-
-@@ -2522,8 +2731,13 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd)
- {
- virDomainPtr dom;
- int count;
-- int maxcpu;
- int ret = TRUE;
-+ int maximum = vshCommandOptBool(cmd, "maximum");
-+ int config = vshCommandOptBool(cmd, "config");
-+ int live = vshCommandOptBool(cmd, "live");
-+ int flags = ((maximum ? VIR_DOMAIN_VCPU_MAXIMUM : 0) |
-+ (config ? VIR_DOMAIN_VCPU_CONFIG : 0) |
-+ (live ? VIR_DOMAIN_VCPU_LIVE : 0));
-
- if (!vshConnectionUsability(ctl, ctl->conn))
- return FALSE;
-@@ -2532,26 +2746,15 @@ cmdSetvcpus(vshControl *ctl, const vshCmd *cmd)
- return FALSE;
-
- count = vshCommandOptInt(cmd, "count", &count);
-- if (count <= 0) {
-- vshError(ctl, "%s", _("Invalid number of virtual CPUs."));
-- virDomainFree(dom);
-- return FALSE;
-- }
--
-- maxcpu = virDomainGetMaxVcpus(dom);
-- if (maxcpu <= 0) {
-- virDomainFree(dom);
-- return FALSE;
-- }
--
-- if (count > maxcpu) {
-- vshError(ctl, "%s", _("Too many virtual CPUs."));
-- virDomainFree(dom);
-- return FALSE;
-- }
-
-- if (virDomainSetVcpus(dom, count) != 0) {
-- ret = FALSE;
-+ if (!flags) {
-+ if (virDomainSetVcpus(dom, count) != 0) {
-+ ret = FALSE;
-+ }
-+ } else {
-+ if (virDomainSetVcpusFlags(dom, count, flags) < 0) {
-+ ret = FALSE;
-+ }
- }
-
- virDomainFree(dom);
-@@ -9642,6 +9845,7 @@ static const vshCmdDef commands[] = {
- {"freecell", cmdFreecell, opts_freecell, info_freecell},
- {"hostname", cmdHostname, NULL, info_hostname},
- {"list", cmdList, opts_list, info_list},
-+ {"maxvcpus", cmdMaxvcpus, opts_maxvcpus, info_maxvcpus},
- {"migrate", cmdMigrate, opts_migrate, info_migrate},
- {"migrate-setmaxdowntime", cmdMigrateSetMaxDowntime,
opts_migrate_setmaxdowntime, info_migrate_setmaxdowntime},
-
-@@ -9748,6 +9952,7 @@ static const vshCmdDef commands[] = {
- {"vol-name", cmdVolName, opts_vol_name, info_vol_name},
- {"vol-key", cmdVolKey, opts_vol_key, info_vol_key},
-
-+ {"vcpucount", cmdVcpucount, opts_vcpucount, info_vcpucount},
- {"vcpuinfo", cmdVcpuinfo, opts_vcpuinfo, info_vcpuinfo},
- {"vcpupin", cmdVcpupin, opts_vcpupin, info_vcpupin},
- {"version", cmdVersion, NULL, info_version},
-diff --git a/tools/virsh.pod b/tools/virsh.pod
-index 943a563..dbcc680 100644
---- a/tools/virsh.pod
-+++ b/tools/virsh.pod
-@@ -443,7 +443,14 @@ Remove the managed save file for a domain if it exists. The next
time the
- domain is started it will not restore to its previous state but instead will
- do a full boot.
-
--=item B<migrate> optional I<--live> I<--suspend> I<domain-id>
I<desturi> I<migrateuri>
-+=item B<maxvcpus> optional I<type>
-+
-+Provide the maximum number of virtual CPUs supported for a guest VM on
-+this connection. If provided, the I<type> parameter must be a valid
-+type attribute for the <domain> element of XML.
-+
-+=item B<migrate> optional I<--live> I<--suspend> I<domain-id>
I<desturi>
-+I<migrateuri>
-
- Migrate domain to another host. Add --live for live migration; --suspend
- leaves the domain paused on the destination host. The I<desturi> is the
-@@ -521,7 +528,8 @@ Displays the domain memory parameters.
-
- Allows you to set the domain memory parameters. LXC and QEMU/KVM supports these
parameters.
-
--=item B<setvcpus> I<domain-id> I<count>
-+=item B<setvcpus> I<domain-id> I<count> optional I<--maximum>
I<--config>
-+I<--live>
-
- Change the number of virtual CPUs active in the guest domain. Note that
- I<count> may be limited by host, hypervisor or limit coming from the
-@@ -530,6 +538,17 @@ original description of domain.
- For Xen, you can only adjust the virtual CPUs of a running domain if
- the domain is paravirtualized.
-
-+If I<--config> is specified, the change will only affect the next
-+boot of a domain. If I<--live> is specified, the domain must be
-+running, and the change takes place immediately. Both flags may be
-+specified, if supported by the hypervisor. If neither flag is given,
-+then I<--live> is implied and it is up to the hypervisor whether
-+I<--config> is also implied.
-+
-+If I<--maximum> is specified, then you must use I<--config> and
-+avoid I<--live>; this flag controls the maximum limit of vcpus that
-+can be hot-plugged the next time the domain is booted.
-+
- =item B<shutdown> I<domain-id>
-
- Gracefully shuts down a domain. This coordinates with the domain OS
-@@ -568,6 +587,21 @@ is not available the processes will provide an exit code of 1.
- Undefine the configuration for an inactive domain. Since it's not running
- the domain name or UUID must be used as the I<domain-id>.
-
-+=item B<vcpucount> I<domain-id> optional I<--maximum>
I<--current>
-+I<--config> I<--live>
-+
-+Print information about the virtual cpu counts of the given
-+I<domain-id>. If no flags are specified, all possible counts are
-+listed in a table; otherwise, the output is limited to just the
-+numeric value requested.
-+
-+I<--maximum> requests information on the maximum cap of vcpus that a
-+domain can add via B<setvcpus>, while I<--current> shows the current
-+usage; these two flags cannot both be specified. I<--config>
-+requests information regarding the next time the domain will be
-+booted, while I<--live> requires a running domain and lists current
-+values; these two flags cannot both be specified.
-+
- =item B<vcpuinfo> I<domain-id>
-
- Returns basic information about the domain virtual CPUs, like the number of
---
-1.7.2.3
-
diff --git a/docs/api_extension/0008-support-new-xml.patch
b/docs/api_extension/0008-support-new-xml.patch
deleted file mode 100644
index 276b339ca6..0000000000
--- a/docs/api_extension/0008-support-new-xml.patch
+++ /dev/null
@@ -1,519 +0,0 @@
-From 4617eedfaeee2b187a1f14691d25746ba3ff31b6 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Wed, 29 Sep 2010 10:20:07 -0600
-Subject: [PATCH 07/15] vcpu: support maxvcpu in domain_conf
-
-Although this patch adds a distinction between maximum vcpus and
-current vcpus in the XML, the values should be identical for all
-drivers at this point. Only in subsequent per-driver patches will
-a distinction be made.
-
-In general, virDomainGetInfo should prefer the current vcpus.
-
-* src/conf/domain_conf.h (_virDomainDef): Adjust vcpus to unsigned
-short, to match virDomainGetInfo limit. Add maxvcpus member.
-* src/conf/domain_conf.c (virDomainDefParseXML)
-(virDomainDefFormat): parse and print out vcpu details.
-* src/xen/xend_internal.c (xenDaemonParseSxpr)
-(xenDaemonFormatSxpr): Manage both vcpu numbers, and require them
-to be equal for now.
-* src/xen/xm_internal.c (xenXMDomainConfigParse)
-(xenXMDomainConfigFormat): Likewise.
-* src/phyp/phyp_driver.c (phypDomainDumpXML): Likewise.
-* src/openvz/openvz_conf.c (openvzLoadDomains): Likewise.
-* src/openvz/openvz_driver.c (openvzDomainDefineXML)
-(openvzDomainCreateXML, openvzDomainSetVcpusInternal): Likewise.
-* src/vbox/vbox_tmpl.c (vboxDomainDumpXML, vboxDomainDefineXML):
-Likewise.
-* src/xenapi/xenapi_driver.c (xenapiDomainDumpXML): Likewise.
-* src/xenapi/xenapi_utils.c (createVMRecordFromXml): Likewise.
-* src/esx/esx_vmx.c (esxVMX_ParseConfig, esxVMX_FormatConfig):
-Likewise.
-* src/qemu/qemu_conf.c (qemuBuildSmpArgStr)
-(qemuParseCommandLineSmp, qemuParseCommandLine): Likewise.
-* src/qemu/qemu_driver.c (qemudDomainHotplugVcpus): Likewise.
-* src/opennebula/one_conf.c (xmlOneTemplate): Likewise.
----
- src/conf/domain_conf.c | 45 +++++++++++++++++++++++++++++++++++++------
- src/conf/domain_conf.h | 3 +-
- src/esx/esx_vmx.c | 24 ++++++++++++++--------
- src/opennebula/one_conf.c | 9 +++++--
- src/openvz/openvz_conf.c | 7 +++--
- src/openvz/openvz_driver.c | 15 +++++++++----
- src/phyp/phyp_driver.c | 2 +-
- src/qemu/qemu_conf.c | 14 +++++++++++-
- src/qemu/qemu_driver.c | 5 ++-
- src/vbox/vbox_tmpl.c | 12 +++++++---
- src/xen/xend_internal.c | 9 ++++---
- src/xen/xm_internal.c | 11 ++++++---
- src/xenapi/xenapi_driver.c | 2 +-
- src/xenapi/xenapi_utils.c | 4 +-
- 14 files changed, 114 insertions(+), 48 deletions(-)
-
-diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
-index 78d7a6a..a997e06 100644
---- a/src/conf/domain_conf.c
-+++ b/src/conf/domain_conf.c
-@@ -4203,6 +4203,7 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
- int i, n;
- long id = -1;
- virDomainDefPtr def;
-+ unsigned long count;
-
- if (VIR_ALLOC(def) < 0) {
- virReportOOMError();
-@@ -4287,8 +4288,37 @@ static virDomainDefPtr virDomainDefParseXML(virCapsPtr caps,
- &def->mem.swap_hard_limit) < 0)
- def->mem.swap_hard_limit = 0;
-
-- if (virXPathULong("string(./vcpu[1])", ctxt, &def->vcpus) < 0)
-- def->vcpus = 1;
-+ n = virXPathULong("string(./vcpu[1])", ctxt, &count);
-+ if (n == -2) {
-+ virDomainReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("maximum vcpus must be an integer"));
-+ goto error;
-+ } else if (n < 0) {
-+ def->maxvcpus = 1;
-+ } else {
-+ def->maxvcpus = count;
-+ if (def->maxvcpus != count || count == 0) {
-+ virDomainReportError(VIR_ERR_XML_ERROR,
-+ _("invalid maxvcpus %lu"), count);
-+ goto error;
-+ }
-+ }
-+
-+ n = virXPathULong("string(./vcpu[1]/@current)", ctxt, &count);
-+ if (n == -2) {
-+ virDomainReportError(VIR_ERR_XML_ERROR, "%s",
-+ _("current vcpus must be an integer"));
-+ goto error;
-+ } else if (n < 0) {
-+ def->vcpus = def->maxvcpus;
-+ } else {
-+ def->vcpus = count;
-+ if (def->vcpus != count || count == 0 || def->maxvcpus < count) {
-+ virDomainReportError(VIR_ERR_XML_ERROR,
-+ _("invalid current vcpus %lu"), count);
-+ goto error;
-+ }
-+ }
-
- tmp = virXPathString("string(./vcpu[1]/@cpuset)", ctxt);
- if (tmp) {
-@@ -6462,17 +6492,18 @@ char *virDomainDefFormat(virDomainDefPtr def,
- if (def->cpumask[n] != 1)
- allones = 0;
-
-- if (allones) {
-- virBufferAsprintf(&buf, " <vcpu>%lu</vcpu>\n",
def->vcpus);
-- } else {
-+ virBufferAddLit(&buf, " <vcpu");
-+ if (!allones) {
- char *cpumask = NULL;
- if ((cpumask =
- virDomainCpuSetFormat(def->cpumask, def->cpumasklen)) == NULL)
- goto cleanup;
-- virBufferAsprintf(&buf, " <vcpu
cpuset='%s'>%lu</vcpu>\n",
-- cpumask, def->vcpus);
-+ virBufferAsprintf(&buf, " cpuset='%s'", cpumask);
- VIR_FREE(cpumask);
- }
-+ if (def->vcpus != def->maxvcpus)
-+ virBufferAsprintf(&buf, " current='%u'", def->vcpus);
-+ virBufferAsprintf(&buf, ">%u</vcpu>\n", def->maxvcpus);
-
- if (def->os.bootloader) {
- virBufferEscapeString(&buf, "
<bootloader>%s</bootloader>\n",
-diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
-index db09c23..5499f28 100644
---- a/src/conf/domain_conf.h
-+++ b/src/conf/domain_conf.h
-@@ -885,7 +885,8 @@ struct _virDomainDef {
- unsigned long min_guarantee;
- unsigned long swap_hard_limit;
- } mem;
-- unsigned long vcpus;
-+ unsigned short vcpus;
-+ unsigned short maxvcpus;
- int cpumasklen;
- char *cpumask;
-
-diff --git a/src/esx/esx_vmx.c b/src/esx/esx_vmx.c
-index 7ec8c0e..0a26614 100644
---- a/src/esx/esx_vmx.c
-+++ b/src/esx/esx_vmx.c
-@@ -50,7 +50,7 @@ def->uuid = <value> <=> uuid.bios =
"<value>"
- def->name = <value> <=> displayName =
"<value>"
- def->mem.max_balloon = <value kilobyte> <=> memsize =
"<value megabyte>" # must be a multiple of 4, defaults to 32
- def->mem.cur_balloon = <value kilobyte> <=> sched.mem.max =
"<value megabyte>" # defaults to "unlimited" ->
def->mem.cur_balloon = def->mem.max_balloon
--def->vcpus = <value> <=> numvcpus =
"<value>" # must be 1 or a multiple of 2, defaults to
1
-+def->maxvcpus = <value> <=> numvcpus =
"<value>" # must be 1 or a multiple of 2, defaults to
1
- def->cpumask = <uint list> <=> sched.cpu.affinity =
"<uint list>"
-
-
-@@ -1075,7 +1075,7 @@ esxVMX_ParseConfig(esxVMX_Context *ctx, virCapsPtr caps, const char
*vmx,
- goto cleanup;
- }
-
-- def->vcpus = numvcpus;
-+ def->maxvcpus = def->vcpus = numvcpus;
-
- /* vmx:sched.cpu.affinity -> def:cpumask */
- // VirtualMachine:config.cpuAffinity.affinitySet
-@@ -2609,16 +2609,22 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps,
virDomainDefPtr def,
- (int)(def->mem.cur_balloon / 1024));
- }
-
-- /* def:vcpus -> vmx:numvcpus */
-- if (def->vcpus <= 0 || (def->vcpus % 2 != 0 && def->vcpus != 1))
{
-+ /* def:maxvcpus -> vmx:numvcpus */
-+ if (def->vcpus != def->maxvcpus) {
-+ ESX_ERROR(VIR_ERR_CONFIG_UNSUPPORTED,
-+ _("No support for domain XML entry 'vcpu' attribute
"
-+ "'current'"));
-+ goto cleanup;
-+ }
-+ if (def->maxvcpus <= 0 || (def->maxvcpus % 2 != 0 &&
def->maxvcpus != 1)) {
- ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
- _("Expecting domain XML entry 'vcpu' to be an unsigned
"
- "integer (1 or a multiple of 2) but found %d"),
-- (int)def->vcpus);
-+ def->maxvcpus);
- goto cleanup;
- }
-
-- virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n",
(int)def->vcpus);
-+ virBufferAsprintf(&buffer, "numvcpus = \"%d\"\n",
def->maxvcpus);
-
- /* def:cpumask -> vmx:sched.cpu.affinity */
- if (def->cpumasklen > 0) {
-@@ -2632,11 +2638,11 @@ esxVMX_FormatConfig(esxVMX_Context *ctx, virCapsPtr caps,
virDomainDefPtr def,
- }
- }
-
-- if (sched_cpu_affinity_length < def->vcpus) {
-+ if (sched_cpu_affinity_length < def->maxvcpus) {
- ESX_ERROR(VIR_ERR_INTERNAL_ERROR,
- _("Expecting domain XML attribute 'cpuset' of entry
"
-- "'vcpu' to contains at least %d CPU(s)"),
-- (int)def->vcpus);
-+ "'vcpu' to contain at least %d CPU(s)"),
-+ def->maxvcpus);
- goto cleanup;
- }
-
-diff --git a/src/opennebula/one_conf.c b/src/opennebula/one_conf.c
-index 44e28dc..2079c51 100644
---- a/src/opennebula/one_conf.c
-+++ b/src/opennebula/one_conf.c
-@@ -1,5 +1,7 @@
- /*----------------------------------------------------------------------------------*/
--/* Copyright 2002-2009, Distributed Systems Architecture Group, Universidad
-+/*
-+ * Copyright (C) 2010 Red Hat, Inc.
-+ * Copyright 2002-2009, Distributed Systems Architecture Group, Universidad
- * Complutense de Madrid (
dsa-research.org)
- *
- * This library is free software; you can redistribute it and/or
-@@ -169,9 +171,10 @@ char* xmlOneTemplate(virDomainDefPtr def)
- {
- int i;
- virBuffer buf= VIR_BUFFER_INITIALIZER;
-- virBufferAsprintf(&buf,"#OpenNebula Template automatically generated by
libvirt\nNAME = %s\nCPU = %ld\nMEMORY = %ld\n",
-+ virBufferAsprintf(&buf,"#OpenNebula Template automatically generated
"
-+ "by libvirt\nNAME = %s\nCPU = %d\nMEMORY = %ld\n",
- def->name,
-- def->vcpus,
-+ def->maxvcpus,
- (def->mem.max_balloon)/1024);
-
- /*Optional Booting OpenNebula Information:*/
-diff --git a/src/openvz/openvz_conf.c b/src/openvz/openvz_conf.c
-index ec11bbc..c84a6f3 100644
---- a/src/openvz/openvz_conf.c
-+++ b/src/openvz/openvz_conf.c
-@@ -507,11 +507,12 @@ int openvzLoadDomains(struct openvz_driver *driver) {
- veid);
- goto cleanup;
- } else if (ret > 0) {
-- dom->def->vcpus = strtoI(temp);
-+ dom->def->maxvcpus = strtoI(temp);
- }
-
-- if (ret == 0 || dom->def->vcpus == 0)
-- dom->def->vcpus = openvzGetNodeCPUs();
-+ if (ret == 0 || dom->def->maxvcpus == 0)
-+ dom->def->maxvcpus = openvzGetNodeCPUs();
-+ dom->def->vcpus = dom->def->maxvcpus;
-
- /* XXX load rest of VM config data .... */
-
-diff --git a/src/openvz/openvz_driver.c b/src/openvz/openvz_driver.c
-index 0f3cfdf..b7c2754 100644
---- a/src/openvz/openvz_driver.c
-+++ b/src/openvz/openvz_driver.c
-@@ -925,8 +925,13 @@ openvzDomainDefineXML(virConnectPtr conn, const char *xml)
- if (openvzDomainSetNetworkConfig(conn, vm->def) < 0)
- goto cleanup;
-
-- if (vm->def->vcpus > 0) {
-- if (openvzDomainSetVcpusInternal(vm, vm->def->vcpus) < 0) {
-+ if (vm->def->vcpus != vm->def->maxvcpus) {
-+ openvzError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("current vcpu count must equal maximum"));
-+ goto cleanup;
-+ }
-+ if (vm->def->maxvcpus > 0) {
-+ if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
- openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Could not set number of virtual cpu"));
- goto cleanup;
-@@ -1019,8 +1024,8 @@ openvzDomainCreateXML(virConnectPtr conn, const char *xml,
- vm->def->id = vm->pid;
- vm->state = VIR_DOMAIN_RUNNING;
-
-- if (vm->def->vcpus > 0) {
-- if (openvzDomainSetVcpusInternal(vm, vm->def->vcpus) < 0) {
-+ if (vm->def->maxvcpus > 0) {
-+ if (openvzDomainSetVcpusInternal(vm, vm->def->maxvcpus) < 0) {
- openvzError(VIR_ERR_INTERNAL_ERROR, "%s",
- _("Could not set number of virtual cpu"));
- goto cleanup;
-@@ -1249,7 +1254,7 @@ static int openvzDomainSetVcpusInternal(virDomainObjPtr vm,
- return -1;
- }
-
-- vm->def->vcpus = nvcpus;
-+ vm->def->maxvcpus = vm->def->vcpus = nvcpus;
- return 0;
- }
-
-diff --git a/src/phyp/phyp_driver.c b/src/phyp/phyp_driver.c
-index e284ae0..3d0ed11 100644
---- a/src/phyp/phyp_driver.c
-+++ b/src/phyp/phyp_driver.c
-@@ -3540,7 +3540,7 @@ phypDomainDumpXML(virDomainPtr dom, int flags)
- goto err;
- }
-
-- if ((def.vcpus =
-+ if ((def.maxvcpus = def.vcpus =
- phypGetLparCPU(dom->conn, managed_system, dom->id)) == 0) {
- VIR_ERROR0(_("Unable to determine domain's CPU."));
- goto err;
-diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
-index 83c0f83..38c8351 100644
---- a/src/qemu/qemu_conf.c
-+++ b/src/qemu/qemu_conf.c
-@@ -3711,7 +3711,7 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
- {
- virBuffer buf = VIR_BUFFER_INITIALIZER;
-
-- virBufferAsprintf(&buf, "%lu", def->vcpus);
-+ virBufferAsprintf(&buf, "%u", def->vcpus);
-
- if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) {
- /* sockets, cores, and threads are either all zero
-@@ -3722,11 +3722,18 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
- virBufferAsprintf(&buf, ",threads=%u",
def->cpu->threads);
- }
- else {
-- virBufferAsprintf(&buf, ",sockets=%lu", def->vcpus);
-+ virBufferAsprintf(&buf, ",sockets=%u", def->maxvcpus);
- virBufferAsprintf(&buf, ",cores=%u", 1);
- virBufferAsprintf(&buf, ",threads=%u", 1);
- }
- }
-+ if (def->vcpus != def->maxvcpus) {
-+ virBufferFreeAndReset(&buf);
-+ qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("setting current vcpu count less than maximum is "
-+ "not supported yet"));
-+ return NULL;
-+ }
-
- if (virBufferError(&buf)) {
- virBufferFreeAndReset(&buf);
-@@ -6178,6 +6185,8 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
- }
- }
-
-+ dom->maxvcpus = dom->vcpus;
-+
- if (sockets && cores && threads) {
- virCPUDefPtr cpu;
-
-@@ -6247,6 +6256,7 @@ virDomainDefPtr qemuParseCommandLine(virCapsPtr caps,
-
- def->id = -1;
- def->mem.cur_balloon = def->mem.max_balloon = 64 * 1024;
-+ def->maxvcpus = 1;
- def->vcpus = 1;
- def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_UTC;
- def->features = (1 << VIR_DOMAIN_FEATURE_ACPI)
-diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
-index 7a2ea8f..c66dc04 100644
---- a/src/qemu/qemu_driver.c
-+++ b/src/qemu/qemu_driver.c
-@@ -2425,8 +2425,9 @@ qemuDetectVcpuPIDs(struct qemud_driver *driver,
-
- if (ncpupids != vm->def->vcpus) {
- qemuReportError(VIR_ERR_INTERNAL_ERROR,
-- _("got wrong number of vCPU pids from QEMU monitor. got %d,
wanted %d"),
-- ncpupids, (int)vm->def->vcpus);
-+ _("got wrong number of vCPU pids from QEMU monitor. "
-+ "got %d, wanted %d"),
-+ ncpupids, vm->def->vcpus);
- VIR_FREE(cpupids);
- return -1;
- }
-diff --git a/src/vbox/vbox_tmpl.c b/src/vbox/vbox_tmpl.c
-index 0cbe8b3..5a859a4 100644
---- a/src/vbox/vbox_tmpl.c
-+++ b/src/vbox/vbox_tmpl.c
-@@ -2028,7 +2028,7 @@ static char *vboxDomainDumpXML(virDomainPtr dom, int flags) {
- def->mem.max_balloon = memorySize * 1024;
-
- machine->vtbl->GetCPUCount(machine, &CPUCount);
-- def->vcpus = CPUCount;
-+ def->maxvcpus = def->vcpus = CPUCount;
-
- /* Skip cpumasklen, cpumask, onReboot, onPoweroff, onCrash */
-
-@@ -4598,11 +4598,15 @@ static virDomainPtr vboxDomainDefineXML(virConnectPtr conn, const
char *xml) {
- def->mem.cur_balloon, (unsigned)rc);
- }
-
-- rc = machine->vtbl->SetCPUCount(machine, def->vcpus);
-+ if (def->vcpus != def->maxvcpus) {
-+ vboxError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-+ _("current vcpu count must equal maximum"));
-+ }
-+ rc = machine->vtbl->SetCPUCount(machine, def->maxvcpus);
- if (NS_FAILED(rc)) {
- vboxError(VIR_ERR_INTERNAL_ERROR,
-- _("could not set the number of virtual CPUs to: %lu,
rc=%08x"),
-- def->vcpus, (unsigned)rc);
-+ _("could not set the number of virtual CPUs to: %u,
rc=%08x"),
-+ def->maxvcpus, (unsigned)rc);
- }
-
- #if VBOX_API_VERSION < 3001
-diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
-index 5ffc3c8..456b477 100644
---- a/src/xen/xend_internal.c
-+++ b/src/xen/xend_internal.c
-@@ -2190,7 +2190,8 @@ xenDaemonParseSxpr(virConnectPtr conn,
- }
- }
-
-- def->vcpus = sexpr_int(root, "domain/vcpus");
-+ def->maxvcpus = sexpr_int(root, "domain/vcpus");
-+ def->vcpus = def->maxvcpus;
-
- tmp = sexpr_node(root, "domain/on_poweroff");
- if (tmp != NULL) {
-@@ -5649,7 +5650,7 @@ xenDaemonFormatSxprInput(virDomainInputDefPtr input,
- *
- * Generate an SEXPR representing the domain configuration.
- *
-- * Returns the 0 terminatedi S-Expr string or NULL in case of error.
-+ * Returns the 0 terminated S-Expr string or NULL in case of error.
- * the caller must free() the returned value.
- */
- char *
-@@ -5666,7 +5667,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
- virBufferAsprintf(&buf, "(name '%s')", def->name);
- virBufferAsprintf(&buf, "(memory %lu)(maxmem %lu)",
- def->mem.cur_balloon/1024, def->mem.max_balloon/1024);
-- virBufferAsprintf(&buf, "(vcpus %lu)", def->vcpus);
-+ virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
-
- if (def->cpumask) {
- char *ranges = virDomainCpuSetFormat(def->cpumask, def->cpumasklen);
-@@ -5761,7 +5762,7 @@ xenDaemonFormatSxpr(virConnectPtr conn,
- else
- virBufferAsprintf(&buf, "(kernel '%s')",
def->os.loader);
-
-- virBufferAsprintf(&buf, "(vcpus %lu)", def->vcpus);
-+ virBufferAsprintf(&buf, "(vcpus %u)", def->maxvcpus);
-
- 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 8e42a1c..bf20a64 100644
---- a/src/xen/xm_internal.c
-+++ b/src/xen/xm_internal.c
-@@ -678,6 +678,7 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
- int i;
- const char *defaultArch, *defaultMachine;
- int vmlocaltime = 0;
-+ unsigned long count;
-
- if (VIR_ALLOC(def) < 0) {
- virReportOOMError();
-@@ -770,9 +771,11 @@ xenXMDomainConfigParse(virConnectPtr conn, virConfPtr conf) {
- def->mem.cur_balloon *= 1024;
- def->mem.max_balloon *= 1024;
-
--
-- if (xenXMConfigGetULong(conf, "vcpus", &def->vcpus, 1) < 0)
-+ if (xenXMConfigGetULong(conf, "vcpus", &count, 1) < 0 ||
-+ (unsigned short) count != count)
- goto cleanup;
-+ def->maxvcpus = count;
-+ def->vcpus = def->maxvcpus;
-
- if (xenXMConfigGetString(conf, "cpus", &str, NULL) < 0)
- goto cleanup;
-@@ -1650,7 +1653,7 @@ int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) {
- if (!(entry = virHashLookup(priv->configCache, filename)))
- goto cleanup;
-
-- entry->def->vcpus = vcpus;
-+ entry->def->maxvcpus = entry->def->vcpus = vcpus;
-
- /* If this fails, should we try to undo our changes to the
- * in-memory representation of the config file. I say not!
-@@ -2241,7 +2244,7 @@ virConfPtr xenXMDomainConfigFormat(virConnectPtr conn,
- if (xenXMConfigSetInt(conf, "memory", def->mem.cur_balloon / 1024) <
0)
- goto no_memory;
-
-- if (xenXMConfigSetInt(conf, "vcpus", def->vcpus) < 0)
-+ if (xenXMConfigSetInt(conf, "vcpus", def->maxvcpus) < 0)
- goto no_memory;
-
- if ((def->cpumask != NULL) &&
-diff --git a/src/xenapi/xenapi_driver.c b/src/xenapi/xenapi_driver.c
-index 7d4ab8d..5ccdede 100644
---- a/src/xenapi/xenapi_driver.c
-+++ b/src/xenapi/xenapi_driver.c
-@@ -1335,7 +1335,7 @@ xenapiDomainDumpXML (virDomainPtr dom, int flags ATTRIBUTE_UNUSED)
- } else {
- defPtr->mem.cur_balloon = memory;
- }
-- defPtr->vcpus = xenapiDomainGetMaxVcpus(dom);
-+ defPtr->maxvcpus = defPtr->vcpus = xenapiDomainGetMaxVcpus(dom);
- enum xen_on_normal_exit action;
- if (xen_vm_get_actions_after_shutdown(session, &action, vm)) {
- defPtr->onPoweroff = xenapiNormalExitEnum2virDomainLifecycle(action);
-diff --git a/src/xenapi/xenapi_utils.c b/src/xenapi/xenapi_utils.c
-index be55491..a7e2a4b 100644
---- a/src/xenapi/xenapi_utils.c
-+++ b/src/xenapi/xenapi_utils.c
-@@ -510,8 +510,8 @@ createVMRecordFromXml (virConnectPtr conn, virDomainDefPtr def,
- else
- (*record)->memory_dynamic_max = (*record)->memory_static_max;
-
-- if (def->vcpus) {
-- (*record)->vcpus_max = (int64_t) def->vcpus;
-+ if (def->maxvcpus) {
-+ (*record)->vcpus_max = (int64_t) def->maxvcpus;
- (*record)->vcpus_at_startup = (int64_t) def->vcpus;
- }
- if (def->onPoweroff)
---
-1.7.2.3
-
diff --git a/docs/api_extension/0009-support-all-flags-in-test-driver.patch
b/docs/api_extension/0009-support-all-flags-in-test-driver.patch
deleted file mode 100644
index 1aa3984502..0000000000
--- a/docs/api_extension/0009-support-all-flags-in-test-driver.patch
+++ /dev/null
@@ -1,197 +0,0 @@
-From 6c9e6b956453d0f0c4ff542ef8a184d663a39266 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Mon, 4 Oct 2010 17:01:12 -0600
-Subject: [PATCH 09/15] vcpu: support all flags in test driver
-
-* src/test/test_driver.c (testDomainGetVcpusFlags)
-(testDomainSetVcpusFlags): Support all flags.
-(testDomainUpdateVCPUs): Update cpu count here.
----
- src/test/test_driver.c | 128 ++++++++++++++++++++++++++++++++++++++++-------
- 1 files changed, 109 insertions(+), 19 deletions(-)
-
-diff --git a/src/test/test_driver.c b/src/test/test_driver.c
-index b70c80d..a9d3d89 100644
---- a/src/test/test_driver.c
-+++ b/src/test/test_driver.c
-@@ -450,6 +450,7 @@ testDomainUpdateVCPUs(virConnectPtr conn,
- goto cleanup;
- }
-
-+ dom->def->vcpus = nvcpus;
- ret = 0;
- cleanup:
- return ret;
-@@ -2032,12 +2033,51 @@ cleanup:
- static int
- testDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
- {
-- if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-- testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ testConnPtr privconn = domain->conn->privateData;
-+ virDomainObjPtr vm;
-+ virDomainDefPtr def;
-+ int ret = -1;
-+
-+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_CONFIG |
-+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
-+
-+ /* Exactly one of LIVE or CONFIG must be set. */
-+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
-+ testError(VIR_ERR_INVALID_ARG,
-+ _("invalid flag combination: (0x%x)"), flags);
- return -1;
- }
-
-- return testGetMaxVCPUs(domain->conn, "test");
-+ testDriverLock(privconn);
-+ vm = virDomainFindByUUID(&privconn->domains, domain->uuid);
-+ testDriverUnlock(privconn);
-+
-+ if (!vm) {
-+ char uuidstr[VIR_UUID_STRING_BUFLEN];
-+ virUUIDFormat(domain->uuid, uuidstr);
-+ testError(VIR_ERR_NO_DOMAIN,
-+ _("no domain with matching uuid '%s'"), uuidstr);
-+ goto cleanup;
-+ }
-+
-+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
-+ if (!virDomainObjIsActive(vm)) {
-+ testError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("domain not active"));
-+ goto cleanup;
-+ }
-+ def = vm->def;
-+ } else {
-+ def = vm->newDef ? vm->newDef : vm->def;
-+ }
-+
-+ ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
-+
-+cleanup:
-+ if (vm)
-+ virDomainObjUnlock(vm);
-+ return ret;
- }
-
- static int
-@@ -2053,21 +2093,30 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int
nrCpus,
- {
- testConnPtr privconn = domain->conn->privateData;
- virDomainObjPtr privdom = NULL;
-+ virDomainDefPtr def;
- int ret = -1, maxvcpus;
-
-- if (flags != VIR_DOMAIN_VCPU_LIVE) {
-- testError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
flags);
-+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_CONFIG |
-+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
-+
-+ /* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
-+ * mixed with LIVE. */
-+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
-+ (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
-+ (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
-+ testError(VIR_ERR_INVALID_ARG,
-+ _("invalid flag combination: (0x%x)"), flags);
-+ return -1;
-+ }
-+ if (!nrCpus || (maxvcpus = testGetMaxVCPUs(domain->conn, NULL)) < nrCpus) {
-+ testError(VIR_ERR_INVALID_ARG,
-+ _("argument out of range: %d"), nrCpus);
- return -1;
- }
--
-- /* Do this first before locking */
-- maxvcpus = testDomainGetMaxVcpus(domain);
-- if (maxvcpus < 0)
-- goto cleanup;
-
- testDriverLock(privconn);
-- privdom = virDomainFindByName(&privconn->domains,
-- domain->name);
-+ privdom = virDomainFindByUUID(&privconn->domains, domain->uuid);
- testDriverUnlock(privconn);
-
- if (privdom == NULL) {
-@@ -2075,13 +2124,17 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int
nrCpus,
- goto cleanup;
- }
-
-- if (!virDomainObjIsActive(privdom)) {
-+ if (!virDomainObjIsActive(privdom) && (flags & VIR_DOMAIN_VCPU_LIVE)) {
- testError(VIR_ERR_OPERATION_INVALID,
- "%s", _("cannot hotplug vcpus for an inactive
domain"));
- goto cleanup;
- }
-
-- /* We allow more cpus in guest than host */
-+ /* We allow more cpus in guest than host, but not more than the
-+ * domain's starting limit. */
-+ if ((flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
-+ VIR_DOMAIN_VCPU_LIVE && privdom->def->maxvcpus < maxvcpus)
-+ maxvcpus = privdom->def->maxvcpus;
- if (nrCpus > maxvcpus) {
- testError(VIR_ERR_INVALID_ARG,
- "requested cpu amount exceeds maximum (%d > %d)",
-@@ -2089,12 +2142,49 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int
nrCpus,
- goto cleanup;
- }
-
-- /* Update VCPU state for the running domain */
-- if (testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0) < 0)
-- goto cleanup;
-+ switch (flags) {
-+ case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
-+ def = privdom->def;
-+ if (virDomainObjIsActive(privdom)) {
-+ if (privdom->newDef)
-+ def = privdom->newDef;
-+ else {
-+ testError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("no persistent state"));
-+ goto cleanup;
-+ }
-+ }
-+ def->maxvcpus = nrCpus;
-+ if (nrCpus < def->vcpus)
-+ def->vcpus = nrCpus;
-+ ret = 0;
-+ break;
-
-- privdom->def->vcpus = nrCpus;
-- ret = 0;
-+ case VIR_DOMAIN_VCPU_CONFIG:
-+ def = privdom->def;
-+ if (virDomainObjIsActive(privdom)) {
-+ if (privdom->newDef)
-+ def = privdom->newDef;
-+ else {
-+ testError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("no persistent state"));
-+ goto cleanup;
-+ }
-+ }
-+ def->vcpus = nrCpus;
-+ ret = 0;
-+ break;
-+
-+ case VIR_DOMAIN_VCPU_LIVE:
-+ ret = testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0);
-+ break;
-+
-+ case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
-+ ret = testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0);
-+ if (ret == 0 && privdom->newDef)
-+ privdom->newDef->vcpus = nrCpus;
-+ break;
-+ }
-
- cleanup:
- if (privdom)
---
-1.7.2.3
-
diff --git a/docs/api_extension/0010-improve-vcpu-support-in-qemu-command-line.patch
b/docs/api_extension/0010-improve-vcpu-support-in-qemu-command-line.patch
deleted file mode 100644
index 02320bb9f5..0000000000
--- a/docs/api_extension/0010-improve-vcpu-support-in-qemu-command-line.patch
+++ /dev/null
@@ -1,122 +0,0 @@
-From d67c189e80e6aef7adf13e5763365555cfc1a02a Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Wed, 29 Sep 2010 15:58:47 -0600
-Subject: [PATCH 10/15] vcpu: improve vcpu support in qemu command line
-
-* src/qemu/qemu_conf.c (qemuParseCommandLineSmp): Distinguish
-between vcpus and maxvcpus, for new enough qemu.
-* tests/qemuargv2xmltest.c (mymain): Add new test.
-* tests/qemuxml2argvtest.c (mymain): Likewise.
-* tests/qemuxml2xmltest.c (mymain): Likewise.
-* tests/qemuxml2argvdata/qemuxml2argv-smp.args: New file.
----
- src/qemu/qemu_conf.c | 13 +++++++++----
- tests/qemuargv2xmltest.c | 2 ++
- tests/qemuxml2argvdata/qemuxml2argv-smp.args | 1 +
- tests/qemuxml2argvtest.c | 2 ++
- tests/qemuxml2xmltest.c | 2 ++
- 5 files changed, 16 insertions(+), 4 deletions(-)
- create mode 100644 tests/qemuxml2argvdata/qemuxml2argv-smp.args
-
-diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
-index 38c8351..ffe184b 100644
---- a/src/qemu/qemu_conf.c
-+++ b/src/qemu/qemu_conf.c
-@@ -3714,6 +3714,8 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
- virBufferAsprintf(&buf, "%u", def->vcpus);
-
- if ((qemuCmdFlags & QEMUD_CMD_FLAG_SMP_TOPOLOGY)) {
-+ if (def->vcpus != def->maxvcpus)
-+ virBufferAsprintf(&buf, ",maxcpus=%u", def->maxvcpus);
- /* sockets, cores, and threads are either all zero
- * or all non-zero, thus checking one of them is enough */
- if (def->cpu && def->cpu->sockets) {
-@@ -3726,12 +3728,12 @@ qemuBuildSmpArgStr(const virDomainDefPtr def,
- virBufferAsprintf(&buf, ",cores=%u", 1);
- virBufferAsprintf(&buf, ",threads=%u", 1);
- }
-- }
-- if (def->vcpus != def->maxvcpus) {
-+ } else if (def->vcpus != def->maxvcpus) {
- virBufferFreeAndReset(&buf);
-+ /* FIXME - consider hot-unplugging cpus after boot for older qemu */
- qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("setting current vcpu count less than maximum is "
-- "not supported yet"));
-+ "not supported with this QEMU binary"));
- return NULL;
- }
-
-@@ -6153,6 +6155,7 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
- unsigned int sockets = 0;
- unsigned int cores = 0;
- unsigned int threads = 0;
-+ unsigned int maxcpus = 0;
- int i;
- int nkws;
- char **kws;
-@@ -6180,12 +6183,14 @@ qemuParseCommandLineSmp(virDomainDefPtr dom,
- cores = n;
- else if (STREQ(kws[i], "threads"))
- threads = n;
-+ else if (STREQ(kws[i], "maxcpus"))
-+ maxcpus = n;
- else
- goto syntax;
- }
- }
-
-- dom->maxvcpus = dom->vcpus;
-+ dom->maxvcpus = maxcpus ? maxcpus : dom->vcpus;
-
- if (sockets && cores && threads) {
- virCPUDefPtr cpu;
-diff --git a/tests/qemuargv2xmltest.c b/tests/qemuargv2xmltest.c
-index 4f9ec84..d941b0b 100644
---- a/tests/qemuargv2xmltest.c
-+++ b/tests/qemuargv2xmltest.c
-@@ -221,6 +221,8 @@ mymain(int argc, char **argv)
-
- DO_TEST("hostdev-pci-address");
-
-+ DO_TEST("smp");
-+
- DO_TEST_FULL("restore-v1", 0, "stdio");
- DO_TEST_FULL("restore-v2", 0, "stdio");
- DO_TEST_FULL("restore-v2", 0, "exec:cat");
-diff --git a/tests/qemuxml2argvdata/qemuxml2argv-smp.args
b/tests/qemuxml2argvdata/qemuxml2argv-smp.args
-new file mode 100644
-index 0000000..3ec8f15
---- /dev/null
-+++ b/tests/qemuxml2argvdata/qemuxml2argv-smp.args
-@@ -0,0 +1 @@
-+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test /usr/bin/qemu -S -M pc -m 214
-smp 1,maxcpus=2,sockets=2,cores=1,threads=1 -nographic -monitor
unix:/tmp/test-monitor,server,nowait -no-acpi -boot c -hda /dev/HostVG/QEMUGuest1 -net
none -serial none -parallel none -usb
-diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
-index 92d5b18..551d6c4 100644
---- a/tests/qemuxml2argvtest.c
-+++ b/tests/qemuxml2argvtest.c
-@@ -385,6 +385,8 @@ mymain(int argc, char **argv)
-
- DO_TEST("qemu-ns", 0);
-
-+ DO_TEST("smp", QEMUD_CMD_FLAG_SMP_TOPOLOGY);
-+
- free(driver.stateDir);
- virCapabilitiesFree(driver.caps);
-
-diff --git a/tests/qemuxml2xmltest.c b/tests/qemuxml2xmltest.c
-index a33d435..cdc4390 100644
---- a/tests/qemuxml2xmltest.c
-+++ b/tests/qemuxml2xmltest.c
-@@ -180,6 +180,8 @@ mymain(int argc, char **argv)
- DO_TEST("encrypted-disk");
- DO_TEST("memtune");
-
-+ DO_TEST("smp");
-+
- /* These tests generate different XML */
- DO_TEST_DIFFERENT("balloon-device-auto");
- DO_TEST_DIFFERENT("channel-virtio-auto");
---
-1.7.2.3
-
diff --git a/docs/api_extension/0011-complete-vcpu-support-in-qemu-driver.patch
b/docs/api_extension/0011-complete-vcpu-support-in-qemu-driver.patch
deleted file mode 100644
index 251008fd01..0000000000
--- a/docs/api_extension/0011-complete-vcpu-support-in-qemu-driver.patch
+++ /dev/null
@@ -1,169 +0,0 @@
-From 28a3605906385cba43df77051dc26e865f237b09 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Wed, 29 Sep 2010 17:40:45 -0600
-Subject: [PATCH 11/15] vcpu: complete vcpu support in qemu driver
-
-* src/qemu/qemu_driver.c (qemudDomainSetVcpusFlags)
-(qemudDomainGetVcpusFlags): Support all feasible flag
-combinations.
----
- src/qemu/qemu_driver.c | 100 ++++++++++++++++++++++++++++++++++++++++-------
- 1 files changed, 85 insertions(+), 15 deletions(-)
-
-diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
-index c66dc04..a9e057f 100644
---- a/src/qemu/qemu_driver.c
-+++ b/src/qemu/qemu_driver.c
-@@ -5941,13 +5941,27 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
- {
- struct qemud_driver *driver = dom->conn->privateData;
- virDomainObjPtr vm;
-+ virDomainDefPtr def;
- const char * type;
- int max;
- int ret = -1;
-
-- if (flags != VIR_DOMAIN_VCPU_LIVE) {
-- qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-- flags);
-+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_CONFIG |
-+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
-+
-+ /* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
-+ * mixed with LIVE. */
-+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
-+ (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
-+ (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
-+ qemuReportError(VIR_ERR_INVALID_ARG,
-+ _("invalid flag combination: (0x%x)"), flags);
-+ return -1;
-+ }
-+ if (!nvcpus || (unsigned short) nvcpus != nvcpus) {
-+ qemuReportError(VIR_ERR_INVALID_ARG,
-+ _("argument out of range: %d"), nvcpus);
- return -1;
- }
-
-@@ -5966,7 +5980,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
- if (qemuDomainObjBeginJob(vm) < 0)
- goto cleanup;
-
-- if (!virDomainObjIsActive(vm)) {
-+ if (!virDomainObjIsActive(vm) && (flags & VIR_DOMAIN_VCPU_LIVE)) {
- qemuReportError(VIR_ERR_OPERATION_INVALID,
- "%s", _("domain is not running"));
- goto endjob;
-@@ -5985,6 +5999,11 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
- goto endjob;
- }
-
-+ if ((flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
-+ VIR_DOMAIN_VCPU_LIVE && vm->def->maxvcpus < max) {
-+ max = vm->def->maxvcpus;
-+ }
-+
- if (nvcpus > max) {
- qemuReportError(VIR_ERR_INVALID_ARG,
- _("requested vcpus is greater than max allowable"
-@@ -5992,7 +6011,49 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
- goto endjob;
- }
-
-- ret = qemudDomainHotplugVcpus(vm, nvcpus);
-+ switch (flags) {
-+ case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
-+ def = vm->def;
-+ if (virDomainObjIsActive(vm)) {
-+ if (vm->newDef)
-+ def = vm->newDef;
-+ else{
-+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("no persistent state"));
-+ goto endjob;
-+ }
-+ }
-+ def->maxvcpus = nvcpus;
-+ if (nvcpus < vm->newDef->vcpus)
-+ def->vcpus = nvcpus;
-+ ret = 0;
-+ break;
-+
-+ case VIR_DOMAIN_VCPU_CONFIG:
-+ def = vm->def;
-+ if (virDomainObjIsActive(vm)) {
-+ if (vm->newDef)
-+ def = vm->newDef;
-+ else {
-+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("no persistent state"));
-+ goto endjob;
-+ }
-+ }
-+ def->vcpus = nvcpus;
-+ ret = 0;
-+ break;
-+
-+ case VIR_DOMAIN_VCPU_LIVE:
-+ ret = qemudDomainHotplugVcpus(vm, nvcpus);
-+ break;
-+
-+ case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
-+ ret = qemudDomainHotplugVcpus(vm, nvcpus);
-+ if (ret == 0 && vm->newDef)
-+ vm->newDef->vcpus = nvcpus;
-+ break;
-+ }
-
- endjob:
- if (qemuDomainObjEndJob(vm) == 0)
-@@ -6171,12 +6232,17 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
- {
- struct qemud_driver *driver = dom->conn->privateData;
- virDomainObjPtr vm;
-- const char *type;
-+ virDomainDefPtr def;
- int ret = -1;
-
-- if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-- qemuReportError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-- flags);
-+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_CONFIG |
-+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
-+
-+ /* Exactly one of LIVE or CONFIG must be set. */
-+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
-+ qemuReportError(VIR_ERR_INVALID_ARG,
-+ _("invalid flag combination: (0x%x)"), flags);
- return -1;
- }
-
-@@ -6192,14 +6258,18 @@ qemudDomainGetVcpusFlags(virDomainPtr dom, unsigned int flags)
- goto cleanup;
- }
-
-- if (!(type = virDomainVirtTypeToString(vm->def->virtType))) {
-- qemuReportError(VIR_ERR_INTERNAL_ERROR,
-- _("unknown virt type in domain definition
'%d'"),
-- vm->def->virtType);
-- goto cleanup;
-+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
-+ if (!virDomainObjIsActive(vm)) {
-+ qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("domain not active"));
-+ goto cleanup;
-+ }
-+ def = vm->def;
-+ } else {
-+ def = vm->newDef ? vm->newDef : vm->def;
- }
-
-- ret = qemudGetMaxVCPUs(NULL, type);
-+ ret = (flags & VIR_DOMAIN_VCPU_MAXIMUM) ? def->maxvcpus : def->vcpus;
-
- cleanup:
- if (vm)
---
-1.7.2.3
-
diff --git a/docs/api_extension/0012-improve-vcpu-support-in-xen-command-line.patch
b/docs/api_extension/0012-improve-vcpu-support-in-xen-command-line.patch
deleted file mode 100644
index 0a7b2fccff..0000000000
--- a/docs/api_extension/0012-improve-vcpu-support-in-xen-command-line.patch
+++ /dev/null
@@ -1,294 +0,0 @@
-From 0fab10e5ed971ab4f960a53e9640b0672f4b8ac3 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)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...
')))(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...
</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...
')))(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
-
diff --git a/docs/api_extension/0013-improve-getting-xen-vcpu-counts.patch
b/docs/api_extension/0013-improve-getting-xen-vcpu-counts.patch
deleted file mode 100644
index c1aad03607..0000000000
--- a/docs/api_extension/0013-improve-getting-xen-vcpu-counts.patch
+++ /dev/null
@@ -1,216 +0,0 @@
-From 290ea33111be7bdf1f1381b90de33eb0e67c1a15 Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Wed, 6 Oct 2010 17:54:41 -0600
-Subject: [PATCH 13/15] vcpu: improve support for getting xen vcpu counts
-
-* src/xen/xen_driver.c (xenUnifiedDomainGetVcpusFlags): Support
-more flags.
-* src/xen/xend_internal.h (xenDaemonDomainGetVcpusFlags): New
-prototype.
-* src/xen/xm_internal.h (xenXMDomainGetVcpusFlags): Likewise.
-* src/xen/xend_internal.c (virDomainGetVcpusFlags): New function.
-* src/xen/xm_internal.c (xenXMDomainGetVcpusFlags): Likewise.
----
- src/xen/xen_driver.c | 31 +++++++++++++++++++--------
- src/xen/xend_internal.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++
- src/xen/xend_internal.h | 2 +
- src/xen/xm_internal.c | 47 ++++++++++++++++++++++++++++++++++++++++++
- src/xen/xm_internal.h | 1 +
- 5 files changed, 124 insertions(+), 9 deletions(-)
-
-diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
-index d6c9c57..fe2ff86 100644
---- a/src/xen/xen_driver.c
-+++ b/src/xen/xen_driver.c
-@@ -1142,20 +1142,33 @@ static int
- xenUnifiedDomainGetVcpusFlags (virDomainPtr dom, unsigned int flags)
- {
- GET_PRIVATE(dom->conn);
-- int i, ret;
-+ int ret;
-
-- if (flags != (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_MAXIMUM)) {
-- xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-- flags);
-+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_CONFIG |
-+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
-+
-+ /* Exactly one of LIVE or CONFIG must be set. */
-+ if (!(flags & VIR_DOMAIN_VCPU_LIVE) == !(flags & VIR_DOMAIN_VCPU_CONFIG)) {
-+ xenUnifiedError(VIR_ERR_INVALID_ARG,
-+ _("invalid flag combination: (0x%x)"), flags);
- return -1;
- }
-
-- for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
-- if (priv->opened[i] && drivers[i]->domainGetMaxVcpus) {
-- ret = drivers[i]->domainGetMaxVcpus (dom);
-- if (ret != 0) return ret;
-- }
-+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
-+ ret = xenDaemonDomainGetVcpusFlags(dom, flags);
-+ if (ret != -2)
-+ return ret;
-+ }
-+ if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
-+ ret = xenXMDomainGetVcpusFlags(dom, flags);
-+ if (ret != -2)
-+ return ret;
-+ }
-+ if (flags == (VIR_DOMAIN_VCPU_CONFIG | VIR_DOMAIN_VCPU_MAXIMUM))
-+ return xenHypervisorGetVcpuMax(dom);
-
-+ xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
- }
-
-diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
-index dfc6415..3642296 100644
---- a/src/xen/xend_internal.c
-+++ b/src/xen/xend_internal.c
-@@ -3620,6 +3620,58 @@ xenDaemonDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
- }
-
- /**
-+ * xenDaemonDomainGetVcpusFlags:
-+ * @domain: pointer to domain object
-+ * @flags: bitwise-ORd from virDomainVcpuFlags
-+ *
-+ * Extract information about virtual CPUs of domain according to flags.
-+ *
-+ * Returns the number of vcpus on success, -1 if an error message was
-+ * issued, and -2 if the unified driver should keep trying.
-+
-+ */
-+int
-+xenDaemonDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
-+{
-+ struct sexpr *root;
-+ int ret;
-+ xenUnifiedPrivatePtr priv;
-+
-+ if (domain == NULL || domain->conn == NULL || domain->name == NULL) {
-+ virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-+ return -1;
-+ }
-+
-+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
-+
-+ /* If xendConfigVersion is 2, then we can only report _LIVE (and
-+ * xm_internal reports _CONFIG). If it is 3, then _LIVE and
-+ * _CONFIG are always in sync for a running system. */
-+ if (domain->id < 0 && priv->xendConfigVersion <
XEND_CONFIG_VERSION_3_0_4)
-+ return -2;
-+ if (domain->id < 0 && (flags & VIR_DOMAIN_VCPU_LIVE)) {
-+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("domain not active"));
-+ return -1;
-+ }
-+
-+ root = sexpr_get(domain->conn, "/xend/domain/%s?detail=1",
domain->name);
-+ if (root == NULL)
-+ return -1;
-+
-+ ret = sexpr_int(root, "domain/vcpus");
-+ if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM)) {
-+ int vcpus = count_one_bits(sexpr_int(root, "domain/vcpu_avail"));
-+ if (vcpus)
-+ ret = MIN(vcpus, ret);
-+ }
-+ if (!ret)
-+ ret = -2;
-+ sexpr_free(root);
-+ return ret;
-+}
-+
-+/**
- * virDomainGetVcpus:
- * @domain: pointer to domain object, or NULL for Domain0
- * @info: pointer to an array of virVcpuInfo structures (OUT)
-diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
-index c757716..923cebd 100644
---- a/src/xen/xend_internal.h
-+++ b/src/xen/xend_internal.h
-@@ -155,6 +155,8 @@ int xenDaemonDomainPinVcpu (virDomainPtr domain,
- unsigned int vcpu,
- unsigned char *cpumap,
- int maplen);
-+int xenDaemonDomainGetVcpusFlags (virDomainPtr domain,
-+ unsigned int flags);
- int xenDaemonDomainGetVcpus (virDomainPtr domain,
- virVcpuInfoPtr info,
- int maxinfo,
-diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
-index f7121ab..4ea4245 100644
---- a/src/xen/xm_internal.c
-+++ b/src/xen/xm_internal.c
-@@ -1671,6 +1671,53 @@ cleanup:
- }
-
- /**
-+ * xenXMDomainGetVcpusFlags:
-+ * @domain: pointer to domain object
-+ * @flags: bitwise-ORd from virDomainVcpuFlags
-+ *
-+ * Extract information about virtual CPUs of domain according to flags.
-+ *
-+ * Returns the number of vcpus on success, -1 if an error message was
-+ * issued, and -2 if the unified driver should keep trying.
-+ */
-+int
-+xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags)
-+{
-+ xenUnifiedPrivatePtr priv;
-+ const char *filename;
-+ xenXMConfCachePtr entry;
-+ int ret = -2;
-+
-+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
-+ xenXMError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-+ return -1;
-+ }
-+
-+ if (domain->id != -1)
-+ return -2;
-+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
-+ xenXMError(VIR_ERR_OPERATION_FAILED, "%s", _("domain not
active"));
-+ return -1;
-+ }
-+
-+ priv = domain->conn->privateData;
-+ xenUnifiedLock(priv);
-+
-+ if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
-+ goto cleanup;
-+
-+ if (!(entry = virHashLookup(priv->configCache, filename)))
-+ goto cleanup;
-+
-+ ret = ((flags & VIR_DOMAIN_VCPU_MAXIMUM) ? entry->def->maxvcpus
-+ : entry->def->vcpus);
-+
-+cleanup:
-+ xenUnifiedUnlock(priv);
-+ return ret;
-+}
-+
-+/**
- * xenXMDomainPinVcpu:
- * @domain: pointer to domain object
- * @vcpu: virtual CPU number (reserved)
-diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
-index 3ad3456..3295fbd 100644
---- a/src/xen/xm_internal.h
-+++ b/src/xen/xm_internal.h
-@@ -45,6 +45,7 @@ int xenXMDomainSetMemory(virDomainPtr domain, unsigned long memory);
- int xenXMDomainSetMaxMemory(virDomainPtr domain, unsigned long memory);
- unsigned long xenXMDomainGetMaxMemory(virDomainPtr domain);
- int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus);
-+int xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags);
- int xenXMDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
- unsigned char *cpumap, int maplen);
- virDomainPtr xenXMDomainLookupByName(virConnectPtr conn, const char *domname);
---
-1.7.2.3
-
diff --git a/docs/api_extension/0014-improve-setting-xen-vcpu-counts.patch
b/docs/api_extension/0014-improve-setting-xen-vcpu-counts.patch
deleted file mode 100644
index 3adbd7549d..0000000000
--- a/docs/api_extension/0014-improve-setting-xen-vcpu-counts.patch
+++ /dev/null
@@ -1,342 +0,0 @@
-From e443a003129a172a7332f3cb6e40b3c39363ed5e Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Thu, 14 Oct 2010 16:17:18 -0600
-Subject: [PATCH 14/15] vcpu: improve support for setting xen vcpu counts
-
-Tested with RHEL 5.6 (xendConfigVersion 2, where xend_internal
-controls live domains and xm_internal controls inactive domains).
-Hopefully this works with xendConfigVersion 3 (where xend_internal
-controls everything).
-
-* src/xen/xen_driver.c (xenUnifiedDomainSetVcpusFlags): Support
-more flags.
-(xenUnifiedGetMaxVcpus): Export.
-* src/xen/xm_internal.h (xenXMDomainSetVcpusFlags): New prototype.
-* src/xen/xend_internal.h (xenDaemonDomainSetVcpusFlags): Likewise.
-* src/xen/xen_driver.h (xenUnifiedGetMaxVcpus): Likewise.
-* src/xen/xm_internal.c (xenXMDomainSetVcpusFlags): New function.
-* src/xen/xend_internal.c (xenDaemonDomainSetVcpusFlags): Likewise.
----
- src/xen/xen_driver.c | 60 ++++++++++++++++++++++++---------
- src/xen/xen_driver.h | 1 +
- src/xen/xend_internal.c | 76 +++++++++++++++++++++++++++++++++++++++++++
- src/xen/xend_internal.h | 3 ++
- src/xen/xm_internal.c | 83 +++++++++++++++++++++++++++++++++++++++++++++++
- src/xen/xm_internal.h | 2 +
- 6 files changed, 208 insertions(+), 17 deletions(-)
-
-diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
-index fe2ff86..66e8518 100644
---- a/src/xen/xen_driver.c
-+++ b/src/xen/xen_driver.c
-@@ -508,7 +508,7 @@ xenUnifiedIsSecure(virConnectPtr conn)
- return ret;
- }
-
--static int
-+int
- xenUnifiedGetMaxVcpus (virConnectPtr conn, const char *type)
- {
- GET_PRIVATE(conn);
-@@ -1073,36 +1073,62 @@ xenUnifiedDomainSetVcpusFlags (virDomainPtr dom, unsigned int
nvcpus,
- unsigned int flags)
- {
- GET_PRIVATE(dom->conn);
-- int i;
-+ int ret;
-+
-+ virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
-+ VIR_DOMAIN_VCPU_CONFIG |
-+ VIR_DOMAIN_VCPU_MAXIMUM, -1);
-
-- if (flags != VIR_DOMAIN_VCPU_LIVE) {
-- xenUnifiedError(VIR_ERR_INVALID_ARG, _("unsupported flags: (0x%x)"),
-- flags);
-+ /* At least one of LIVE or CONFIG must be set. MAXIMUM cannot be
-+ * mixed with LIVE. */
-+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) == 0 ||
-+ (flags & (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) ==
-+ (VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_LIVE)) {
-+ xenUnifiedError(VIR_ERR_INVALID_ARG,
-+ _("invalid flag combination: (0x%x)"), flags);
-+ return -1;
-+ }
-+ if (!nvcpus || (unsigned short) nvcpus != nvcpus) {
-+ xenUnifiedError(VIR_ERR_INVALID_ARG,
-+ _("argument out of range: %d"), nvcpus);
- return -1;
- }
-
- /* Try non-hypervisor methods first, then hypervisor direct method
- * as a last resort.
- */
-- for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
-- if (i != XEN_UNIFIED_HYPERVISOR_OFFSET &&
-- priv->opened[i] &&
-- drivers[i]->domainSetVcpus &&
-- drivers[i]->domainSetVcpus (dom, nvcpus) == 0)
-- return 0;
--
-- if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET] &&
-- drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSetVcpus &&
-- drivers[XEN_UNIFIED_HYPERVISOR_OFFSET]->domainSetVcpus (dom, nvcpus) == 0)
-- return 0;
-+ if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
-+ ret = xenDaemonDomainSetVcpusFlags(dom, nvcpus, flags);
-+ if (ret != -2)
-+ return ret;
-+ }
-+ if (priv->opened[XEN_UNIFIED_XM_OFFSET]) {
-+ ret = xenXMDomainSetVcpusFlags(dom, nvcpus, flags);
-+ if (ret != -2)
-+ return ret;
-+ }
-+ if (flags == VIR_DOMAIN_VCPU_LIVE)
-+ return xenHypervisorSetVcpus(dom, nvcpus);
-
-+ xenUnifiedError(VIR_ERR_NO_SUPPORT, __FUNCTION__);
- return -1;
- }
-
- static int
- xenUnifiedDomainSetVcpus (virDomainPtr dom, unsigned int nvcpus)
- {
-- return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, VIR_DOMAIN_VCPU_LIVE);
-+ unsigned int flags = VIR_DOMAIN_VCPU_LIVE;
-+ xenUnifiedPrivatePtr priv;
-+
-+ /* Per the documented API, it is hypervisor-dependent whether this
-+ * affects just _LIVE or _LIVE|_CONFIG; in xen's case, that
-+ * depends on xendConfigVersion. */
-+ if (dom) {
-+ priv = dom->conn->privateData;
-+ if (priv->xendConfigVersion >= XEND_CONFIG_VERSION_3_0_4)
-+ flags |= VIR_DOMAIN_VCPU_CONFIG;
-+ }
-+ return xenUnifiedDomainSetVcpusFlags(dom, nvcpus, flags);
- }
-
- static int
-diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
-index 3e7c1d0..115a26a 100644
---- a/src/xen/xen_driver.h
-+++ b/src/xen/xen_driver.h
-@@ -220,6 +220,7 @@ int xenUnifiedRemoveDomainInfo(xenUnifiedDomainInfoListPtr info,
- void xenUnifiedDomainEventDispatch (xenUnifiedPrivatePtr priv,
- virDomainEventPtr event);
- unsigned long xenUnifiedVersion(void);
-+int xenUnifiedGetMaxVcpus(virConnectPtr conn, const char *type);
-
- # ifndef PROXY
- void xenUnifiedLock(xenUnifiedPrivatePtr priv);
-diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
-index 3642296..55c2cc4 100644
---- a/src/xen/xend_internal.c
-+++ b/src/xen/xend_internal.c
-@@ -3535,6 +3535,82 @@ xenDaemonLookupByID(virConnectPtr conn, int id) {
- }
-
- /**
-+ * xenDaemonDomainSetVcpusFlags:
-+ * @domain: pointer to domain object
-+ * @nvcpus: the new number of virtual CPUs for this domain
-+ * @flags: bitwise-ORd from virDomainVcpuFlags
-+ *
-+ * Change virtual CPUs allocation of domain according to flags.
-+ *
-+ * Returns 0 on success, -1 if an error message was issued, and -2 if
-+ * the unified driver should keep trying.
-+ */
-+int
-+xenDaemonDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
-+ unsigned int flags)
-+{
-+ char buf[VIR_UUID_BUFLEN];
-+ xenUnifiedPrivatePtr priv;
-+ int max;
-+
-+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
-+ || (vcpus < 1)) {
-+ virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-+ return (-1);
-+ }
-+
-+ priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
-+
-+ if ((domain->id < 0 && priv->xendConfigVersion <
XEND_CONFIG_VERSION_3_0_4) ||
-+ (flags & VIR_DOMAIN_VCPU_MAXIMUM))
-+ return -2;
-+
-+ /* With xendConfigVersion 2, only _LIVE is supported. With
-+ * xendConfigVersion 3, only _LIVE|_CONFIG is supported for
-+ * running domains, or _CONFIG for inactive domains. */
-+ if (priv->xendConfigVersion < XEND_CONFIG_VERSION_3_0_4) {
-+ if (flags & VIR_DOMAIN_VCPU_CONFIG) {
-+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("Xend version does not support modifying "
-+ "persistent config"));
-+ return -1;
-+ }
-+ } else if (domain->id < 0) {
-+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
-+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("domain not running"));
-+ return -1;
-+ }
-+ } else {
-+ if ((flags & (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) !=
-+ (VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG)) {
-+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("Xend only supports modifying both live and "
-+ "persistent config"));
-+ }
-+ }
-+
-+ /* Unfortunately, xend_op does not validate whether this exceeds
-+ * the maximum. */
-+ flags |= VIR_DOMAIN_VCPU_MAXIMUM;
-+ if ((max = xenDaemonDomainGetVcpusFlags(domain, flags)) < 0) {
-+ virXendError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("could not determin max vcpus for the domain"));
-+ return -1;
-+ }
-+ if (vcpus > max) {
-+ virXendError(VIR_ERR_INVALID_ARG,
-+ _("requested vcpus is greater than max allowable"
-+ " vcpus for the domain: %d > %d"), vcpus, max);
-+ return -1;
-+ }
-+
-+ snprintf(buf, sizeof(buf), "%d", vcpus);
-+ return xend_op(domain->conn, domain->name, "op",
"set_vcpus", "vcpus",
-+ buf, NULL);
-+}
-+
-+/**
- * xenDaemonDomainSetVcpus:
- * @domain: pointer to domain object
- * @nvcpus: the new number of virtual CPUs for this domain
-diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
-index 923cebd..53f5d2c 100644
---- a/src/xen/xend_internal.h
-+++ b/src/xen/xend_internal.h
-@@ -151,6 +151,9 @@ int xenDaemonDomainUndefine(virDomainPtr domain);
-
- int xenDaemonDomainSetVcpus (virDomainPtr domain,
- unsigned int vcpus);
-+int xenDaemonDomainSetVcpusFlags (virDomainPtr domain,
-+ unsigned int vcpus,
-+ unsigned int flags);
- int xenDaemonDomainPinVcpu (virDomainPtr domain,
- unsigned int vcpu,
- unsigned char *cpumap,
-diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
-index 4ea4245..2b8e51e 100644
---- a/src/xen/xm_internal.c
-+++ b/src/xen/xm_internal.c
-@@ -1670,6 +1670,89 @@ cleanup:
- return ret;
- }
-
-+/*
-+ * xenXMDomainSetVcpusFlags:
-+ * @domain: pointer to domain object
-+ * @nvcpus: number of vcpus
-+ * @flags: bitwise-ORd from virDomainVcpuFlags
-+ *
-+ * Change virtual CPUs allocation of domain according to flags.
-+ *
-+ * Returns 0 on success, -1 if an error message was issued, and -2 if
-+ * the unified driver should keep trying.
-+ */
-+int
-+xenXMDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
-+ unsigned int flags)
-+{
-+ xenUnifiedPrivatePtr priv;
-+ const char *filename;
-+ xenXMConfCachePtr entry;
-+ int ret = -1;
-+ int max;
-+
-+ if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
-+ xenXMError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-+ return -1;
-+ }
-+ if (domain->conn->flags & VIR_CONNECT_RO) {
-+ xenXMError(VIR_ERR_OPERATION_DENIED, __FUNCTION__);
-+ return -1;
-+ }
-+ if (domain->id != -1)
-+ return -2;
-+ if (flags & VIR_DOMAIN_VCPU_LIVE) {
-+ xenXMError(VIR_ERR_OPERATION_INVALID, "%s",
-+ _("domain is not running"));
-+ return -1;
-+ }
-+
-+ priv = domain->conn->privateData;
-+ xenUnifiedLock(priv);
-+
-+ if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
-+ goto cleanup;
-+
-+ if (!(entry = virHashLookup(priv->configCache, filename)))
-+ goto cleanup;
-+
-+ /* Hypervisor maximum. */
-+ if ((max = xenUnifiedGetMaxVcpus(domain->conn, NULL)) < 0) {
-+ xenXMError(VIR_ERR_INTERNAL_ERROR, "%s",
-+ _("could not determin max vcpus for the domain"));
-+ goto cleanup;
-+ }
-+ /* Can't specify a current larger than stored maximum; but
-+ * reducing maximum can silently reduce current. */
-+ if (!(flags & VIR_DOMAIN_VCPU_MAXIMUM))
-+ max = entry->def->maxvcpus;
-+ if (vcpus > max) {
-+ xenXMError(VIR_ERR_INVALID_ARG,
-+ _("requested vcpus is greater than max allowable"
-+ " vcpus for the domain: %d > %d"), vcpus, max);
-+ goto cleanup;
-+ }
-+
-+ if (flags & VIR_DOMAIN_VCPU_MAXIMUM) {
-+ entry->def->maxvcpus = vcpus;
-+ if (entry->def->vcpus > vcpus)
-+ entry->def->vcpus = vcpus;
-+ } else {
-+ entry->def->vcpus = vcpus;
-+ }
-+
-+ /* If this fails, should we try to undo our changes to the
-+ * in-memory representation of the config file. I say not!
-+ */
-+ if (xenXMConfigSaveFile(domain->conn, entry->filename, entry->def) < 0)
-+ goto cleanup;
-+ ret = 0;
-+
-+cleanup:
-+ xenUnifiedUnlock(priv);
-+ return ret;
-+}
-+
- /**
- * xenXMDomainGetVcpusFlags:
- * @domain: pointer to domain object
-diff --git a/src/xen/xm_internal.h b/src/xen/xm_internal.h
-index 3295fbd..a46e1a2 100644
---- a/src/xen/xm_internal.h
-+++ b/src/xen/xm_internal.h
-@@ -45,6 +45,8 @@ int xenXMDomainSetMemory(virDomainPtr domain, unsigned long memory);
- int xenXMDomainSetMaxMemory(virDomainPtr domain, unsigned long memory);
- unsigned long xenXMDomainGetMaxMemory(virDomainPtr domain);
- int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus);
-+int xenXMDomainSetVcpusFlags(virDomainPtr domain, unsigned int vcpus,
-+ unsigned int flags);
- int xenXMDomainGetVcpusFlags(virDomainPtr domain, unsigned int flags);
- int xenXMDomainPinVcpu(virDomainPtr domain, unsigned int vcpu,
- unsigned char *cpumap, int maplen);
---
-1.7.2.3
-
diff --git a/docs/api_extension/0015-remove-dead-xen-code.patch
b/docs/api_extension/0015-remove-dead-xen-code.patch
deleted file mode 100644
index 64e0d98bdf..0000000000
--- a/docs/api_extension/0015-remove-dead-xen-code.patch
+++ /dev/null
@@ -1,228 +0,0 @@
-From b013788742183afec9aa5068d3cfd185a3b5c62e Mon Sep 17 00:00:00 2001
-From: Eric Blake <eblake(a)redhat.com>
-Date: Thu, 7 Oct 2010 08:59:27 -0600
-Subject: [PATCH 15/15] vcpu: remove dead xen code
-
-* src/xen/xen_driver.h (xenUnifiedDriver): Remove now-unused
-domainGetMaxVcpus, domainSetVcpus.
-* src/xen/proxy_internal.c (xenProxyDriver): Likewise.
-* src/xen/xen_hypervisor.c (xenHypervisorDriver): Likewise.
-* src/xen/xen_inotify.c (xenInotifyDriver): Likewise.
-* src/xen/xend_internal.c (xenDaemonDriver)
-(xenDaemonDomainSetVcpus): Likewise.
-* src/xen/xm_internal.c (xenXMDriver, xenXMDomainSetVcpus):
-Likewise.
-* src/xen/xs_internal.c (xenStoreDriver): Likewise.
----
- src/xen/proxy_internal.c | 2 --
- src/xen/xen_driver.h | 4 +---
- src/xen/xen_hypervisor.c | 2 --
- src/xen/xen_inotify.c | 2 --
- src/xen/xend_internal.c | 33 ---------------------------------
- src/xen/xm_internal.c | 43 -------------------------------------------
- src/xen/xs_internal.c | 2 --
- 7 files changed, 1 insertions(+), 87 deletions(-)
-
-diff --git a/src/xen/proxy_internal.c b/src/xen/proxy_internal.c
-index 335dfc4..4033727 100644
---- a/src/xen/proxy_internal.c
-+++ b/src/xen/proxy_internal.c
-@@ -67,10 +67,8 @@ struct xenUnifiedDriver xenProxyDriver = {
- NULL, /* domainSave */
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
-- NULL, /* domainSetVcpus */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
-- NULL, /* domainGetMaxVcpus */
- NULL, /* listDefinedDomains */
- NULL, /* numOfDefinedDomains */
- NULL, /* domainCreate */
-diff --git a/src/xen/xen_driver.h b/src/xen/xen_driver.h
-index 115a26a..53f97d4 100644
---- a/src/xen/xen_driver.h
-+++ b/src/xen/xen_driver.h
-@@ -1,7 +1,7 @@
- /*
- * xen_unified.c: Unified Xen driver.
- *
-- * Copyright (C) 2007 Red Hat, Inc.
-+ * Copyright (C) 2007, 2010 Red Hat, Inc.
- *
- * See COPYING.LIB for the License of this software
- *
-@@ -84,10 +84,8 @@ struct xenUnifiedDriver {
- virDrvDomainSave domainSave;
- virDrvDomainRestore domainRestore;
- virDrvDomainCoreDump domainCoreDump;
-- virDrvDomainSetVcpus domainSetVcpus;
- virDrvDomainPinVcpu domainPinVcpu;
- virDrvDomainGetVcpus domainGetVcpus;
-- virDrvDomainGetMaxVcpus domainGetMaxVcpus;
- virDrvListDefinedDomains listDefinedDomains;
- virDrvNumOfDefinedDomains numOfDefinedDomains;
- virDrvDomainCreate domainCreate;
-diff --git a/src/xen/xen_hypervisor.c b/src/xen/xen_hypervisor.c
-index 6246513..3797865 100644
---- a/src/xen/xen_hypervisor.c
-+++ b/src/xen/xen_hypervisor.c
-@@ -784,10 +784,8 @@ struct xenUnifiedDriver xenHypervisorDriver = {
- NULL, /* domainSave */
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
-- xenHypervisorSetVcpus, /* domainSetVcpus */
- xenHypervisorPinVcpu, /* domainPinVcpu */
- xenHypervisorGetVcpus, /* domainGetVcpus */
-- xenHypervisorGetVcpuMax, /* domainGetMaxVcpus */
- NULL, /* listDefinedDomains */
- NULL, /* numOfDefinedDomains */
- NULL, /* domainCreate */
-diff --git a/src/xen/xen_inotify.c b/src/xen/xen_inotify.c
-index d24b20f..9507061 100644
---- a/src/xen/xen_inotify.c
-+++ b/src/xen/xen_inotify.c
-@@ -71,10 +71,8 @@ struct xenUnifiedDriver xenInotifyDriver = {
- NULL, /* domainSave */
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
-- NULL, /* domainSetVcpus */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
-- NULL, /* domainGetMaxVcpus */
- NULL, /* listDefinedDomains */
- NULL, /* numOfDefinedDomains */
- NULL, /* domainCreate */
-diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
-index 55c2cc4..b90c331 100644
---- a/src/xen/xend_internal.c
-+++ b/src/xen/xend_internal.c
-@@ -3611,37 +3611,6 @@ xenDaemonDomainSetVcpusFlags(virDomainPtr domain, unsigned int
vcpus,
- }
-
- /**
-- * xenDaemonDomainSetVcpus:
-- * @domain: pointer to domain object
-- * @nvcpus: the new number of virtual CPUs for this domain
-- *
-- * Dynamically change the number of virtual CPUs used by the domain.
-- *
-- * Returns 0 for success; -1 (with errno) on error
-- */
--int
--xenDaemonDomainSetVcpus(virDomainPtr domain, unsigned int vcpus)
--{
-- char buf[VIR_UUID_BUFLEN];
-- xenUnifiedPrivatePtr priv;
--
-- if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)
-- || (vcpus < 1)) {
-- virXendError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-- return (-1);
-- }
--
-- priv = (xenUnifiedPrivatePtr) domain->conn->privateData;
--
-- if (domain->id < 0 && priv->xendConfigVersion <
XEND_CONFIG_VERSION_3_0_4)
-- return(-1);
--
-- snprintf(buf, sizeof(buf), "%d", vcpus);
-- return(xend_op(domain->conn, domain->name, "op",
"set_vcpus", "vcpus",
-- buf, NULL));
--}
--
--/**
- * xenDaemonDomainPinCpu:
- * @domain: pointer to domain object
- * @vcpu: virtual CPU number
-@@ -5213,10 +5182,8 @@ struct xenUnifiedDriver xenDaemonDriver = {
- xenDaemonDomainSave, /* domainSave */
- xenDaemonDomainRestore, /* domainRestore */
- xenDaemonDomainCoreDump, /* domainCoreDump */
-- xenDaemonDomainSetVcpus, /* domainSetVcpus */
- xenDaemonDomainPinVcpu, /* domainPinVcpu */
- xenDaemonDomainGetVcpus, /* domainGetVcpus */
-- NULL, /* domainGetMaxVcpus */
- xenDaemonListDefinedDomains, /* listDefinedDomains */
- xenDaemonNumOfDefinedDomains,/* numOfDefinedDomains */
- xenDaemonDomainCreate, /* domainCreate */
-diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
-index 2b8e51e..430d40b 100644
---- a/src/xen/xm_internal.c
-+++ b/src/xen/xm_internal.c
-@@ -103,10 +103,8 @@ struct xenUnifiedDriver xenXMDriver = {
- NULL, /* domainSave */
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
-- xenXMDomainSetVcpus, /* domainSetVcpus */
- xenXMDomainPinVcpu, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
-- NULL, /* domainGetMaxVcpus */
- xenXMListDefinedDomains, /* listDefinedDomains */
- xenXMNumOfDefinedDomains, /* numOfDefinedDomains */
- xenXMDomainCreate, /* domainCreate */
-@@ -1630,47 +1628,6 @@ cleanup:
- }
-
- /*
-- * Set the VCPU count in config
-- */
--int xenXMDomainSetVcpus(virDomainPtr domain, unsigned int vcpus) {
-- xenUnifiedPrivatePtr priv;
-- const char *filename;
-- xenXMConfCachePtr entry;
-- int ret = -1;
--
-- if ((domain == NULL) || (domain->conn == NULL) || (domain->name == NULL)) {
-- xenXMError(VIR_ERR_INVALID_ARG, __FUNCTION__);
-- return (-1);
-- }
-- if (domain->conn->flags & VIR_CONNECT_RO)
-- return (-1);
-- if (domain->id != -1)
-- return (-1);
--
-- priv = domain->conn->privateData;
-- xenUnifiedLock(priv);
--
-- if (!(filename = virHashLookup(priv->nameConfigMap, domain->name)))
-- goto cleanup;
--
-- if (!(entry = virHashLookup(priv->configCache, filename)))
-- goto cleanup;
--
-- entry->def->maxvcpus = entry->def->vcpus = vcpus;
--
-- /* If this fails, should we try to undo our changes to the
-- * in-memory representation of the config file. I say not!
-- */
-- if (xenXMConfigSaveFile(domain->conn, entry->filename, entry->def) < 0)
-- goto cleanup;
-- ret = 0;
--
--cleanup:
-- xenUnifiedUnlock(priv);
-- return ret;
--}
--
--/*
- * xenXMDomainSetVcpusFlags:
- * @domain: pointer to domain object
- * @nvcpus: number of vcpus
-diff --git a/src/xen/xs_internal.c b/src/xen/xs_internal.c
-index 9296f25..a9817b1 100644
---- a/src/xen/xs_internal.c
-+++ b/src/xen/xs_internal.c
-@@ -67,10 +67,8 @@ struct xenUnifiedDriver xenStoreDriver = {
- NULL, /* domainSave */
- NULL, /* domainRestore */
- NULL, /* domainCoreDump */
-- NULL, /* domainSetVcpus */
- NULL, /* domainPinVcpu */
- NULL, /* domainGetVcpus */
-- NULL, /* domainGetMaxVcpus */
- NULL, /* listDefinedDomains */
- NULL, /* numOfDefinedDomains */
- NULL, /* domainCreate */
---
-1.7.2.3
-
--
2.16.2