Implements alternative way for hot-adding CPU using cpu-add QMP command, which could be useful until it would be possible to add CPUs via device_add.
To hot-add CPU use following command from qmp-shell: cpu-add id=[0..max-cpus - 1) git tree for testing: https://github.com/imammedo/qemu/tree/cpu_add.v6 based on qom-cpu tree v6->v5 * override hot_add_cpu hook statically * extend and use memory_region_find() in IOAPIC * s/signal_cpu_creation/tcg_signal_cpu_creation/ * add "since 1.5 to cpu-addQAPI schema description v5->v4: * style fixes * new helper qemu_for_each_cpu() * switch to qemu_for_each_cpu() in cpu_exists() * "pc: update rtc ..." patch make depend it on "mc146818rtc: QOM'ify" and use QOM cast style * call CPU added notifier right before CPU becomes runable * s/resume_vcpu/cpu_resume/ * acpi/piix4: add spec documentation for QEMU<->Seabios CPU hotplug interface * use error_propagate() in pc_new_cpu() * skip cpu_exists() check in apic-id property setter if new value is the same as current * embed icc-bus inside icc-bridge and use qbus_create_inplace() * move include/hw/i386/icc_bus.h into include/hw/cpu/ * make missing icc-bus fatal error for softmmu target * split "move APIC to ICC bus" and "move IOAPIC to ICC bus" on smaller patches * use qdev_get_parent_bus() to get parent bus * split "add cpu-add command..." on smaller patches v4->v3: * 'id' in cpu-add command will be a thread number instead of APIC ID * split off resume_vcpu() into separate patch * move notifier from rtc code into pc.c v2->v3: * use local error & propagate_error() instead of operating on passed in errp in several places * replace CPUClass.get_firmware_id() with CPUClass.get_arch_id() * leave IOAPIC creation to board and just set bus to icc-bus * include kvm-stub.o in cpu libary if no KVM is configured * create resume_vcpu() stub and include it in libqemustub, and use it directly instead of CPU method * acpi_piix4: s/cpu_add_notifier/cpu_added_notifier/ v1->v2: * generalize cpu sync to KVM, resume and hot-plug notification and invoke them form CPUClass, to make available to all targets. * introduce cpu_exists() and CPUClass.get_firmware_id() and use the last one in acpi_piix to make code target independent. * move IOAPIC to ICC bus, it was suggested and easy to convert. * leave kvmvapic as SysBusDevice, it doesn't affect hot-plug and created only once for all APIC instances. I haven't found yet good/clean enough way to convert it to ICCDevice. May be follow-up though. * split one big ICC patch into several, one per converted device * add cpu_hot_add hook to machine and implement it for target-i386, instead of adding stabs. Could be used by other targets to implement cpu-add. * pre-allocate links<CPU> for all possible CPUs and make them available at /machine/icc-bridge/cpu[0..N] QOM path, so users could find out possible/free CPU IDs to use in cpu-add command. Igor Mammedov (14): exec: add qemu_for_each_cpu cpu: add helper cpu_exists(), to check if CPU with specified id exists acpi_piix4: add infrastructure to send CPU hot-plug GPE to guest target-i386: introduce apic-id property target-i386: introduce ICC bus/device/bridge target-i386: cpu: attach ICC bus to CPU on its creation target-i386: replace MSI_SPACE_SIZE with APIC_SPACE_SIZE target-i386: kvmvapic: make expilict dependency on sysbus.h target-i386: move APIC to ICC bus target-i386: move IOAPIC to ICC bus pc: pass QEMUMachineInitArgs down to pc_cpus_init() add hot_add_cpu hook to QEMUMachine and export machine_args target-i386: implement machine->hot_add_cpu hook QMP: add cpu-add command Paolo Bonzini (1): extend memory_region_find() and use it in kvm/ioapic MAINTAINERS | 6 ++ cpus.c | 13 ++-- default-configs/i386-softmmu.mak | 1 + default-configs/x86_64-softmmu.mak | 1 + docs/specs/acpi_cpu_hotplug.txt | 22 +++++++ exec.c | 10 +++ hw/acpi/piix4.c | 90 ++++++++++++++++++++++++++- hw/cpu/Makefile.objs | 1 + hw/cpu/icc_bus.c | 120 ++++++++++++++++++++++++++++++++++++ hw/i386/kvm/apic.c | 2 +- hw/i386/kvm/ioapic.c | 9 +++- hw/i386/kvmvapic.c | 1 + hw/i386/pc.c | 80 +++++++++++++++++++++--- hw/i386/pc_piix.c | 74 +++++++--------------- hw/i386/pc_q35.c | 31 +++++---- hw/intc/apic.c | 2 +- hw/intc/apic_common.c | 18 ++++-- hw/intc/ioapic_common.c | 14 +++- hw/xen/xen_apic.c | 2 +- include/exec/memory.h | 13 ++-- include/hw/boards.h | 3 + include/hw/cpu/icc_bus.h | 63 +++++++++++++++++++ include/hw/i386/apic_internal.h | 8 +-- include/hw/i386/ioapic_internal.h | 6 +- include/hw/i386/pc.h | 4 +- include/qom/cpu.h | 18 ++++++ memory.c | 20 +++++-- qapi-schema.json | 13 ++++ qmp-commands.hx | 23 +++++++ qmp.c | 10 +++ qom/cpu.c | 26 ++++++++ target-i386/cpu.c | 73 ++++++++++++++++++---- target-i386/cpu.h | 1 + vl.c | 8 ++- 34 files changed, 656 insertions(+), 130 deletions(-) create mode 100644 docs/specs/acpi_cpu_hotplug.txt create mode 100644 hw/cpu/icc_bus.c create mode 100644 include/hw/cpu/icc_bus.h