Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Browse the repository at this point in the history
docs: Document vCPU hotplug procedure
Signed-off-by: Kashyap Chamarthy <kchamart@redhat.com> Message-Id: <20181030123526.26415-4-kchamart@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
- Loading branch information
Showing
1 changed file
with
142 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,142 @@ | ||
=================== | ||
Virtual CPU hotplug | ||
=================== | ||
|
||
A complete example of vCPU hotplug (and hot-unplug) using QMP | ||
``device_add`` and ``device_del``. | ||
|
||
vCPU hotplug | ||
------------ | ||
|
||
(1) Launch QEMU as follows (note that the "maxcpus" is mandatory to | ||
allow vCPU hotplug):: | ||
|
||
$ qemu-system-x86_64 -display none -no-user-config -m 2048 \ | ||
-nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \ | ||
-smp 1,maxcpus=2 -cpu IvyBridge-IBRS \ | ||
-qmp unix:/tmp/qmp-sock,server,nowait | ||
|
||
(2) Run 'qmp-shell' (located in the source tree, under: "scripts/qmp/) | ||
to connect to the just-launched QEMU:: | ||
|
||
$> ./qmp-shell -p -v /tmp/qmp-sock | ||
[...] | ||
(QEMU) | ||
|
||
(3) Find out which CPU types could be plugged, and into which sockets:: | ||
|
||
(QEMU) query-hotpluggable-cpus | ||
{ | ||
"execute": "query-hotpluggable-cpus", | ||
"arguments": {} | ||
} | ||
{ | ||
"return": [ | ||
{ | ||
"type": "IvyBridge-IBRS-x86_64-cpu", | ||
"vcpus-count": 1, | ||
"props": { | ||
"socket-id": 1, | ||
"core-id": 0, | ||
"thread-id": 0 | ||
} | ||
}, | ||
{ | ||
"qom-path": "/machine/unattached/device[0]", | ||
"type": "IvyBridge-IBRS-x86_64-cpu", | ||
"vcpus-count": 1, | ||
"props": { | ||
"socket-id": 0, | ||
"core-id": 0, | ||
"thread-id": 0 | ||
} | ||
} | ||
] | ||
} | ||
(QEMU) | ||
|
||
(4) The ``query-hotpluggable-cpus`` command returns an object for CPUs | ||
that are present (containing a "qom-path" member) or which may be | ||
hot-plugged (no "qom-path" member). From its output in step (3), we | ||
can see that ``IvyBridge-IBRS-x86_64-cpu`` is present in socket 0, | ||
while hot-plugging a CPU into socket 1 requires passing the listed | ||
properties to QMP ``device_add``: | ||
|
||
(QEMU) device_add id=cpu-2 driver=IvyBridge-IBRS-x86_64-cpu socket-id=1 core-id=0 thread-id=0 | ||
{ | ||
"execute": "device_add", | ||
"arguments": { | ||
"socket-id": 1, | ||
"driver": "IvyBridge-IBRS-x86_64-cpu", | ||
"id": "cpu-2", | ||
"core-id": 0, | ||
"thread-id": 0 | ||
} | ||
} | ||
{ | ||
"return": {} | ||
} | ||
(QEMU) | ||
|
||
(5) Optionally, run QMP `query-cpus-fast` for some details about the | ||
vCPUs:: | ||
|
||
(QEMU) query-cpus-fast | ||
{ | ||
"execute": "query-cpus-fast", | ||
"arguments": {} | ||
} | ||
{ | ||
"return": [ | ||
{ | ||
"qom-path": "/machine/unattached/device[0]", | ||
"target": "x86_64", | ||
"thread-id": 11534, | ||
"cpu-index": 0, | ||
"props": { | ||
"socket-id": 0, | ||
"core-id": 0, | ||
"thread-id": 0 | ||
}, | ||
"arch": "x86" | ||
}, | ||
{ | ||
"qom-path": "/machine/peripheral/cpu-2", | ||
"target": "x86_64", | ||
"thread-id": 12106, | ||
"cpu-index": 1, | ||
"props": { | ||
"socket-id": 1, | ||
"core-id": 0, | ||
"thread-id": 0 | ||
}, | ||
"arch": "x86" | ||
} | ||
] | ||
} | ||
(QEMU) | ||
|
||
vCPU hot-unplug | ||
--------------- | ||
|
||
From the 'qmp-shell', invoke the QMP ``device_del`` command:: | ||
|
||
(QEMU) device_del id=cpu-2 | ||
{ | ||
"execute": "device_del", | ||
"arguments": { | ||
"id": "cpu-2" | ||
} | ||
} | ||
{ | ||
"return": {} | ||
} | ||
(QEMU) | ||
|
||
.. note:: | ||
vCPU hot-unplug requires guest cooperation; so the ``device_del`` | ||
command above does not guarantee vCPU removal -- it's a "request to | ||
unplug". At this point, the guest will get a System Control | ||
Interupt (SCI) and calls the ACPI handler for the affected vCPU | ||
device. Then the guest kernel will bring the vCPU offline and tell | ||
QEMU to unplug it. |