Re: [RFC PATCH v3 00/28] ACPI based system device hotplug framework
From: Rafael J. Wysocki
Date: Sun Oct 07 2012 - 17:43:37 EST
Hi,
On Saturday 06 of October 2012 23:27:08 Jiang Liu wrote:
> The patchset is based on "5f3d2f2e1a63679cf1c4a4210f2f1cc2f335bef6"
> from git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
> And you pull the changeset from git://github.com/jiangliu/linux.git acpihp
>
> Modern high-end server may support advanced hotplug features for system
> devices, including physical processor, memory board, IO extension board
> and/or computer node. The ACPI specifications have provided standard
> interfaces between firmware and OS to support device hotplug at runtime.
> This patch series provide an ACPI based hotplug framework to support system
> device hotplug at runtime, which will replace current existing ACPI device
> driver based CPU/memory/CONTAINER hotplug mechanism.
>
> The new ACPI system device hotplug framework has following design goals:
> 1) Provide a mechanism to detect hotplug slots by checking ACPI _EJ0 method,
> ACPI PRCT (platform RAS capabilities table) and other platform specific
> mechanisms.
Which of the patches does that?
> 2) Unify the way to enumerate ACPI based hotplug slots. All hotplug slots
> will be enumerated by the enumeration driver
What is the enumeration driver?
> , instead of by ACPI device drivers.
> 3) Unify the way to handle ACPI hotplug events. All ACPI hotplug events
> for system devices will be handled by a generic ACPI hotplug driver,
> instead of handled by ACPI device drivers.
What are "system devices"
> 4) Solve dependencies among hotplug slots. You need first to remove the
> memory device before removing a physical processor if a hotpluggable memory
> device is connected to a hotpluggable physical processor.
> 5) Provide better error handling and recover.
> 6) Provide interface to cancel ongoing hotplug operations. It may take a
> very long time to remove a memory device, so provide interface to cancel
> the operation. This is important especially for memory hot-removal.
> 7) Support new RAS features, such as socket/memory migration.
> 8) Provide better user interfaces to the hotplug functionalities.
> 9) Trigger hotplug events/operations by software. This feature is useful
> for hardware fault management and power saving.
Well, this may or may not be OK. I'm going to review the patches, but I can't
really say when it's going to happen (not really soon for sure).
> The new ACPI based hotplug framework is modelled after PCI hotplug
> architecture, which uses a hotplug driver to manage hotplug operations
> and different device drivers to manage individual devices.
>
> The new framework contains three main components as follow:
> 1) ACPI system device hotplug slot enumerator, which enumerates all ACPI
> hotplug slots according to platform specific knowledges. And it also
> provides callbacks to control each slot, such as poweron, poweroff,
> get_status etc. Currently there are two built-in methods to detect
> hotplug slots.
> 1.a) Detecting hotplug slot by checking _EJ0 method.
> 1.b) Faking hotplug slot. Use "modprobe acpihp_slot fake_slot=0xnn",
> 0x1 for CONTAINER, 0x2 for memory device, 0x4 for CPU and 0x8 PCI host
> bridge. The fake slot enumerator will treat each assigned ACPI device
> as a hotplug slot, so it could be used for testing on hardware platforms
> without hardware hotplug capabilities.
> 2) ACPI system device hotplug driver, which implements a platform indenpendent
> state machine for hotplug slots and also provides sysfs based user
> interfaces.
> 3) Enhanced ACPI device drivers for CONTAINER, CPU, Memroy and PCI host bridge.
> All logic to handle hotplug events has been moved from these ACPI device
> driver into the hotplug driver. Now these ACPI device dirvers only take
> resposibilities configure/unconfigure corresponding system devices when
> hotplug happens.
>
> Now 1), 2) and part of 2) are ready, we still need to enhance mem_hotplug
> and pci_root drivers to support new hotplug framework.
>
> On my laptop with fake slot enumerator, we got:
> root@cat:/sys/devices/LNXSYSTM:00/acpihp# ls
> CPU00 CPU01 CPU02 CPU03 CPU04 CPU05 CPU06 CPU07 IOX00
> root@cat:/sys/devices/LNXSYSTM:00/acpihp# cd CPU07/
> root@cat:/sys/devices/LNXSYSTM:00/acpihp/CPU07# ls
> capabilities connect device object state subsystem uevent
> configure dependency enable power status type
>
> /* Hot-remove CPU07 */
> root@cat:/sys/devices/LNXSYSTM:00/acpihp/CPU07# echo 0 > enable
> /* Hot-add CPU07 */
> root@cat:/sys/devices/LNXSYSTM:00/acpihp/CPU07# echo 1 > configure
>
> V2->V3 changes:
> 1) Fix minor bugs and refine code
> 2) Implement fake slot enumerator for testing
> 3) Enhance ACPI container driver to support new hotplug framework
> 4) Enhance ACPI processor driver to support new hotplug framework
> 5) Resolve dependencies among slots by evaluating _EDL method.
> TODO:
> 1) Enhance ACPI mem_hotplug driver to support new hotplug framework
> 2) Enhance ACPI pci_root driver to support new PCI host bridge hotplug
> based on Yinghai's work
>
> V1->V2 changes:
> 1) implement the ACPI hotplug driver
> 2) enhance ACPI container driver to support new hotplug framework
> TODO:
> 1) handle ACPI hotplug events in ACPI hotplug driver
> 2) handle dependencies among slots by evaluating ACPI _EDL
> 3) enhance ACPI processor, memory and PCI root drivers to support new
> hotplug framework
> 4) develop an ACPI driver for IOAPIC
> 5) thorough tests:)
>
> Jiang Liu (28):
> ACPIHP: introduce a framework for ACPI based system device hotplug
> ACPIHP: ACPI system device hotplug slot enumerator driver
> ACPIHP: detect ACPI hotplug slots by checking ACPI _EJ0 method
> ACPIHP: implement a fake ACPI system device hotplug slot enumerator
> ACPI: introduce interfaces to manage ACPI device reference count
> ACPIHP: introduce interfaces to scan and walk ACPI devices connecting
> to a slot
> ACPIHP: use klist to manage ACPI devices connecting to a slot
> ACPIHP: add callbacks into acpi_device_ops to support new hotplug
> framework
> ACPIHP: provide interfaces to associate driver specific data with
> slots
> ACPIHP: implement utility functions to support system device hotplug
> ACPIHP: implement skeleton of ACPI system device hotplug driver
> ACPIHP: analyse dependencies among ACPI hotplug slots
> ACPIHP: provide interface to cancel inprogress hotplug operations
> ACPIHP: configure/unconfigure system devices connecting to a hotplug
> slot
> ACPIHP: implement the state machine for ACPI hotplug slots
> ACPIHP: implement sysfs interfaces for ACPI system device hotplug
> ACPIHP: block ACPI device driver unloading when executing hotplug
> operations
> ACPIHP/container: change ACPI container driver to support new hotplug
> framework
> ACPIHP/container: move container.c into drivers/acpi/hotplug
> ACPI/processor: remove dead code from processor_driver.c
> ACPIHP/processor: reorganize ACPI processor driver for new hotplug
> framework
> ACPIHP/processor: protect accesses to device->driver_data
> ACPIHP/processor: enhance processor driver to support new hotplug
> framework
> CPU: introduce busy flag to temporarily disable CPU online sysfs
> interface
> ACPIHP/processor: reject online/offline requests when doing processor
> hotplug
> ACPI/processor: save parsed APIC ID in processor driver data
> structure
> x86: simplify _acpi_map_lsapic()
> ACPI/processor: serialize call to acpi_map/unmap_lsapic
>
> arch/ia64/include/asm/cpu.h | 2 +-
> arch/ia64/kernel/acpi.c | 38 +-
> arch/ia64/kernel/topology.c | 15 +-
> arch/x86/include/asm/cpu.h | 2 +-
> arch/x86/include/asm/mpspec.h | 2 +-
> arch/x86/kernel/acpi/boot.c | 82 +---
> arch/x86/kernel/apic/apic.c | 8 +-
> arch/x86/kernel/topology.c | 10 +-
> drivers/acpi/Kconfig | 69 ++-
> drivers/acpi/Makefile | 3 +-
> drivers/acpi/bus.c | 22 +-
> drivers/acpi/container.c | 296 -----------
> drivers/acpi/hotplug/Makefile | 21 +
> drivers/acpi/hotplug/acpihp.h | 37 ++
> drivers/acpi/hotplug/acpihp_drv.h | 107 ++++
> drivers/acpi/hotplug/cancel.c | 174 +++++++
> drivers/acpi/hotplug/configure.c | 354 ++++++++++++++
> drivers/acpi/hotplug/container.c | 135 +++++
> drivers/acpi/hotplug/core.c | 842 ++++++++++++++++++++++++++++++++
> drivers/acpi/hotplug/dependency.c | 249 ++++++++++
> drivers/acpi/hotplug/device.c | 208 ++++++++
> drivers/acpi/hotplug/drv_main.c | 351 +++++++++++++
> drivers/acpi/hotplug/slot.c | 421 ++++++++++++++++
> drivers/acpi/hotplug/slot_ej0.c | 153 ++++++
> drivers/acpi/hotplug/slot_fake.c | 177 +++++++
> drivers/acpi/hotplug/state_machine.c | 631 ++++++++++++++++++++++++
> drivers/acpi/hotplug/sysfs.c | 245 ++++++++++
> drivers/acpi/internal.h | 7 +
> drivers/acpi/processor_core.c | 26 +-
> drivers/acpi/processor_driver.c | 557 ++++++++++-----------
> drivers/acpi/scan.c | 17 +-
> drivers/base/cpu.c | 22 +
> drivers/gpu/drm/i915/intel_opregion.c | 2 +
> drivers/gpu/drm/nouveau/nouveau_acpi.c | 1 +
> drivers/pci/hotplug/acpiphp_glue.c | 9 +-
> drivers/pci/hotplug/acpiphp_ibm.c | 5 +-
> drivers/pci/hotplug/sgi_hotplug.c | 6 +-
> drivers/platform/x86/thinkpad_acpi.c | 2 +
> drivers/pnp/pnpacpi/core.c | 23 +-
> drivers/xen/cpu_hotplug.c | 2 +-
> include/acpi/acpi_bus.h | 21 +-
> include/acpi/acpi_hotplug.h | 323 ++++++++++++
> include/acpi/container.h | 12 -
> include/acpi/processor.h | 3 +
> include/linux/acpi.h | 2 +-
> include/linux/cpu.h | 2 +
> 46 files changed, 4923 insertions(+), 773 deletions(-)
> delete mode 100644 drivers/acpi/container.c
> create mode 100644 drivers/acpi/hotplug/Makefile
> create mode 100644 drivers/acpi/hotplug/acpihp.h
> create mode 100644 drivers/acpi/hotplug/acpihp_drv.h
> create mode 100644 drivers/acpi/hotplug/cancel.c
> create mode 100644 drivers/acpi/hotplug/configure.c
> create mode 100644 drivers/acpi/hotplug/container.c
> create mode 100644 drivers/acpi/hotplug/core.c
> create mode 100644 drivers/acpi/hotplug/dependency.c
> create mode 100644 drivers/acpi/hotplug/device.c
> create mode 100644 drivers/acpi/hotplug/drv_main.c
> create mode 100644 drivers/acpi/hotplug/slot.c
> create mode 100644 drivers/acpi/hotplug/slot_ej0.c
> create mode 100644 drivers/acpi/hotplug/slot_fake.c
> create mode 100644 drivers/acpi/hotplug/state_machine.c
> create mode 100644 drivers/acpi/hotplug/sysfs.c
> create mode 100644 include/acpi/acpi_hotplug.h
> delete mode 100644 include/acpi/container.h
And I seriously think this is too much material for a single patchset.
Please consider splitting it into smaller and well-documented series of
patches, so that the reviewers can understand things more easily.
Thanks,
Rafael
--
I speak only for myself.
Rafael J. Wysocki, Intel Open Source Technology Center.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/