how CPU hot-plug is suppose to work on Linux?
Hello,
We are trying to add CPU hot-plug/unplug capability to KVM. We want to be able to initiate hot-plug/unplug from a host. Our current schema works like this:
We have Processor object in DSDT for each potentially available CPU. Each Processor object has _MAD, _STA, _EJ0. _MAD of present CPU returns enabled LAPIC structure. _STA of present CPU return 0xf. _MADT of non present CPU returns disabled LAPIC. _STA returns 0x0. _EJ0 does nothing.
When CPU is hot plugged:
1. Bit is set in sts register of gpe
2. acpi interrupt is sent
3. Linux ACPI evaluates corespondent gpe's _L() method
4. _L() method determines which CPU's status is changed
5. For each CPU that changed status from not present to present call Notify(1) to corespondent Processor() object.
When CPU is hot unplugged:
1. Bit is set in sts register of gpe
2. acpi interrupt is sent
3. Linux ACPI evaluates corespondent gpe's _L() method
4. _L() method determines which CPU's status is changed
5. For each CPU that changed status from present to non present call Notify(3) to corespondent Processor() object.
Now, CPU hot plug appears to be working. But CPU hot unplug does nothing. I expect that Linux will offline CPU and eject it after evaluating Notify(3) and seeing that _STA of ejected CPU returns 0x0 now.
Any ideas how it is suppose to work?
--
Gleb.
Quoted 21 lines · On Tuesday 21 September 2010 15:41:09 Gleb Natapov wrote:
Hello,
We are trying to add CPU hot-plug/unplug capability to KVM. We want to be able to initiate hot-plug/unplug from a host. Our current schema works like this:
We have Processor object in DSDT for each potentially available CPU. Each Processor object has
_MAD,_STA,_EJ0._MADof present CPU returns enabled LAPIC structure._STAof present CPU return0xf._MADTof non present CPU returns disabled LAPIC._STAreturns0x0._EJ0does nothing.When CPU is hot plugged:
1. Bit is set in sts register of gpe
2. acpi interrupt is sent
3. Linux ACPI evaluates corespondent gpe's_L()method
4._L()method determines which CPU's status is changed
5. For each CPU that changed status from not present to present call Notify(1) to corespondentProcessor()object.
Quoted 8 lines
When CPU is hot unplugged:
1. Bit is set in sts register of gpe
2. acpi interrupt is sent
3. Linux ACPI evaluates corespondent gpe's_L()method
4._L()method determines which CPU's status is changed
5. For each CPU that changed status from present to non present call Notify(3)
That does not work.
Quoted 8 lines
to corespondent
Processor()object.Now, CPU hot plug appears to be working. But CPU hot unplug does nothing. I expect that Linux will offline CPU and eject it after evaluating Notify(3) and seeing that
_STAof ejected CPU returns0x0now.Any ideas how it is suppose to work?
Put a container device, e.g. ACPI0004 above the CPU objects. and call notify (on remove and add) on it instead of the CPU object itself with e.g.:
#define ACPI_NOTIFY_BUS_CHECK (u8) 0x00
#define ACPI_NOTIFY_DEVICE_CHECK (u8) 0x01
acpi core should go through the devices and call add()/probe() on devices which appear and remove() on devices which _STA method does not return active anymore.
Thomas