projects
/
openwrt
/
staging
/
blogic.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
9a92841
)
virtio_console: Don't access uninitialized data.
author
Sjur Brændeland
<sjur.brandeland@stericsson.com>
Mon, 21 Jan 2013 23:20:26 +0000
(09:50 +1030)
committer
Rusty Russell
<rusty@rustcorp.com.au>
Thu, 7 Feb 2013 01:07:37 +0000
(11:37 +1030)
Don't access uninitialized work-queue when removing device.
The work queue is initialized only if the device multi-queue.
So don't call cancel_work unless this is a multi-queue device.
This fixes the following panic:
Kernel panic - not syncing: BUG!
Call Trace:
62031b28
: [<
6026085d
>] panic+0x16b/0x2d3
62031b30
: [<
6004ef5e
>] flush_work+0x0/0x1d7
62031b60
: [<
602606f2
>] panic+0x0/0x2d3
62031b68
: [<
600333b0
>] memcpy+0x0/0x140
62031b80
: [<
6002d58a
>] unblock_signals+0x0/0x84
62031ba0
: [<
602609c5
>] printk+0x0/0xa0
62031bd8
: [<
60264e51
>] __mutex_unlock_slowpath+0x13d/0x148
62031c10
: [<
6004ef5e
>] flush_work+0x0/0x1d7
62031c18
: [<
60050234
>] try_to_grab_pending+0x0/0x17e
62031c38
: [<
6004e984
>] get_work_gcwq+0x71/0x8f
62031c48
: [<
60050539
>] __cancel_work_timer+0x5b/0x115
62031c78
: [<
628acc85
>] unplug_port+0x0/0x191 [virtio_console]
62031c98
: [<
6005061c
>] cancel_work_sync+0x12/0x14
62031ca8
: [<
628ace96
>] virtcons_remove+0x80/0x15c [virtio_console]
62031ce8
: [<
628191de
>] virtio_dev_remove+0x1e/0x7e [virtio]
62031d08
: [<
601cf242
>] __device_release_driver+0x75/0xe4
62031d28
: [<
601cf2dd
>] device_release_driver+0x2c/0x40
62031d48
: [<
601ce0dd
>] driver_unbind+0x7d/0xc6
62031d88
: [<
601cd5d9
>] drv_attr_store+0x27/0x29
62031d98
: [<
60115f61
>] sysfs_write_file+0x100/0x14d
62031df8
: [<
600b737d
>] vfs_write+0xcb/0x184
62031e08
: [<
600b58b8
>] filp_close+0x88/0x94
62031e38
: [<
600b7686
>] sys_write+0x59/0x88
62031e88
: [<
6001ced1
>] handle_syscall+0x5d/0x80
62031ea8
: [<
60030a74
>] userspace+0x405/0x531
62031f08
: [<
600d32cc
>] sys_dup+0x0/0x5e
62031f28
: [<
601b11d6
>] strcpy+0x0/0x18
62031f38
: [<
600be46c
>] do_execve+0x10/0x12
62031f48
: [<
600184c7
>] run_init_process+0x43/0x45
62031fd8
: [<
60019a91
>] new_thread_handler+0xba/0xbc
Signed-off-by: Sjur Brændeland <sjur.brandeland@stericsson.com>
Cc: stable@kernel.org
Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
drivers/char/virtio_console.c
patch
|
blob
|
history
diff --git
a/drivers/char/virtio_console.c
b/drivers/char/virtio_console.c
index 684b0d53764f38d218b8cff41d5a9e0c3e248979..ee4dbeafb377c5a7786e97372962db2a05904427 100644
(file)
--- a/
drivers/char/virtio_console.c
+++ b/
drivers/char/virtio_console.c
@@
-2062,7
+2062,8
@@
static void virtcons_remove(struct virtio_device *vdev)
/* Disable interrupts for vqs */
vdev->config->reset(vdev);
/* Finish up work that's lined up */
- cancel_work_sync(&portdev->control_work);
+ if (use_multiport(portdev))
+ cancel_work_sync(&portdev->control_work);
list_for_each_entry_safe(port, port2, &portdev->ports, list)
unplug_port(port);