| =================== | 
 | 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=on,wait=off | 
 |  | 
 | (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 | 
 |     Interrupt (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. |