public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [2.6.9-rc3-bk1] Sleeping function called from invalid context
@ 2004-10-01 20:35 Marcel Sebek
  2004-10-02  3:56 ` Andrew Morton
  0 siblings, 1 reply; 4+ messages in thread
From: Marcel Sebek @ 2004-10-01 20:35 UTC (permalink / raw)
  To: linux-kernel

I upgraded from 2.6.8-rc2-bk10.
When I run pppd, a lot of debug messages are typed out.
pppd uses /dev/ttyUSB0 as serial device (driver ftdi_sio).

My .config is at http://wremcont.mysteria.cz/config-2.6.9-rc3-bk1
Kernel debug output is at http://wremcont.mysteria.cz/messages-2.6.9-rc3-bk1


lsusb:
Bus 001 Device 002: ID 0403:6001 Future Technology Devices International, Ltd 8-bit FIFO
Bus 001 Device 001: ID 0000:0000


lspci:
0000:00:00.0 Host bridge: VIA Technologies, Inc. VT8363/8365 [KT133/KM133] (rev 02)
0000:00:01.0 PCI bridge: VIA Technologies, Inc. VT8363/8365 [KT133/KM133 AGP]
0000:00:07.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 22)
0000:00:07.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 10)
0000:00:07.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 10)
0000:00:07.4 Host bridge: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 30)
0000:00:07.5 Multimedia audio controller: VIA Technologies, Inc. VT82C686 AC97 Audio Controller (rev 20)
0000:01:00.0 VGA compatible controller: ATI Technologies Inc Rage 128 Pro Ultra TF


-- 
Marcel Sebek
jabber: sebek@jabber.cz                     ICQ: 279852819
linux user number: 307850                 GPG ID: 5F88735E
GPG FP: 0F01 BAB8 3148 94DB B95D  1FCA 8B63 CA06 5F88 735E


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [2.6.9-rc3-bk1] Sleeping function called from invalid context
  2004-10-01 20:35 [2.6.9-rc3-bk1] Sleeping function called from invalid context Marcel Sebek
@ 2004-10-02  3:56 ` Andrew Morton
  2004-10-02 19:08   ` Linus Torvalds
  0 siblings, 1 reply; 4+ messages in thread
From: Andrew Morton @ 2004-10-02  3:56 UTC (permalink / raw)
  To: Marcel Sebek; +Cc: linux-kernel, Alan Cox

sebek64@post.cz (Marcel Sebek) wrote:
>
> I upgraded from 2.6.8-rc2-bk10.
>  When I run pppd, a lot of debug messages are typed out.
>  pppd uses /dev/ttyUSB0 as serial device (driver ftdi_sio).
> 
>  My .config is at http://wremcont.mysteria.cz/config-2.6.9-rc3-bk1
>  Kernel debug output is at http://wremcont.mysteria.cz/messages-2.6.9-rc3-bk1

OK, we have a problem.

Debug: sleeping function called from invalid context at mm/slab.c:2052
in_atomic():1, irqs_disabled():1
[__might_sleep+180/224] __might_sleep+0xb4/0xe0
[pg0+273102006/1069224960] hcd_submit_urb+0x106/0x190 [usbcore]
[kmem_cache_alloc+91/96] kmem_cache_alloc+0x5b/0x60
[pg0+273105606/1069224960] usb_control_msg+0x36/0xa0 [usbcore]
[pg0+272960692/1069224960] ftdi_set_termios+0x144/0x5f0 [ftdi_sio]
[pg0+273029492/1069224960] serial_set_termios+0x44/0xa0 [usbserial]
[tty_wait_until_sent+215/240] tty_wait_until_sent+0xd7/0xf0
[change_termios+480/528] change_termios+0x1e0/0x210
[set_termios+227/288] set_termios+0xe3/0x120
[tty_ioctl+1025/1248] tty_ioctl+0x401/0x4e0
[sys_ioctl+233/608] sys_ioctl+0xe9/0x260
[sysenter_past_esp+82/113] sysenter_past_esp+0x52/0x71
bad: scheduling while atomic!

In rc3 change_termios() was altered so that it calls
(*tty->driver->set_termios)() under spin_lock_irqsave(tty_termios_lock).

But ftdi_set_termios() wants to perform USB I/O, which involves sleeping
allocations all over the place.

There may be other ->set_termios() implementations which want to sleep, too.

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [2.6.9-rc3-bk1] Sleeping function called from invalid context
  2004-10-02 19:08   ` Linus Torvalds
@ 2004-10-02 18:57     ` Alan Cox
  0 siblings, 0 replies; 4+ messages in thread
From: Alan Cox @ 2004-10-02 18:57 UTC (permalink / raw)
  To: Linus Torvalds; +Cc: Andrew Morton, Marcel Sebek, Linux Kernel Mailing List

On Sad, 2004-10-02 at 20:08, Linus Torvalds wrote:
> We might be able to change it to a per-tty semaphore instead, which sounds 
> reasonably safe, but in the meantime I don't think we have any other 
> choice than to just leave the driver/ldisc routines unprotected. They 
> should be just reading the state, after all.

Yep - already discussed on the linux-kernel and linux-usb lists. You can
do it with a semaphore. Its currently in testing. The USB drivers need
to sleep in order to handle the fact that their change is an
asynchronous message.

We do actually have to lock it or some drivers crash when you do the
fork 100 processes and all keep doing termios stuff attack.

Will send you a patch once its finished the test runs

Alan


^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [2.6.9-rc3-bk1] Sleeping function called from invalid context
  2004-10-02  3:56 ` Andrew Morton
@ 2004-10-02 19:08   ` Linus Torvalds
  2004-10-02 18:57     ` Alan Cox
  0 siblings, 1 reply; 4+ messages in thread
From: Linus Torvalds @ 2004-10-02 19:08 UTC (permalink / raw)
  To: Andrew Morton; +Cc: Marcel Sebek, linux-kernel, Alan Cox



On Fri, 1 Oct 2004, Andrew Morton wrote:
> 
> In rc3 change_termios() was altered so that it calls
> (*tty->driver->set_termios)() under spin_lock_irqsave(tty_termios_lock).
> 
> But ftdi_set_termios() wants to perform USB I/O, which involves sleeping
> allocations all over the place.

Alan, my first reaction was "that's just a buggy driver", but looking at 
the reason for it (telling the device at the other end to change it's 
speed), it's clearly not the driver. The new spinlock is just wrong.

We might be able to change it to a per-tty semaphore instead, which sounds 
reasonably safe, but in the meantime I don't think we have any other 
choice than to just leave the driver/ldisc routines unprotected. They 
should be just reading the state, after all.

I'm committing this temporary fix..

		Linus
----
===== drivers/char/tty_ioctl.c 1.13 vs edited =====
--- 1.13/drivers/char/tty_ioctl.c	2004-09-29 14:27:20 -07:00
+++ edited/drivers/char/tty_ioctl.c	2004-10-02 12:06:40 -07:00
@@ -145,6 +145,13 @@
 			wake_up_interruptible(&tty->link->read_wait);
 		}
 	}
+
+	/*
+	 * Fixme! We should really try to protect the driver and ldisc
+	 * termios usage too. But they need to be able to sleep, so
+	 * the global termios spinlock is not the right thing.
+	 */
+	spin_unlock_irqrestore(&tty_termios_lock, flags);
 	   
 	if (tty->driver->set_termios)
 		(*tty->driver->set_termios)(tty, &old_termios);
@@ -155,7 +162,6 @@
 			(ld->set_termios)(tty, &old_termios);
 		tty_ldisc_deref(ld);
 	}
-	spin_unlock_irqrestore(&tty_termios_lock, flags);
 }
 
 static int set_termios(struct tty_struct * tty, void __user *arg, int opt)

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2004-10-02 20:00 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-10-01 20:35 [2.6.9-rc3-bk1] Sleeping function called from invalid context Marcel Sebek
2004-10-02  3:56 ` Andrew Morton
2004-10-02 19:08   ` Linus Torvalds
2004-10-02 18:57     ` Alan Cox

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox