kernel-ark/drivers/char
Jason Baron ff55fe2075 [PATCH] pty_chars_in_buffer oops fix
The idea of this patch is to lock both sides of a ptmx/pty pair during line
discipline changing.  This is needed to ensure that say a poll on one side of
the pty doesn't occur while the line discipline is actively being changed.
This resulted in an oops reported on lkml, see:

	http://marc.theaimsgroup.com/?l=linux-kernel&m=111342171410005&w=2

A 'hacky' approach was previously implmemented which served to eliminate the
poll vs.  line discipline changing race.  However, this patch takes a more
general approach to the issue.  The patch only adds locking on a less often
used path, the line-discipline changing path, as opposed to locking the
ptmx/pty pair on read/write/poll paths.

The patch below, takes both ldisc locks in either order b/c the locks are both
taken under the same spinlock().  I thought about locking the ptmx/pty
separately, such as master always first but that introduces a 3 way deadlock.
For example, process 1 does a blocking read on the slave side.  Then, process
2 does an ldisc change on the slave side, which acquires the master ldisc lock
but not the slave's.  Finally, process 3 does a write which blocks on the
process 2's ldisc reference.

This patch does introduce some changes in semantics.  For example, a line
discipline change on side 'a' of a ptmx/pty pair, will now wait for a
read/write to complete on the other side, or side 'b'.  The current behavior
is to simply wait for any read/writes on only side 'a', not both sides 'a' and
'b'.  I think this behavior makes sense, but I wanted to point it out.

I've tested the patch with a bunch of read/write/poll while changing the line
discipline out from underneath.

This patch obviates the need for the above "hide the problem" patch.

Signed-off-by: Jason Baron <jbaron@redhat.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-09-09 13:57:31 -07:00
..
agp [AGPGART] Remove trailing space before \n 2005-09-01 10:50:13 -07:00
drm [PATCH] PCI: remove CONFIG_PCI_NAMES 2005-09-08 14:57:23 -07:00
ftape
ip2
ipmi Merge linux-2.6 with linux-acpi-2.6 2005-09-08 01:45:47 -04:00
mwave [SERIAL] Convert mwave to use serial8250_(un)?register_port 2005-08-31 22:19:33 +01:00
pcmcia
rio
tpm Merge linux-2.6 with linux-acpi-2.6 2005-09-08 01:45:47 -04:00
watchdog Merge watchdog driver updates 2005-09-05 06:00:45 -07:00
amiserial.c
applicom.c
applicom.h
cd1865.h
ChangeLog
consolemap.c
cp437.uni
cyclades.c
decserial.c
defkeymap.c_shipped
defkeymap.map
digi1.h [PATCH] Clean up the old digi support and rescue it 2005-09-07 16:57:20 -07:00
digi.h
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
dsp56k.c
dtlk.c
ec3104_keyb.c
efirtc.c
epca.c [PATCH] Clean up the old digi support and rescue it 2005-09-07 16:57:20 -07:00
epca.h [PATCH] Clean up the old digi support and rescue it 2005-09-07 16:57:20 -07:00
epcaconfig.h
esp.c
generic_nvram.c
generic_serial.c
genrtc.c
hangcheck-timer.c
hpet.c Merge linux-2.6 with linux-acpi-2.6 2005-09-08 01:45:47 -04:00
hvc_console.c
hvc_vio.c [PATCH] Make MODULE_DEVICE_TABLE work for vio devices 2005-08-30 13:31:56 +10:00
hvcs.c [PATCH] Make MODULE_DEVICE_TABLE work for vio devices 2005-08-30 13:31:56 +10:00
hvsi.c
hw_random.c
i8k.c
ip2.c
ip2main.c [PATCH] gratuitous includes of asm/serial.h 2005-09-09 10:31:58 -07:00
ip27-rtc.c
isicom.c
istallion.c
ite_gpio.c
Kconfig [PATCH] gratuitous includes of asm/serial.h 2005-09-09 10:31:58 -07:00
keyboard.c
lcd.c
lcd.h
lp.c
Makefile
mbcs.c [PATCH] drivers: convert kcalloc to kzalloc 2005-09-07 16:57:46 -07:00
mbcs.h
mem.c [PATCH] remove a dead extern in mem.c 2005-09-07 16:57:23 -07:00
misc.c [PATCH] move m68k rtc drivers over to initcalls 2005-09-07 16:57:23 -07:00
mmtimer.c
moxa.c [SERIAL] Fix moxa tty driver name 2005-09-03 16:26:49 +01:00
mxser.c [MOXA]: Fix this driver properly. 2005-09-05 23:30:15 -07:00
mxser.h
n_hdlc.c
n_r3964.c
n_tty.c
nvram.c
nwbutton.c
nwbutton.h
nwflash.c
ppdev.c
pty.c [PATCH] pty_chars_in_buffer oops fix 2005-09-09 13:57:31 -07:00
qtronix.c
qtronixmap.c_shipped
qtronixmap.map
random.c [RANDOM]: Introduce secure_dccp_sequence_number 2005-08-29 15:49:40 -07:00
raw.c
riscom8_reg.h
riscom8.c
riscom8.h
rocket_int.h
rocket.c
rocket.h
rtc.c [RTC]: Use SA_SHIRQ in sparc specific code. 2005-09-05 23:33:05 -07:00
s3c2410-rtc.c
scan_keyb.c
scan_keyb.h
scc.h
scx200_gpio.c
selection.c
ser_a2232.c
ser_a2232.h
ser_a2232fw.ax
ser_a2232fw.h
serial167.c
snsc_event.c [IA64-SGI] fix unaligned memory access in snsc_event.c 2005-08-15 14:17:49 -07:00
snsc.c
snsc.h
sonypi.c [PATCH] sonypi: remove obsolete event 2005-09-07 16:57:24 -07:00
specialix_io8.h
specialix.c
stallion.c
sx.c
sx.h
sxboards.h
sxwindow.h
synclink.c
synclinkmp.c [PATCH] gratuitous includes of asm/serial.h 2005-09-09 10:31:58 -07:00
sysrq.c
tb0219.c
tipar.c
toshiba.c
tty_io.c [PATCH] pty_chars_in_buffer oops fix 2005-09-09 13:57:31 -07:00
tty_ioctl.c
vc_screen.c
viocons.c
viotape.c [PATCH] Make MODULE_DEVICE_TABLE work for vio devices 2005-08-30 13:31:56 +10:00
vme_scc.c
vr41xx_giu.c
vr41xx_rtc.c
vt_ioctl.c
vt.c [PATCH] vt: fix possible memory corruption in complement_pos 2005-09-07 16:57:36 -07:00