Skip to contentSkip to conversation

2.5.69+bk: "sleeping function called from illegal context" on card release while shutting down

DISCUSSION Alex Riesen 4 participants 8 messages May 13, 2003

lore
Share & tools
lore
#0 lore raw

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
#1 lore raw
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: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
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!

#2 lore raw
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
diff -u -4 -r4.9 synclink_cs.c
@@ -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
#3 lore raw
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
#4 lore raw
In reply to Paul Fulghum

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_RELEASE message 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
#5 lore raw
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
#6 lore raw
In reply to Alex Riesen

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_RELEASE message 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:
#7 lore raw
In reply to Paul Fulghum
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_RELEASE message instead of from a timer procedure.

Aha! I got you! Thanks.