Current ACPI interface for CPU hotplug supports hotadding only upto 255 CPUs and lacks means to convey additional information needed for _PXM and _OST methods support. Also being bitmap based with bit position specifying APIC ID it doesn't scale up for 32-bit APIC IDs that would with x2APIC support in KVM.
So factor out current CPU hotplug into legacy module, that is used by 2.6 and older machine types as we can't break ABI and build another QEMU-guest interface using as model memory-hotplug. New interface will be used since 2.7 machine types and will support: - more thant 255 CPUs with any 32-bit APIC ID value - a registers set to communicate PXM/OST information (extendable without breaking IO layout) - possible to reuse for ARM's 'virt' machine type with minimal tweaks (add init for MMIO, add ACPI hooks on CPU hotplug path) Series consists of 2 parts: 1-14 patches: cleanup, consolidate legacy ACPI CPU hotplug, use it only on 2.6 and older machine types + adding related ACPI tables test case 15-41 patches: * extending AcpiDeviceIfClass to make ACPI event notification more target agnostic, * adding explicit machine.cpu-hotplug property so that feature would be enabled only when users ask for it, saving some IO ports/memory/CPU cycles when it's not needed (applies only to 2.7 and newer machine types, legacy hotplug is always enabled on 2.6 and older machine types so it won't break migration). * adding new ACPI HW and AML parts of CPU hotplug that support more than 255 CPUs. Plus some cleanups that partially remove apic_id_limit limitation. The rest of apic_id_limit cleanups will go later on top of this series as part of x2APIC series. * implementing unplug side of ACPI HW/AML and basic unplug hooking in hot-unplug callback. TODO:For mgmt to use unplug it needs device_add/del support which is work in progress and will go on top of this series. * adding extra _PXM/_OST method handling so that guest would actually know to which node CPU is hotplugged and report hotplug status progress to mgmt. Tested with following guests: RHEL7, WS2003EEx64, WS2012R2x64 * unplug is tested only with RHEL7 as Windows doesn't support it. * untested migration. git tree for testing: g...@github.com:imammedo/qemu.git modern_cpu_hotplug_RFC viewing: https://github.com/imammedo/qemu/commits/modern_cpu_hotplug_RFC Igor Mammedov (42): acpi: add aml_debug() acpi: add aml_refof() pc: acpi: remove AML for empty/not used GPE handlers pc: acpi: consolidate CPU hotplug AML pc: acpi: consolidate \GPE._E02 with the rest of CPU hotplug AML pc: acpi: cpu-hotplug: make AML CPU_foo defines local to cpu_hotplug_acpi_table.c pc: acpi: mark current CPU hotplug functions as legacy pc: acpi: consolidate legacy CPU hotplug in one file pc: acpi: simplify build_legacy_cpu_hotplug_aml() signature pc: piix4/ich9: add 'cpu-hotplug-legacy' property pc: add 2.7 machine pc: initialize legacy hotplug only for 2.6 and older machine types tests: bios-tables-test: update tables with CPHP turned off by default tests: acpi: check legacy CPU hotplug AML is present for 2.6 machine type acpi: extend ACPI interface to provide send_event hook pc: use AcpiDeviceIfClass.send_event to issue GPE events docs: update ACPI CPU hotplug spec with new protocol acpi: hardware side of CPU hotplug pc: add generic CPU unplug callbacks machine: add cpu-hotplug machine option pc: q35: initialize new CPU hotplug hw pc: piix4: initialize new CPU hotplug hw tests: pc-cpu-test: turn on cpu-hotplug explicily pc: acpi: cpuhp-legacy: switch ProcessorID to possible_cpus idx tests: acpi: update cphp_legacy case with new ProcessorID values pc: acpi: introduce AcpiDeviceIfClass.madt_cpu hook acpi: add CPU devices AML to DSDT acpi: add CPU hotplug methods to DSDT tests: acpi: update expected files with new CPU AML description qdev: hotplug: Introduce HotplugHandler.pre_plug() callback pc: numa: replace node_cpu indexing by apic_id with possible_cpus index pc: set X86CPU.node property if QEMU starts with numa enabled target-i386: add X86CPU.node property acpi: cpuhp: add command and data registers acpi: cpuhp: provide cpu._PXM method if running in numa mode acpi: cpuhp: add cpu._OST handling tests: acpi: report names of expected files in verbose mode tests: acpi: add CPU hotplug testcase tests: acpi: add expected tables for CPU hotplug case tests: acpi: extend CPU hotplug test with NUMA support tests: acpi: cpuhp: add expected SRAT tables and update DSDT with _PXM support DO NOT APPLY: simulate CPU unplug when executin cpu-add on a present CPU docs/specs/acpi_cpu_hotplug.txt | 88 ++++- hw/acpi/Makefile.objs | 3 +- hw/acpi/aml-build.c | 17 + hw/acpi/core.c | 2 +- hw/acpi/cpu.c | 610 +++++++++++++++++++++++++++++++ hw/acpi/cpu_hotplug.c | 246 ++++++++++++- hw/acpi/cpu_hotplug_acpi_table.c | 136 ------- hw/acpi/ich9.c | 113 +++++- hw/acpi/memory_hotplug.c | 12 +- hw/acpi/pcihp.c | 10 +- hw/acpi/piix4.c | 76 +++- hw/core/hotplug.c | 11 + hw/core/machine.c | 20 + hw/core/qdev.c | 9 +- hw/i386/acpi-build.c | 191 ++-------- hw/i386/pc.c | 126 +++++-- hw/i386/pc_piix.c | 18 +- hw/i386/pc_q35.c | 20 +- hw/isa/lpc_ich9.c | 39 +- hw/mips/mips_malta.c | 2 +- include/hw/acpi/acpi.h | 10 +- include/hw/acpi/acpi_dev_interface.h | 25 ++ include/hw/acpi/aml-build.h | 2 + include/hw/acpi/cpu.h | 63 ++++ include/hw/acpi/cpu_hotplug.h | 19 +- include/hw/acpi/ich9.h | 16 +- include/hw/acpi/memory_hotplug.h | 4 +- include/hw/acpi/pcihp.h | 5 +- include/hw/boards.h | 1 + include/hw/compat.h | 12 + include/hw/hotplug.h | 14 +- include/hw/i386/pc.h | 12 +- include/qom/cpu.h | 2 +- qapi-schema.json | 2 +- qom/cpu.c | 6 +- stubs/Makefile.objs | 1 + stubs/pc_madt_cpu_entry.c | 7 + target-i386/cpu-qom.h | 1 + target-i386/cpu.c | 42 +++ tests/acpi-test-data/pc/APIC.cphp | Bin 0 -> 160 bytes tests/acpi-test-data/pc/DSDT | Bin 5587 -> 5147 bytes tests/acpi-test-data/pc/DSDT.bridge | Bin 7446 -> 7006 bytes tests/acpi-test-data/pc/DSDT.cphp | Bin 0 -> 6614 bytes tests/acpi-test-data/pc/DSDT.cphp_legacy | Bin 0 -> 5503 bytes tests/acpi-test-data/pc/SRAT.cphp | Bin 0 -> 304 bytes tests/acpi-test-data/q35/APIC.cphp | Bin 0 -> 160 bytes tests/acpi-test-data/q35/DSDT | Bin 8357 -> 7909 bytes tests/acpi-test-data/q35/DSDT.bridge | Bin 8374 -> 7926 bytes tests/acpi-test-data/q35/DSDT.cphp | Bin 0 -> 9376 bytes tests/acpi-test-data/q35/SRAT.cphp | Bin 0 -> 304 bytes tests/bios-tables-test.c | 67 +++- tests/pc-cpu-test.c | 2 +- trace-events | 13 + 53 files changed, 1622 insertions(+), 453 deletions(-) create mode 100644 hw/acpi/cpu.c delete mode 100644 hw/acpi/cpu_hotplug_acpi_table.c create mode 100644 include/hw/acpi/cpu.h create mode 100644 stubs/pc_madt_cpu_entry.c create mode 100644 tests/acpi-test-data/pc/APIC.cphp create mode 100644 tests/acpi-test-data/pc/DSDT.cphp create mode 100644 tests/acpi-test-data/pc/DSDT.cphp_legacy create mode 100644 tests/acpi-test-data/pc/SRAT.cphp create mode 100644 tests/acpi-test-data/q35/APIC.cphp create mode 100644 tests/acpi-test-data/q35/DSDT.cphp create mode 100644 tests/acpi-test-data/q35/SRAT.cphp -- 1.8.3.1