On Tue, Apr 03, 2012 at 11:48:44PM +0200, Igor Mammedov wrote:
in current code, pci hot-plug gpe event handler is defined as a level one "_L01"
- hw adds device, sets GPE.1 bit and sends SCI
- OSPM gets SCI, reads GPE00.sts and masks GPE.1 bit in GPE00.en
- OSPM executes _L01
- hw adds second device and sets GPE.1 bit but SCI is not asserted since GPE00.en masks event
- OSPM resets GPE.1 bit in GPE00.sts and umasks it in GPE00.en
as result event for step 4 is lost because step 5 clears it and OS will not see added second device.
ACPI 50 spec: 5.6.4 General-Purpose Event Handling defines GPE event handling as following:
- Disables the interrupt source (GPEx_BLK EN bit).
- If an edge event, clears the status bit.
- Performs one of the following:
- Dispatches to an ACPI-aware device driver.
- Queues the matching control method for execution.
- Manages a wake event using device _PRW objects.
- If a level event, clears the status bit.
- Enables the interrupt source.
Switching from level to edge event handler reduces chances to hit race window.
Same applies to cpu-hotplug, so switch it to edge handler as well.
Tested with RHEL6, 3.3.+ kernel, winxp, and w2008r2, and I wasn't able to trigger race after using edge event handler.
Signed-off-by: Igor Mammedov imammedo@redhat.com
Acked-by: Michael S. Tsirkin mst@redhat.com
src/acpi-dsdt.dsl | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index 4e04c48..4bdc268 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -723,11 +723,11 @@ DefinitionBlock ( Method(_L00) { Return(0x01) }
Method(_L01) {
Method(_E01) { // PCI hotplug event Return(\_SB.PCI0.PCNF()) }
Method(_L02) {
Method(_E02) { // CPU hotplug event Return(\_SB.PRSC()) }
-- 1.7.7.6