linux/drivers/char
Paul Mackerras 289a1e995e [PATCH] Fix for the PPTP hangs that have been reported
People have been reporting that PPP connections over ptys, such as
used with PPTP, will hang randomly when transferring large amounts of
data, for instance in http://bugzilla.kernel.org/show_bug.cgi?id=6530.
I have managed to reproduce the problem, and the patch below fixes the
actual cause.

The problem is not in fact in ppp_async.c but in n_tty.c.  What
happens is that when pptp reads from the pty, we call read_chan() in
drivers/char/n_tty.c on the master side of the pty.  That copies all
the characters out of its buffer to userspace and then calls
check_unthrottle(), which calls the pty unthrottle routine, which
calls tty_wakeup on the slave side, which calls ppp_asynctty_wakeup,
which calls tasklet_schedule.  So far so good.  Since we are in
process context, the tasklet runs immediately and calls
ppp_async_process(), which calls ppp_async_push, which calls the
tty->driver->write function to send some more output.

However, tty->driver->write() returns zero, because the master
tty->receive_room is still zero.  We haven't returned from
check_unthrottle() yet, and read_chan() only updates tty->receive_room
_after_ calling check_unthrottle.  That means that the driver->write
call in ppp_async_process() returns 0.  That would be fine if we were
going to get a subsequent wakeup call, but we aren't (we just had it,
and the buffer is now empty).

The solution is for n_tty.c to update tty->receive_room _before_
calling the driver unthrottle routine.  The patch below does this.
With this patch I was able to transfer a 900MB file over a PPTP
connection (taking about 25 minutes), whereas without the patch the
connection would always stall in under a minute.

Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2006-06-11 20:40:39 -07:00
..
agp [AGPGART] VIA PT880 Ultra support. 2006-05-22 13:56:02 -04:00
drm drm: possible cleanups 2006-04-23 18:26:40 +10:00
ftape drivers/char/ftape/lowlevel/fdc-io.c: Correct a comment 2006-03-26 19:18:07 +02:00
ip2 Merge with git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git 2006-02-03 23:49:49 +01:00
ipmi [PATCH] IPMI: reserve I/O ports separately 2006-05-31 16:27:10 -07:00
mwave [PATCH] fix array overrun in drivers/char/mwave/mwavedd.c 2006-04-28 08:33:46 -07:00
pcmcia [PATCH] pcmcia: fix zeroing of cm4000_cs.c data 2006-06-02 00:57:31 +02:00
rio [PATCH] Final rio polish 2006-05-15 11:20:57 -07:00
tpm [PATCH] tpm: more bios log parsing fixes 2006-05-31 16:27:10 -07:00
watchdog [WATCHDOG] s3c2410_wdt.c stop watchdog after boot 2006-05-15 21:38:14 +02:00
.gitignore gitignore: misc files 2006-01-01 22:21:50 +01:00
amiserial.c [PATCH] kill _INLINE_ 2006-03-23 07:38:16 -08:00
applicom.c [PATCH] Wrong out of range check in drivers/char/applicom.c 2006-04-11 06:18:46 -07:00
applicom.h
cd1865.h
ChangeLog
consolemap.c [PATCH] kfree cleanup: drivers/char 2005-11-07 07:54:02 -08:00
cp437.uni
cs5535_gpio.c [PATCH] cs5535_gpio.c: call cdev_del() during module_exit to unmap kobject references and other cleanups 2006-04-20 07:54:03 -07:00
cyclades.c [PATCH] new tty buffering locking fix 2006-02-03 08:32:09 -08:00
decserial.c
defkeymap.c_shipped
defkeymap.map
digi.h
digi1.h [PATCH] Clean up the old digi support and rescue it 2005-09-07 16:57:20 -07:00
digiFep1.h [PATCH] Clean up the old digi support and rescue it 2005-09-07 16:57:20 -07:00
digiPCI.h
ds1286.c
ds1302.c
ds1620.c [PATCH] char/ds1620: use msleep() instead of schedule_timeout() 2005-06-25 16:24:57 -07:00
dsp56k.c [PATCH] m68k: dsp56k __user annotations 2006-01-12 09:09:04 -08:00
dtlk.c [PATCH] Remove extraneous \n in doubletalk init printk. 2006-04-11 06:18:41 -07:00
ec3104_keyb.c
efirtc.c
epca.c BUG_ON() Conversion in drivers/char 2006-03-26 18:17:21 +02:00
epca.h [PATCH] epca iomem annotations + several missing readw() 2005-09-16 10:38:10 -07:00
epcaconfig.h
esp.c [PATCH] Fix locking error in esp 2006-02-14 10:01:39 -08:00
generic_nvram.c [PATCH] powerpc: Kill _machine and hard-coded platform numbers 2006-03-28 23:15:54 +11:00
generic_serial.c [PATCH] sem2mutex: serial ->port_write_mutex 2006-03-23 07:38:14 -08:00
genrtc.c [PATCH] genrtc: fix read on 64-bit platforms 2006-05-01 18:17:47 -07:00
hangcheck-timer.c [PATCH] s390: hangcheck timer support 2006-02-01 08:53:24 -08:00
hpet.c [PATCH] HPET: handle multiple ACPI EXTENDED_IRQ resources 2006-02-14 16:09:34 -08:00
hvc_console.c [PATCH] powerpc: hvc_console updates 2006-03-28 16:45:26 +11:00
hvc_console.h [PATCH] powerpc: hvc_console updates 2006-03-28 16:45:26 +11:00
hvc_rtas.c [PATCH] powerpc: add hvc backend for rtas 2006-03-28 16:45:28 +11:00
hvc_vio.c [PATCH] powerpc: hvc_console updates 2006-03-28 16:45:26 +11:00
hvcs.c [PATCH] powerpc/pseries: Change H_StudlyCaps to H_SHOUTING_CAPS 2006-04-01 22:36:57 +11:00
hvsi.c [PATCH] drivers/char: Use ARRAY_SIZE macro 2006-01-10 08:01:56 -08:00
hw_random.c [PATCH] Add missing ifdef for VIA RNG code 2006-03-03 21:05:58 -05:00
i8k.c [PATCH] I8K: fix /proc reporting of blank service tags 2005-11-12 11:42:32 -08:00
ip27-rtc.c
isicom.c [PATCH] char/isicom: More whitespaces and coding style 2006-01-10 08:02:01 -08:00
istallion.c [PATCH] drivers/char/[i]stallion: Clean up kmalloc usage 2006-03-31 12:18:56 -08:00
ite_gpio.c
Kconfig [PATCH] Final rio polish 2006-05-15 11:20:57 -07:00
keyboard.c Input: allow using several chords for braille 2006-04-26 00:14:10 -04:00
lcd.c Resurrect Cobalt support for 2.6. 2005-10-29 19:30:42 +01:00
lcd.h Resurrect Cobalt support for 2.6. 2005-10-29 19:30:42 +01:00
lp.c [PATCH] Driver Core: fix up all callers of class_device_create() 2005-10-28 09:52:52 -07:00
Makefile [PATCH] powerpc: console_initcall ordering issues 2006-06-10 11:02:05 -07:00
mbcs.c [IA64] mbcs_init() should give up unless running on sn2 2005-10-04 09:39:18 -07:00
mbcs.h [PATCH] mbcs trivial user annotations 2005-05-04 07:33:13 -07:00
mem.c [PATCH] splice: add ->splice_write support for /dev/null 2006-04-26 14:40:08 +02:00
misc.c [PATCH] mark f_ops const in the inode 2006-03-28 09:16:05 -08:00
mmtimer.c [IA64] SGI SN drivers: don't report !sn2 hardware as an error 2006-03-07 15:27:59 -08:00
moxa.c [PATCH] moxa serial: add proper capability check 2006-01-10 09:45:36 -08:00
mxser.c [PATCH] Remove MODULE_PARM 2006-03-25 08:22:52 -08:00
mxser.h [PATCH] Typo fixes 2006-03-28 09:16:08 -08:00
n_hdlc.c [PATCH] n_hdlc.c: remove unused declaration 2006-01-10 08:02:00 -08:00
n_r3964.c [PATCH] TTY layer buffering revamp 2006-01-10 08:01:59 -08:00
n_tty.c [PATCH] Fix for the PPTP hangs that have been reported 2006-06-11 20:40:39 -07:00
nvram.c [PATCH] drivers/char: Use ARRAY_SIZE macro 2006-01-10 08:01:56 -08:00
nwbutton.c
nwbutton.h
nwflash.c [PATCH] sem2mutex: drivers/char/ 2006-03-23 07:38:11 -08:00
ppdev.c [PATCH] parport: move PP_MAJOR from ppdev.h to major.h 2006-03-25 08:22:53 -08:00
pty.c [PATCH] TTY layer buffering revamp 2006-01-10 08:01:59 -08:00
qtronix.c qtronix.c: Handle kmalloc failure. 2005-10-29 19:30:55 +01:00
qtronixmap.c_shipped
qtronixmap.map
random.c [IPV6]: Unexport secure_ipv6_port_ephemeral 2006-04-09 22:29:17 -07:00
raw.c [PATCH] sem2mutex: drivers: raw, connector, dcdbas, ppp_generic 2006-03-23 07:38:10 -08:00
riscom8.c [PATCH] Remove MODULE_PARM 2006-03-25 08:22:52 -08:00
riscom8.h
riscom8_reg.h
rocket.c [PATCH] Fix RocketPort driver 2006-02-03 08:31:59 -08:00
rocket.h
rocket_int.h [PATCH] drivers/char/rocket.c: cleanups 2005-06-25 16:25:04 -07:00
rtc.c [PATCH] Allow reading CMOS day of week register 2006-01-11 18:42:10 -08:00
s3c2410-rtc.c [PATCH] handle errors returned by platform_get_irq*() 2006-03-20 13:42:57 -08:00
scan_keyb.c
scan_keyb.h
scc.h [PATCH] m68k: static vs. extern in scc.h 2006-01-12 09:09:00 -08:00
scx200_gpio.c
selection.c [PATCH] TTY layer buffering revamp 2006-01-10 08:01:59 -08:00
ser_a2232.c [PATCH] sem2mutex: serial ->port_write_mutex 2006-03-23 07:38:14 -08:00
ser_a2232.h
ser_a2232fw.ax
ser_a2232fw.h
serial167.c [PATCH] remove unused tmp_buf_sem's 2006-01-14 10:41:42 -08:00
snsc.c [PATCH] Altix snsc: duplicate kobject fix 2006-04-22 09:19:53 -07:00
snsc.h [IA64-SGI] Handle SC env. powerdown events 2006-01-26 13:32:26 -08:00
snsc_event.c [PATCH] snsc kmalloc2kzalloc 2006-03-23 07:38:15 -08:00
sonypi.c [PATCH] sonypi: correct detection of new ICH7-based laptops 2006-04-20 07:54:04 -07:00
specialix.c [PATCH] remove unused tmp_buf_sem's 2006-01-14 10:41:42 -08:00
specialix_io8.h
stallion.c [PATCH] drivers/char/[i]stallion: Clean up kmalloc usage 2006-03-31 12:18:56 -08:00
sx.c [PATCH] sem2mutex: serial ->port_write_mutex 2006-03-23 07:38:14 -08:00
sx.h
sxboards.h
sxwindow.h
synclink.c [PATCH] Typo fixes 2006-03-28 09:16:08 -08:00
synclink_gt.c [PATCH] synclink_gt: remove uneeded async code 2006-03-28 09:16:02 -08:00
synclinkmp.c [PATCH] s/;;/;/g 2006-03-24 07:33:24 -08:00
sysrq.c [PATCH] sysrq cleanup 2006-03-25 08:22:52 -08:00
tb0219.c [PATCH] tb0219: convert to the new platform device interface 2006-03-22 07:53:56 -08:00
tipar.c [PATCH] tipar oops fix 2006-04-28 08:33:46 -07:00
tlclk.c [PATCH] MPBL0010 driver sysfs permissions wide open 2006-04-11 06:18:43 -07:00
toshiba.c [PATCH] remove ISA legacy functions: drivers/char/toshiba.c 2006-03-24 07:33:19 -08:00
tty_io.c [PATCH] tty_insert_flip_string_flags() license fix 2006-05-23 10:35:31 -07:00
tty_ioctl.c [PATCH] coverity: tty_ldisc_ref return null check 2005-06-28 21:20:34 -07:00
vc_screen.c [PATCH] fix ia64 compile failure with gcc4.1 2005-12-29 10:19:21 -08:00
viocons.c [PATCH] powerpc: remove bitfields from HvLpEvent 2006-01-12 20:09:29 +11:00
viotape.c [PATCH] changing CONFIG_LOCALVERSION rebuilds too much, for no good reason 2005-11-09 07:55:57 -08:00
vme_scc.c [PATCH] sem2mutex: serial ->port_write_mutex 2006-03-23 07:38:14 -08:00
vr41xx_giu.c [PATCH] vr41xx: convert to the new platform device interface 2006-03-22 07:53:56 -08:00
vt.c [PATCH] revert "swsusp add check for suspension of X controlled devices" 2006-05-31 16:27:11 -07:00
vt_ioctl.c [PATCH] Only disallow _setting_ of function key string 2005-11-07 07:53:39 -08:00