• Alex Chiang's avatar
    PCI: acpiphp: cleanup notify handler on all root bridges · a13307ce
    Alex Chiang authored
    During the development of the physical PCI slot patch series, Gary Hade
    kept on reporting strange oopses due to interactions between pci_slot
    and acpiphp.
    
    	http://lkml.org/lkml/2007/11/28/319
    
    find_root_bridges() unconditionally installs
    handle_hotplug_event_bridge() as an ACPI_SYSTEM_NOTIFY handler for all
    root bridges.
    
    However, during module cleanup, remove_bridge() will only remove the
    notify handler iff the root bridge had a hot-pluggable slot directly
    underneath. That is:
    
    	root bridge -> hotplug slot
    
    But, if the topology looks like either of the following:
    
    	root bridge -> non-hotplug slot
    	root bridge -> p2p bridge -> hotplug slot
    
    Then we currently do not remove the notify handler from that root
    bridge.
    
    This can cause a kernel oops if we modprobe acpiphp later and it gets
    loaded somewhere else in memory. If the root bridge then receives a
    hotplug event, it will then attempt to call a stale, non-existent notify
    handler and we blow up.
    
    Much thanks goes to Gary Hade for his persistent debugging efforts.
    Signed-off-by: default avatarAlex Chiang <achiang@hp.com>
    Signed-off-by: default avatarGary Hade <garyhade@us.ibm.com>
    Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
    a13307ce
acpiphp_glue.c 44.6 KB