original_kernel/drivers
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
..
acorn
acpi [PATCH] powernow-k8 crash workaround 2006-06-10 11:02:05 -07:00
amba
atm
base [PATCH] revert "swsusp add check for suspension of X controlled devices" 2006-05-31 16:27:11 -07:00
block
bluetooth
cdrom
char [PATCH] Fix for the PPTP hangs that have been reported 2006-06-11 20:40:39 -07:00
connector
cpufreq
crypto
dio
edac
eisa
fc4
firmware
hwmon
i2c [PATCH] scx200_acb: fix section mismatch warning 2006-05-26 11:55:46 -07:00
ide [PATCH] sgiioc4: use mmio ops instead of port io 2006-05-31 16:27:11 -07:00
ieee1394 [PATCH] sbp2: fix check of return value of hpsb_allocate_and_register_addrspace() 2006-06-05 12:29:16 -07:00
infiniband IPoIB: Fix AH leak at interface down 2006-06-05 09:51:36 -07:00
input Input: psmouse - DMI updates for lifebook protocol 2006-05-29 23:31:12 -04:00
isdn
leds
macintosh
mca
md [PATCH] md: Fix badness in sysfs_notify caused by md_new_event 2006-05-31 16:27:11 -07:00
media [PATCH] V4L/DVB (4045): Fixes recursive dependency for I2C 2006-05-24 18:48:28 -07:00
message Merge master.kernel.org:/pub/scm/linux/kernel/git/davem/sparc-2.6 2006-06-10 11:03:51 -07:00
mfd
misc
mmc [MMC] Prevent au1xmmc.c breakage on non-Au1200 Alchemy 2006-06-04 17:40:58 +01:00
mtd
net [TG3]: Handle Sun onboard tg3 chips more correctly. 2006-06-09 12:03:51 -07:00
nubus
oprofile
parisc
parport
pci [PATCH] PCI: reverse pci config space restore order 2006-06-11 14:02:27 -07:00
pcmcia [PATCH] pcmcia: missing pcmcia_get_socket() result check 2006-06-02 00:56:17 +02:00
pnp
rapidio
rtc [PATCH] m48t86: ia64 build fix 2006-06-05 12:29:17 -07:00
s390 [PATCH] s390: cio non-unique path group ids 2006-06-05 12:29:16 -07:00
sbus
scsi [PATCH] sata_sil24: SII3124 sata driver endian problem 2006-06-05 12:29:17 -07:00
serial [PATCH] ppc32 CPM_UART: various fixes for pq2 uart users 2006-05-26 22:38:56 +10:00
sh
sn
spi [PATCH] s3c24xx: fix spi driver with CONFIG_PM 2006-05-26 11:55:46 -07:00
tc
telephony
usb
video [PATCH] fbcon: fix limited scroll in SCROLL_PAN_REDRAW mode 2006-06-08 15:12:21 -07:00
w1
zorro
Kconfig
Makefile