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 <[email protected] >
Signed-off-by: Linus Torvalds <[email protected] >
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
digiFep1.h
digiPCI.h
ds1286.c
ds1302.c
ds1620.c
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
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
lcd.h
lp.c
Makefile
[PATCH] powerpc: console_initcall ordering issues
2006-06-10 11:02:05 -07:00
mbcs.c
mbcs.h
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
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
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
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