xref: /qemu/docs/system/cpu-hotplug.rst (revision 6df743dc)
1392d8e95SPeter Maydell===================
2392d8e95SPeter MaydellVirtual CPU hotplug
3392d8e95SPeter Maydell===================
4392d8e95SPeter Maydell
5392d8e95SPeter MaydellA complete example of vCPU hotplug (and hot-unplug) using QMP
6392d8e95SPeter Maydell``device_add`` and ``device_del``.
7392d8e95SPeter Maydell
8392d8e95SPeter MaydellvCPU hotplug
9392d8e95SPeter Maydell------------
10392d8e95SPeter Maydell
11392d8e95SPeter Maydell(1) Launch QEMU as follows (note that the "maxcpus" is mandatory to
12392d8e95SPeter Maydell    allow vCPU hotplug)::
13392d8e95SPeter Maydell
14392d8e95SPeter Maydell      $ qemu-system-x86_64 -display none -no-user-config -m 2048 \
15392d8e95SPeter Maydell          -nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \
16392d8e95SPeter Maydell          -smp 1,maxcpus=2 -cpu IvyBridge-IBRS \
17c2387413SDaniel P. Berrangé          -qmp unix:/tmp/qmp-sock,server=on,wait=off
18392d8e95SPeter Maydell
19392d8e95SPeter Maydell(2) Run 'qmp-shell' (located in the source tree, under: "scripts/qmp/)
20392d8e95SPeter Maydell    to connect to the just-launched QEMU::
21392d8e95SPeter Maydell
22392d8e95SPeter Maydell      $> ./qmp-shell -p -v /tmp/qmp-sock
23392d8e95SPeter Maydell      [...]
24392d8e95SPeter Maydell      (QEMU)
25392d8e95SPeter Maydell
26392d8e95SPeter Maydell(3) Find out which CPU types could be plugged, and into which sockets::
27392d8e95SPeter Maydell
28392d8e95SPeter Maydell      (QEMU) query-hotpluggable-cpus
29392d8e95SPeter Maydell      {
30392d8e95SPeter Maydell          "execute": "query-hotpluggable-cpus",
31392d8e95SPeter Maydell          "arguments": {}
32392d8e95SPeter Maydell      }
33392d8e95SPeter Maydell      {
34392d8e95SPeter Maydell          "return": [
35392d8e95SPeter Maydell              {
36392d8e95SPeter Maydell                  "type": "IvyBridge-IBRS-x86_64-cpu",
37392d8e95SPeter Maydell                  "vcpus-count": 1,
38392d8e95SPeter Maydell                  "props": {
39392d8e95SPeter Maydell                      "socket-id": 1,
40392d8e95SPeter Maydell                      "core-id": 0,
41392d8e95SPeter Maydell                      "thread-id": 0
42392d8e95SPeter Maydell                  }
43392d8e95SPeter Maydell              },
44392d8e95SPeter Maydell              {
45392d8e95SPeter Maydell                  "qom-path": "/machine/unattached/device[0]",
46392d8e95SPeter Maydell                  "type": "IvyBridge-IBRS-x86_64-cpu",
47392d8e95SPeter Maydell                  "vcpus-count": 1,
48392d8e95SPeter Maydell                  "props": {
49392d8e95SPeter Maydell                      "socket-id": 0,
50392d8e95SPeter Maydell                      "core-id": 0,
51392d8e95SPeter Maydell                      "thread-id": 0
52392d8e95SPeter Maydell                  }
53392d8e95SPeter Maydell              }
54392d8e95SPeter Maydell          ]
55392d8e95SPeter Maydell      }
56392d8e95SPeter Maydell      (QEMU)
57392d8e95SPeter Maydell
58392d8e95SPeter Maydell(4) The ``query-hotpluggable-cpus`` command returns an object for CPUs
59392d8e95SPeter Maydell    that are present (containing a "qom-path" member) or which may be
60392d8e95SPeter Maydell    hot-plugged (no "qom-path" member).  From its output in step (3), we
61392d8e95SPeter Maydell    can see that ``IvyBridge-IBRS-x86_64-cpu`` is present in socket 0,
62392d8e95SPeter Maydell    while hot-plugging a CPU into socket 1 requires passing the listed
63392d8e95SPeter Maydell    properties to QMP ``device_add``::
64392d8e95SPeter Maydell
65392d8e95SPeter Maydell      (QEMU) device_add id=cpu-2 driver=IvyBridge-IBRS-x86_64-cpu socket-id=1 core-id=0 thread-id=0
66392d8e95SPeter Maydell      {
67392d8e95SPeter Maydell          "execute": "device_add",
68392d8e95SPeter Maydell          "arguments": {
69392d8e95SPeter Maydell              "socket-id": 1,
70392d8e95SPeter Maydell              "driver": "IvyBridge-IBRS-x86_64-cpu",
71392d8e95SPeter Maydell              "id": "cpu-2",
72392d8e95SPeter Maydell              "core-id": 0,
73392d8e95SPeter Maydell              "thread-id": 0
74392d8e95SPeter Maydell          }
75392d8e95SPeter Maydell      }
76392d8e95SPeter Maydell      {
77392d8e95SPeter Maydell          "return": {}
78392d8e95SPeter Maydell      }
79392d8e95SPeter Maydell      (QEMU)
80392d8e95SPeter Maydell
81*6df743dcSPeter Maydell(5) Optionally, run QMP ``query-cpus-fast`` for some details about the
82392d8e95SPeter Maydell    vCPUs::
83392d8e95SPeter Maydell
84392d8e95SPeter Maydell      (QEMU) query-cpus-fast
85392d8e95SPeter Maydell      {
86392d8e95SPeter Maydell          "execute": "query-cpus-fast",
87392d8e95SPeter Maydell          "arguments": {}
88392d8e95SPeter Maydell      }
89392d8e95SPeter Maydell      {
90392d8e95SPeter Maydell          "return": [
91392d8e95SPeter Maydell              {
92392d8e95SPeter Maydell                  "qom-path": "/machine/unattached/device[0]",
93392d8e95SPeter Maydell                  "target": "x86_64",
94392d8e95SPeter Maydell                  "thread-id": 11534,
95392d8e95SPeter Maydell                  "cpu-index": 0,
96392d8e95SPeter Maydell                  "props": {
97392d8e95SPeter Maydell                      "socket-id": 0,
98392d8e95SPeter Maydell                      "core-id": 0,
99392d8e95SPeter Maydell                      "thread-id": 0
100392d8e95SPeter Maydell                  },
101392d8e95SPeter Maydell                  "arch": "x86"
102392d8e95SPeter Maydell              },
103392d8e95SPeter Maydell              {
104392d8e95SPeter Maydell                  "qom-path": "/machine/peripheral/cpu-2",
105392d8e95SPeter Maydell                  "target": "x86_64",
106392d8e95SPeter Maydell                  "thread-id": 12106,
107392d8e95SPeter Maydell                  "cpu-index": 1,
108392d8e95SPeter Maydell                  "props": {
109392d8e95SPeter Maydell                      "socket-id": 1,
110392d8e95SPeter Maydell                      "core-id": 0,
111392d8e95SPeter Maydell                      "thread-id": 0
112392d8e95SPeter Maydell                  },
113392d8e95SPeter Maydell                  "arch": "x86"
114392d8e95SPeter Maydell              }
115392d8e95SPeter Maydell          ]
116392d8e95SPeter Maydell      }
117392d8e95SPeter Maydell      (QEMU)
118392d8e95SPeter Maydell
119392d8e95SPeter MaydellvCPU hot-unplug
120392d8e95SPeter Maydell---------------
121392d8e95SPeter Maydell
122392d8e95SPeter MaydellFrom the 'qmp-shell', invoke the QMP ``device_del`` command::
123392d8e95SPeter Maydell
124392d8e95SPeter Maydell      (QEMU) device_del id=cpu-2
125392d8e95SPeter Maydell      {
126392d8e95SPeter Maydell          "execute": "device_del",
127392d8e95SPeter Maydell          "arguments": {
128392d8e95SPeter Maydell              "id": "cpu-2"
129392d8e95SPeter Maydell          }
130392d8e95SPeter Maydell      }
131392d8e95SPeter Maydell      {
132392d8e95SPeter Maydell          "return": {}
133392d8e95SPeter Maydell      }
134392d8e95SPeter Maydell      (QEMU)
135392d8e95SPeter Maydell
136392d8e95SPeter Maydell.. note::
137392d8e95SPeter Maydell    vCPU hot-unplug requires guest cooperation; so the ``device_del``
138392d8e95SPeter Maydell    command above does not guarantee vCPU removal -- it's a "request to
139392d8e95SPeter Maydell    unplug".  At this point, the guest will get a System Control
140392d8e95SPeter Maydell    Interrupt (SCI) and calls the ACPI handler for the affected vCPU
141392d8e95SPeter Maydell    device.  Then the guest kernel will bring the vCPU offline and tell
142392d8e95SPeter Maydell    QEMU to unplug it.
143