• Peter Hurley's avatar
    firewire: ohci: Fix double free_irq() · 247fd50b
    Peter Hurley authored
    A pci device can be removed while in its suspended state.
    Because the ohci driver freed the irq to suspend, free_irq() is
    called twice; once from pci_remove() and again from pci_suspend(),
    which issues the warning below [1].
    
    Rather than allocate the irq in the .enable() path, move the
    allocation to .probe(). Consequently, the irq is not reallocated
    upon pci_resume() and thus is not freed upon pci_suspend().
    
    [1] Warning reported by Mark Einon <mark.einon@gmail.com> when
    suspending an MSI MS-1727 GT740 laptop on Ubuntu 3.5.0-22-generic
    
    WARNING: at ./kernel/irq/manage.c:1198 __free_irq+0xa3/0x1e0()
    Hardware name: MS-1727
    Trying to free already-free IRQ 16
    Modules linked in: ip6table_filter ip6_tables ebtable_nat ebtables <...snip...>
    Pid: 4, comm: kworker/0:0 Tainted: P           O 3.5.0-22-generic #34-Ubuntu
    Call Trace:
     [<ffffffff81051c1f>] warn_slowpath_common+0x7f/0xc0
     [<ffffffff81051d16>] warn_slowpath_fmt+0x46/0x50
     [<ffffffff8103fa39>] ? default_spin_lock_flags+0x9/0x10
     [<ffffffff810df6b3>] __free_irq+0xa3/0x1e0
     [<ffffffff810df844>] free_irq+0x54/0xc0
     [<ffffffffa005a27e>] pci_remove+0x6e/0x210 [firewire_ohci]
     [<ffffffff8135ae7f>] pci_device_remove+0x3f/0x110
     [<ffffffff8141fdbc>] __device_release_driver+0x7c/0xe0
     [<ffffffff8141fe4c>] device_release_driver+0x2c/0x40
     [<ffffffff8141f5f1>] bus_remove_device+0xe1/0x120
     [<ffffffff8141cd1a>] device_del+0x12a/0x1c0
     [<ffffffff8141cdc6>] device_unregister+0x16/0x30
     [<ffffffff81354784>] pci_stop_bus_device+0x94/0xa0
     [<ffffffffa0091c67>] acpiphp_disable_slot+0xb7/0x1a0 [acpiphp]
     [<ffffffffa0090716>] ? get_slot_status+0x46/0xc0 [acpiphp]
     [<ffffffffa0091d7d>] acpiphp_check_bridge.isra.15+0x2d/0xf0 [acpiphp]
     [<ffffffffa0092442>] _handle_hotplug_event_bridge+0x372/0x4d0 [acpiphp]
     [<ffffffff81390f8c>] ? acpi_os_execute_deferred+0x2f/0x34
     [<ffffffff8116e22d>] ? kfree+0xed/0x110
     [<ffffffff8107086a>] process_one_work+0x12a/0x420
     [<ffffffffa00920d0>] ? _handle_hotplug_event_func+0x1d0/0x1d0 [acpiphp]
     [<ffffffff8107141e>] worker_thread+0x12e/0x2f0
     [<ffffffff810712f0>] ? manage_workers.isra.26+0x200/0x200
     [<ffffffff81075f13>] kthread+0x93/0xa0
     [<ffffffff8168d024>] kernel_thread_helper+0x4/0x10
     [<ffffffff81075e80>] ? kthread_freezable_should_stop+0x70/0x70
     [<ffffffff8168d020>] ? gs_change+0x13/0x13
    Reported-by: default avatarMark Einon <mark.einon@gmail.com>
    Signed-off-by: default avatarPeter Hurley <peter@hurleysoftware.com>
    Signed-off-by: default avatarStefan Richter <stefanr@s5r6.in-berlin.de>
    247fd50b
ohci.c 103 KB