qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [RFC 00/42] ACPI CPU hotplug refactoring to support more th


From: Igor Mammedov
Subject: [Qemu-devel] [RFC 00/42] ACPI CPU hotplug refactoring to support more than 255 CPUs and PXM/OST methods
Date: Mon, 2 May 2016 14:33:09 +0200

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:
    address@hidden: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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]