linux/drivers
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
..
acorn [PATCH] ARM: switch fd1772.c from sleep_on to wait_event 2005-08-07 14:23:42 +01:00
acpi [PATCH] Fix CONFIG_ACPI_BLACKLIST_YEAR 2005-09-09 10:45:35 -07:00
atm [ATM]: Fix dereference of uninitialized pointer in zatm 2005-09-02 12:18:03 -07:00
base [SCSI] Re-do "final klist fixes" 2005-09-07 18:44:33 -07:00
block [PATCH] USB: URB_ASYNC_UNLINK flag removed from the kernel 2005-09-08 16:23:04 -07:00
bluetooth [Bluetooth]: Move packet type into the SKB control buffer 2005-08-29 15:55:13 -07:00
cdrom Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6 2005-09-07 17:31:27 -07:00
char [PATCH] pty_chars_in_buffer oops fix 2005-09-09 13:57:31 -07:00
cpufreq [CPUFREQ] Bugfix: Call driver exit in cpufreq_add_dev error path 2005-08-31 22:21:28 -07:00
crypto [CRYPTO] Update IV correctly for Padlock CBC encryption 2005-07-06 13:54:09 -07:00
dio [PATCH] Driver Core: drivers/base - drivers/i2c/chips/adm1026.c: update device attribute callbacks 2005-06-20 15:15:32 -07:00
eisa [PATCH] Driver Core: drivers/base - drivers/i2c/chips/adm1026.c: update device attribute callbacks 2005-06-20 15:15:32 -07:00
fc4 [SCSI] fc4 warning fix 2005-07-30 09:47:53 -05:00
firmware [PATCH] dcdbas: add Dell Systems Management Base Driver with sysfs support 2005-09-07 16:57:27 -07:00
hwmon [PATCH] hwmon: (3/3) pc87360 driver update 2005-09-05 09:26:55 -07:00
i2c Merge master.kernel.org:/home/rmk/linux-2.6-i2c manually 2005-09-08 15:43:09 -07:00
ide Merge master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-for-linus-2.6 2005-09-07 17:31:27 -07:00
ieee1394 [PATCH] provide MODALIAS= enviroment variable to autoload ieee1394 modules via udev 2005-09-07 16:57:41 -07:00
infiniband [PATCH] PCI: remove CONFIG_PCI_NAMES 2005-09-08 14:57:23 -07:00
input [PATCH] Input: Add a new switch event type 2005-09-07 16:57:54 -07:00
isdn [PATCH] -Wundef fixes (hisax) 2005-09-07 17:17:33 -07:00
macintosh [PATCH] swsusp: switch pm_message_t to struct 2005-09-05 00:06:16 -07:00
mca [PATCH] unexport mca_find_device_by_slot 2005-06-25 16:24:56 -07:00
md [PATCH] kill bio->bi_set 2005-09-07 16:57:20 -07:00
media [PATCH] DVB: lgdt330x check callback fix 2005-09-07 16:58:02 -07:00
message Merge by hand (conflicts in sd.c) 2005-09-06 17:52:54 -05:00
mfd [MFD] Add SA11x0 MCP platform device support 2005-08-18 10:10:46 +01:00
misc [SERIAL] Update ibmasm driver for death of register_serial&co 2005-09-07 21:37:00 +01:00
mmc [MMC] Add mmc_detect_change() delay support for PXAMCI driver 2005-09-08 22:48:16 +01:00
mtd [PATCH] detect soft lockups 2005-09-07 16:57:17 -07:00
net Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6 2005-09-08 17:21:02 -07:00
nubus
oprofile [PATCH] clean up inline static vs static inline 2005-07-27 16:26:20 -07:00
parisc [PATCH] acpi bridge hotadd: ACPI based root bridge hot-add 2005-06-27 21:52:39 -07:00
parport [PATCH] PCI: remove pci_find_device from parport_pc.c 2005-09-08 14:57:25 -07:00
pci Merge master.kernel.org:/pub/scm/linux/kernel/git/paulus/ppc64-2.6 2005-09-09 10:38:02 -07:00
pcmcia [PATCH] yenta: make ToPIC95 bridges work with 16bit cards 2005-09-07 16:57:21 -07:00
pnp Merge linux-2.6 with linux-acpi-2.6 2005-09-08 01:45:47 -04:00
s390 [PATCH] s390: claw driver fixes 2005-09-06 22:15:20 -04:00
sbus [SPARC64]: Use drivers/Kconfig 2005-08-30 21:46:19 -07:00
scsi [libata] minor fixes 2005-09-08 23:07:29 -04:00
serial [PATCH] txx9 serial update 2005-09-09 13:57:27 -07:00
sh [PATCH] Driver Core: drivers/s390/net/qeth_sys.c - drivers/usb/gadget/pxa2xx_udc.c: update device attribute callbacks 2005-06-20 15:15:35 -07:00
sn [PATCH] ioc4: PCI bus speed detection 2005-06-21 18:46:32 -07:00
tc
telephony [PATCH] pcmcia: remove references to pcmcia/version.h 2005-07-07 18:24:07 -07:00
usb Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6 2005-09-08 17:21:02 -07:00
video [PATCH] Separate pci bits out of struct device_node 2005-09-09 22:11:38 +10:00
w1 [PATCH] w1_ds2433: Added crc16 protection and read caching. 2005-09-08 14:41:27 -07:00
zorro [PATCH] Driver Core: drivers/usb/input/aiptek.c - drivers/zorro/zorro-sysfs.c: update device attribute callbacks 2005-06-20 15:15:35 -07:00
Kconfig [MFD] Add multimedia communication port core support 2005-08-18 10:06:59 +01:00
Makefile Auto-update from upstream 2005-08-29 17:02:17 -04:00