OSDN Git Service
(root)
/
uclinux-h8
/
linux.git
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
| inline |
side by side
(parent:
2528ed1
)
icom: fix rmmod crash
author
Breno Leitao
<leitao@linux.vnet.ibm.com>
Sat, 23 May 2009 00:30:39 +0000
(21:30 -0300)
committer
Linus Torvalds
<torvalds@linux-foundation.org>
Sat, 23 May 2009 04:47:52 +0000
(21:47 -0700)
Actually the icom driver is crashing when is being removed because
the driver is kfreeing the adapter structure before calling
pci_release_regions(), which result in the following error:
Unable to handle kernel paging request for data at address 0x6b6b6b6b6b6b6d33
Faulting instruction address: 0xc000000000246b80
Oops: Kernel access of bad area, sig: 11 [#1]
....
[
c000000012d436a0
] [
c0000000001002d0
] .kfree+0x120/0x34c (unreliable)
[
c000000012d43730
] [
c000000000246d60
] .pci_release_selected_regions+0x3c/0x68
[
c000000012d437c0
] [
d000000002d54700
] .icom_kref_release+0xf4/0x118 [icom]
[
c000000012d43850
] [
c000000000232e50
] .kref_put+0x74/0x94
[
c000000012d438d0
] [
d000000002d56c58
] .icom_remove+0x40/0xa4 [icom]
[
c000000012d43960
] [
c000000000249e48
] .pci_device_remove+0x50/0x90
[
c000000012d439e0
] [
c0000000002d68d8
] .__device_release_driver+0x94/0xd4
[
c000000012d43a70
] [
c0000000002d7104
] .driver_detach+0xf8/0x12c
[
c000000012d43b00
] [
c0000000002d549c
] .bus_remove_driver+0xbc/0x11c
[
c000000012d43b90
] [
c0000000002d71dc
] .driver_unregister+0x60/0x80
[
c000000012d43c20
] [
c00000000024a07c
] .pci_unregister_driver+0x44/0xe8
[
c000000012d43cb0
] [
d000000002d56bf4
] .icom_exit+0x1c/0x40 [icom]
[
c000000012d43d30
] [
c000000000095fa8
] .SyS_delete_module+0x214/0x2a8
[
c000000012d43e30
] [
c00000000000852c
] syscall_exit+0x0/0x40
Signed-off-by: Breno Leitao <leitao@linux.vnet.ibm.com>
Cc: stable@kernel.org
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/serial/icom.c
patch
|
blob
|
history
diff --git
a/drivers/serial/icom.c
b/drivers/serial/icom.c
index
6579e2b
..
a461b3b
100644
(file)
--- a/
drivers/serial/icom.c
+++ b/
drivers/serial/icom.c
@@
-1472,8
+1472,8
@@
static void icom_remove_adapter(struct icom_adapter *icom_adapter)
free_irq(icom_adapter->pci_dev->irq, (void *) icom_adapter);
iounmap(icom_adapter->base_addr);
- icom_free_adapter(icom_adapter);
pci_release_regions(icom_adapter->pci_dev);
+ icom_free_adapter(icom_adapter);
}
static void icom_kref_release(struct kref *kref)