• S
    9p: disconnect channel when PCI device is removed · 991ad9ec
    Sasha Levin 提交于
    When a virtio_9p pci device is being removed, we should close down any
    active channels and free up resources, we're not supposed to BUG() if there's
    still an open channel since it's a valid case when removing the PCI device.
    
    Otherwise, removing the PCI device with an open channel would cause the
    following BUG():
    
    [ 1184.671416] ------------[ cut here ]------------
    [ 1184.672057] kernel BUG at net/9p/trans_virtio.c:618!
    [ 1184.672057] invalid opcode: 0000 [#1] PREEMPT SMP
    [ 1184.672057] CPU 3
    [ 1184.672057] Pid: 5, comm: kworker/u:0 Tainted: G        W    3.4.0-rc2-next-20120413-sasha-dirty #76
    [ 1184.672057] RIP: 0010:[<ffffffff825c9116>]  [<ffffffff825c9116>] p9_virtio_remove+0x16/0x90
    [ 1184.672057] RSP: 0018:ffff88000d653ac0  EFLAGS: 00010202
    [ 1184.672057] RAX: ffffffff836bfb40 RBX: ffff88000c9b2148 RCX: ffff88000d658978
    [ 1184.672057] RDX: 0000000000000006 RSI: 0000000000000000 RDI: ffff880028868000
    [ 1184.672057] RBP: ffff88000d653ad0 R08: 0000000000000000 R09: 0000000000000000
    [ 1184.672057] R10: 0000000000000000 R11: 0000000000000001 R12: ffff880028868000
    [ 1184.672057] R13: ffffffff835aa7c0 R14: ffff880041630000 R15: ffff88000d653da0
    [ 1184.672057] FS:  0000000000000000(0000) GS:ffff880035a00000(0000) knlGS:0000000000000000
    [ 1184.672057] CS:  0010 DS: 0000 ES: 0000 CR0: 000000008005003b
    [ 1184.672057] CR2: 0000000001181000 CR3: 000000000eba1000 CR4: 00000000000406e0
    [ 1184.672057] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
    x000000000117a190 *[ 1184.672057] DR3: 00000000000000**
    00 DR6: 00000000ffff0ff0 DR7: 0000000000000400
    [ 1184.672057] Process kworker/u:0 (pid: 5, threadinfo ffff88000d652000, task ffff88000d658000)
    [ 1184.672057] Stack:
    [ 1184.672057]  ffff880028868000 ffffffff836bfb40 ffff88000d653af0 ffffffff8193661b
    [ 1184.672057]  ffff880028868008 ffffffff836bfb40 ffff88000d653b10 ffffffff81af1c81
    [ 1184.672057]  ffff880028868068 ffff880028868008 ffff88000d653b30 ffffffff81af257a
    [ 1184.795301] Call Trace:
    [ 1184.795301]  [<ffffffff8193661b>] virtio_dev_remove+0x1b/0x60
    [ 1184.795301]  [<ffffffff81af1c81>] __device_release_driver+0x81/0xd0
    [ 1184.795301]  [<ffffffff81af257a>] device_release_driver+0x2a/0x40
    [ 1184.795301]  [<ffffffff81af0d48>] bus_remove_device+0x138/0x150
    [ 1184.795301]  [<ffffffff81aef08d>] device_del+0x14d/0x1b0
    [ 1184.795301]  [<ffffffff81aef138>] device_unregister+0x48/0x60
    [ 1184.795301]  [<ffffffff8193694d>] unregister_virtio_device+0xd/0x10
    [ 1184.795301]  [<ffffffff8265fc74>] virtio_pci_remove+0x2a/0x6c
    [ 1184.795301]  [<ffffffff818a95ad>] pci_device_remove+0x4d/0x110
    [ 1184.795301]  [<ffffffff81af1c81>] __device_release_driver+0x81/0xd0
    [ 1184.795301]  [<ffffffff81af257a>] device_release_driver+0x2a/0x40
    [ 1184.795301]  [<ffffffff81af0d48>] bus_remove_device+0x138/0x150
    [ 1184.795301]  [<ffffffff81aef08d>] device_del+0x14d/0x1b0
    [ 1184.795301]  [<ffffffff81aef138>] device_unregister+0x48/0x60
    [ 1184.795301]  [<ffffffff818a36fa>] pci_stop_bus_device+0x6a/0x90
    [ 1184.795301]  [<ffffffff818a3791>] pci_stop_and_remove_bus_device+0x11/0x20
    [ 1184.795301]  [<ffffffff818c21d9>] remove_callback+0x9/0x10
    [ 1184.795301]  [<ffffffff81252d91>] sysfs_schedule_callback_work+0x21/0x60
    [ 1184.795301]  [<ffffffff810cb1a1>] process_one_work+0x281/0x430
    [ 1184.795301]  [<ffffffff810cb140>] ? process_one_work+0x220/0x430
    [ 1184.795301]  [<ffffffff81252d70>] ? sysfs_read_file+0x1c0/0x1c0
    [ 1184.795301]  [<ffffffff810cc613>] worker_thread+0x1f3/0x320
    [ 1184.795301]  [<ffffffff810cc420>] ? manage_workers.clone.13+0x130/0x130
    [ 1184.795301]  [<ffffffff810d30b2>] kthread+0xb2/0xc0
    [ 1184.795301]  [<ffffffff826783f4>] kernel_thread_helper+0x4/0x10
    [ 1184.795301]  [<ffffffff810deb18>] ? finish_task_switch+0x78/0xf0
    [ 1184.795301]  [<ffffffff82676574>] ? retint_restore_args+0x13/0x13
    [ 1184.795301]  [<ffffffff810d3000>] ? kthread_flush_work_fn+0x10/0x10
    [ 1184.795301]  [<ffffffff826783f0>] ? gs_change+0x13/0x13
    [ 1184.795301] Code: c1 9e 0a 00 48 83 c4 08 5b c9 c3 66 2e 0f 1f 84 00 00 00 00 00 55 48 89 e5 41 54 49 89 fc 53 48 8b 9f a8 04 00 00 80 3b 00 74 0a <0f> 0b 0f 1f 84 00 00 00 00 00 48 8b 87 88 04 00 00 ff 50 30 31
    [ 1184.795301] RIP  [<ffffffff825c9116>] p9_virtio_remove+0x16/0x90
    [ 1184.795301]  RSP <ffff88000d653ac0>
    [ 1184.952618] ---[ end trace a307b3ed40206b4c ]---
    Signed-off-by: NSasha Levin <levinsasha928@gmail.com>
    Signed-off-by: NRusty Russell <rusty@rustcorp.com.au>
    991ad9ec
trans_virtio.c 17.5 KB