2.5.69+bk: "sleeping function called from illegal context" on card release while shutting down
Hi!
Just tried to eject the card while the system was shutting down.
-alex
$ lsmod Module Size Used by pcnet_cs 16100 1 8390 8384 1 pcnet_cs crc32 3744 1 8390 ds 11616 3 pcnet_cs yenta_socket 14240 2 pcmcia_core 53888 3 pcnet_cs,ds,yenta_socket soundcore 6560 0
$ lspci |grep CardBus 00:11.0 CardBus bridge: Texas Instruments PCI1131 (rev 01) 00:11.1 CardBus bridge: Texas Instruments PCI1131 (rev 01)
$ grep PCMCIA .config # Bus options (PCI, PCMCIA, EISA, MCA, ISA) # PCMCIA/CardBus support CONFIG_PCMCIA=m CONFIG_PCMCIA_PROBE=y # CONFIG_PARPORT_PC_PCMCIA is not set # PCMCIA SCSI adapter support # CONFIG_PCMCIA_AHA152X is not set # CONFIG_PCMCIA_FDOMAIN is not set # CONFIG_PCMCIA_NINJA_SCSI is not set # CONFIG_PCMCIA_QLOGIC is not set # PCMCIA network device support CONFIG_NET_PCMCIA=y CONFIG_PCMCIA_3C589=m CONFIG_PCMCIA_3C574=m CONFIG_PCMCIA_FMVJ18X=m CONFIG_PCMCIA_PCNET=m CONFIG_PCMCIA_NMCLAN=m CONFIG_PCMCIA_SMC91C92=m CONFIG_PCMCIA_XIRC2PS=m # CONFIG_PCMCIA_AXNET is not set # PCMCIA character devices
Hw. address read/write mismap 0
Hw. address read/write mismap 1
Hw. address read/write mismap 2
Hw. address read/write mismap 3
Hw. address read/write mismap 4
Hw. address read/write mismap 5
Debug: sleeping function called from illegal context at include/asm/semaphore.h:119
Call Trace: [<c0118bc8>] __might_sleep+0x58/0x70 [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a2d193>] undo_irq+0x23/0x90 [pcmcia_core] [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a302f8>] pcmcia_release_irq+0xb8/0xe0 [pcmcia_core] [<c6a25e00>] pcnet_release+0x0/0x80 [pcnet_cs] [<c6a312d5>] CardServices+0x155/0x260 [pcmcia_core] [<c6a312c9>] CardServices+0x149/0x260 [pcmcia_core] [<c6a25e56>] pcnet_release+0x56/0x80 [pcnet_cs] [<c01224a4>] run_timer_softirq+0xc4/0x1a0 [<c010a8b3>] handle_IRQ_event+0x33/0xf0 [<c011e889>] do_softirq+0xa9/0xb0 [<c010abb5>] do_IRQ+0x125/0x150 [<c01093a8>] common_interrupt+0x18/0x20 [<c01a3dba>] strnlen_user+0x1a/0x40 [<c016fd42>] create_elf_tables+0x2d2/0x360 [<c01706cd>] load_elf_binary+0x4cd/0xba0 [<c0134379>] buffered_rmqueue+0xc9/0x160 [<c0170200>] load_elf_binary+0x0/0xba0 [<c015639b>] search_binary_handler+0xcb/0x2d0 [<c01566f9>] do_execve+0x159/0x1a0 [<c0157d28>] getname+0x78/0xc0 [<c0107a46>] sys_execve+0x36/0x70 [<c0109187>] syscall_call+0x7/0xb
Quoted 20 lines · Alex Riesen
Just tried to eject the card while the system was shutting down.
Debug: sleeping function called from illegal context at
include/asm/semaphore.h:119Call Trace: [<c0118bc8>] __might_sleep+0x58/0x70 [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a2d193>] undo_irq+0x23/0x90 [pcmcia_core] [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a302f8>] pcmcia_release_irq+0xb8/0xe0 [pcmcia_core] [<c6a25e00>] pcnet_release+0x0/0x80 [pcnet_cs] [<c6a312d5>] CardServices+0x155/0x260 [pcmcia_core] [<c6a312c9>] CardServices+0x149/0x260 [pcmcia_core] [<c6a25e56>] pcnet_release+0x56/0x80 [pcnet_cs] [<c01224a4>] run_timer_softirq+0xc4/0x1a0 [<c010a8b3>] handle_IRQ_event+0x33/0xf0 [<c011e889>] do_softirq+0xa9/0xb0 [<c010abb5>] do_IRQ+0x125/0x150 [<c01093a8>] common_interrupt+0x18/0x20 [<c01a3dba>] strnlen_user+0x1a/0x40 [<c016fd42>] create_elf_tables+0x2d2/0x360
Quoted 8 lines
[<c01706cd>] load_elf_binary+0x4cd/0xba0 [<c0134379>] buffered_rmqueue+0xc9/0x160 [<c0170200>] load_elf_binary+0x0/0xba0 [<c015639b>] search_binary_handler+0xcb/0x2d0 [<c01566f9>] do_execve+0x159/0x1a0 [<c0157d28>] getname+0x78/0xc0 [<c0107a46>] sys_execve+0x36/0x70 [<c0109187>] syscall_call+0x7/0xb
Don't know if this is fixed by latest Russell patches, but vanilla and -bk snapshots do *not* contain the latest PCMCIA/CardBus code. Is it possible for you to try 2.5.69-mm4?
Thanks!
Quoted 6 lines · Felipe Alfaro Solana
Quoted 1 line · Alex Riesen
Just tried to eject the card while the system was shutting down.
Don't know if this is fixed by latest Russell patches, but vanilla and -bk snapshots do *not* contain the latest PCMCIA/CardBus code. Is it possible for you to try 2.5.69-mm4?
Russell's patches do not address this.
Individual PCMCIA drivers need to be updated to call thier release function directly when processing a CARD_RELEASE message instead of from a timer procedure.
Similar to this patch for synclink_cs.c:
synclink_cs.c +1 -1
@@ -814,9 +814,9 @@case CS_EVENT_CARD_REMOVAL : link->state &= ~DEV_PRESENT ;if (link->state &DEV_CONFIG ) { ((MGSLPC_INFO *)link->priv)->stop =1 ; -mod_timer (&link->release, jiffies +HZ /20 ); +mgslpc_release ((u_long )link); }break ;case CS_EVENT_CARD_INSERTION : link->state |=DEV_PRESENT |DEV_CONFIG_PENDING ;
The timer link->release is initialized with the release function (in this case mgslpc_release, but called something else in your driver). Now it is called directly.
Signature · 2 lines
Paul Fulghum, [email protected] Microgate Corporation, http://www.microgate.com
Quoted 1 line · Paul Fulghum
Russell's patches do not address this.
In part they do - the patch gives us a guaranteed process context for the pcmcia event stuff. The process context is provided in the right place (core pcmcia code).
Things left in this area are:
- Remove workqueues from socket drivers.
- I'd like to see struct pcmcia_driver expand to include more functions (card removal, insertion, etc) rather than having an event handler.
- Remove the card removal event timers from pcmcia drivers.
Signature · 2 lines
Russell King ([email protected]) The developer of ARM Linux http://www.arm.linux.org.uk/personal/aboutme.html
Paul Fulghum, Tue, May 13, 2003 17:31:01 +0200:
Quoted 6 lines
Quoted 4 lines
Quoted 1 line
Just tried to eject the card while the system was shutting down.
Don't know if this is fixed by latest Russell patches, but vanilla and -bk snapshots do *not* contain the latest PCMCIA/CardBus code. Is it possible for you to try 2.5.69-mm4?
Russell's patches do not address this.
still i'm going to give them a spin a bit later.
Quoted 5 lines
Individual PCMCIA drivers need to be updated to call thier release function directly when processing a
CARD_RELEASEmessage instead of from a timer procedure.Similar to this patch for
synclink_cs.c:
...
synclink_cs.c line 818
Quoted 2 lines
synclink_cs.c +1
-1-mod_timer (&link->release, jiffies +HZ /20 ); +mgslpc_release ((u_long )link);
Tried that. This time the trace looks different:
Debug: sleeping function called from illegal context at include/asm/semaphore.h:119
Call Trace: [<c0118bc8>] __might_sleep+0x58/0x70 [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a2d193>] undo_irq+0x23/0x90 [pcmcia_core] [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a302f8>] pcmcia_release_irq+0xb8/0xe0 [pcmcia_core] [<c6a25e00>] pcnet_release+0x0/0x80 [pcnet_cs] [<c6a312d5>] CardServices+0x155/0x260 [pcmcia_core] [<c6a312c9>] CardServices+0x149/0x260 [pcmcia_core] [<c6a25e56>] pcnet_release+0x56/0x80 [pcnet_cs] [<c01224a4>] run_timer_softirq+0xc4/0x1a0 [<c010a8b3>] handle_IRQ_event+0x33/0xf0 [<c011e889>] do_softirq+0xa9/0xb0 [<c010abb5>] do_IRQ+0x125/0x150 [<c01093a8>] common_interrupt+0x18/0x20 [<c013cfb6>] zap_pte_range+0xd6/0x1d0 [<c013d0f3>] zap_pmd_range+0x43/0x70 [<c013d153>] unmap_page_range+0x33/0x60 [<c013d271>] unmap_vmas+0xf1/0x260 [<c01412d5>] exit_mmap+0x65/0x180 [<c0119196>] mmput+0x56/0xb0 [<c01556ce>] exec_mmap+0xce/0x150 [<c01557e8>] flush_old_exec+0x18/0x830 [<c01555ea>] kernel_read+0x3a/0x50 [<c0170483>] load_elf_binary+0x283/0xba0 [<c01316fd>] generic_file_aio_read+0x3d/0x50 [<c0134379>] buffered_rmqueue+0xc9/0x160 [<c0170200>] load_elf_binary+0x0/0xba0 [<c015639b>] search_binary_handler+0xcb/0x2d0 [<c01566f9>] do_execve+0x159/0x1a0 [<c0157d28>] getname+0x78/0xc0 [<c0107a46>] sys_execve+0x36/0x70 [<c0109187>] syscall_call+0x7/0xb
Quoted 9 lines · Alex Riesen
Paul Fulghum, Tue, May 13, 2003 17:31:01 +0200:
Quoted 1 line
Similar to this patch for
synclink_cs.c:...
synclink_cs.c line 818
Quoted 2 lines
synclink_cs.c +1
-1-mod_timer (&link->release, jiffies +HZ /20 ); +mgslpc_release ((u_long )link);Tried that. This time the trace looks different:
Debug: sleeping function called from illegal context at
include/asm/semaphore.h:119
Quoted 15 lines
Call Trace: [<c0118bc8>] __might_sleep+0x58/0x70 [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a2d193>] undo_irq+0x23/0x90 [pcmcia_core] [<c6a31eb6>] +0x82/0x58c [pcmcia_core] [<c6a302f8>] pcmcia_release_irq+0xb8/0xe0 [pcmcia_core] [<c6a25e00>] pcnet_release+0x0/0x80 [pcnet_cs] [<c6a312d5>] CardServices+0x155/0x260 [pcmcia_core] [<c6a312c9>] CardServices+0x149/0x260 [pcmcia_core] [<c6a25e56>] pcnet_release+0x56/0x80 [pcnet_cs] [<c01224a4>] run_timer_softirq+0xc4/0x1a0 [<c010a8b3>] handle_IRQ_event+0x33/0xf0 [<c011e889>] do_softirq+0xa9/0xb0 [<c010abb5>] do_IRQ+0x125/0x150 [<c01093a8>] common_interrupt+0x18/0x20
Hmmm... the pcnet_release() function is still being called from a timer context.
Looking at pcnet_cs.c I see that in function pcnet_close() that the release function is being being run from
a timer. Try changing that instance to calling pcnet_release() directly as you did in the CS_EVENT handler.
Signature · 2 lines
Paul Fulghum, [email protected] Microgate Corporation, http://www.microgate.com
Alex Riesen, Tue, May 13, 2003 19:21:14 +0200:
Quoted 5 lines
Paul Fulghum, Tue, May 13, 2003 17:31:01 +0200:
Quoted 4 lines
Individual PCMCIA drivers need to be updated to call thier release function directly when processing a
CARD_RELEASEmessage instead of from a timer procedure.
Quoted 7 lines
Quoted 1 line
Similar to this patch for
synclink_cs.c:...
Review
Quoted 2 lines
(quoted diff) +1
-1- mod_timer(&link->release, jiffies + HZ/20); + mgslpc_release((u_long)link);Tried that. This time the trace looks different:
I was probably too fast with the conclusions. It seemed I didn't update modules (though I and bash history distinctly remember doing that).
I cannot reproduce the trace anymore. The patch was:
pcnet_cs.c +1 -1
@@ -848,7 +848,7 @@ static int pcnet_event(event_t event, in link->state &= ~DEV_PRESENT ;if (link->state &DEV_CONFIG ) {netif_device_detach (&info->dev); -mod_timer (&link->release, jiffies +HZ /20 ); +pcnet_release ((u_long )link); }break ;case CS_EVENT_CARD_INSERTION :
Quoted 5 lines · Paul Fulghum
Quoted 3 lines
Don't know if this is fixed by latest Russell patches, but vanilla and -bk snapshots do *not* contain the latest PCMCIA/CardBus code. Is it possible for you to try 2.5.69-mm4?
Russell's patches do not address this.
I knew I were no expert on this... ;-)
Quoted 3 lines
Individual PCMCIA drivers need to be updated to call thier release function directly when processing a
CARD_RELEASEmessage instead of from a timer procedure.
Aha! I got you! Thanks.