linux/drivers/ieee1394
Stefan Richter 638570b543 ieee1394: raw1394: fix possible deadlock in multithreaded clients
Regression in 2.6.28-rc1:  When I added the new state_mutex which
prevents corruption of raw1394's internal state when accessed by
multithreaded client applications, the following possible though
highly unlikely deadlock slipped in:

Thread A:                  Thread B:
 - acquire mmap_sem         - raw1394_write() or raw1394_ioctl()
 - raw1394_mmap()           - acquire state_mutex
 - acquire state_mutex      - copy_to/from_user(), possible page fault:
                              acquire mmap_sem

The simplest fix is to use mutex_trylock() instead of mutex_lock() in
raw1394_mmap().  This changes the behavior under contention in a way
which is visible to userspace clients.  However, since multithreaded
access was entirely buggy before state_mutex was added and libraw1394's
documentation advised application programmers to use a handle only in a
single thread, this change in behaviour should not be an issue in
practice at all.

Since we have to use mutex_trylock() in raw1394_mmap() regardless
whether /dev/raw1394 was opened with O_NONBLOCK or not, we now use
mutex_trylock() unconditionally everywhere for state_mutex, just to have
consistent behavior.

Reported-by: Johannes Weiner <hannes@saeurebad.de>
Signed-off-by: Stefan Richter <stefanr@s5r6.in-berlin.de>
2008-10-31 08:48:26 +01:00
..
config_roms.c ieee1394: eth1394: don't autoload by hotplug when ohci1394 starts 2007-04-30 00:00:30 +02:00
config_roms.h ieee1394: eth1394: don't autoload by hotplug when ohci1394 starts 2007-04-30 00:00:30 +02:00
csr1212.c ieee1394: Use DIV_ROUND_UP 2008-10-15 22:21:07 +02:00
csr1212.h ieee1394: csr1212: proper refcounting 2007-10-16 23:59:59 +02:00
csr.c ieee1394: be*_add_cpu conversion 2008-04-18 17:55:29 +02:00
csr.h [PATCH] ieee1394: clean up declarations of hpsb_*_config_rom 2006-07-03 12:02:31 -04:00
dma.c ieee1394: dump mmapped iso buffers in core files 2008-07-14 13:06:02 +02:00
dma.h ieee1394: move some comments from declaration to definition 2007-04-30 00:00:28 +02:00
dv1394-private.h [PATCH] ieee1394: dv1394: sem2mutex conversion 2006-07-03 12:02:32 -04:00
dv1394.c ieee1394: dv1394, video1394: remove unnecessary expressions 2008-10-15 22:21:09 +02:00
dv1394.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00
eth1394.c ieee1394: Use DIV_ROUND_UP 2008-10-15 22:21:07 +02:00
eth1394.h ieee1394: eth1394: handle tlabel exhaustion 2007-05-27 23:20:59 +02:00
highlevel.c ieee1394: video1394: reorder module init, prepare BKL removal 2008-07-14 13:06:02 +02:00
highlevel.h ieee1394: video1394: reorder module init, prepare BKL removal 2008-07-14 13:06:02 +02:00
hosts.c ieee1394: struct device - replace bus_id with dev_name(), dev_set_name() 2008-10-31 08:48:25 +01:00
hosts.h ieee1394: remove old isochronous ABI 2007-07-10 00:07:41 +02:00
ieee1394_core.c ieee1394: limit early node speed to host interface speed 2008-04-18 17:55:31 +02:00
ieee1394_core.h ieee1394: remove old isochronous ABI 2007-07-10 00:07:41 +02:00
ieee1394_hotplug.h [PATCH] ieee1394: remove redundant code from ieee1394_hotplug.h 2006-07-03 12:02:30 -04:00
ieee1394_transactions.c ieee1394: remove unused code 2008-01-30 22:22:20 +01:00
ieee1394_transactions.h ieee1394: remove old isochronous ABI 2007-07-10 00:07:41 +02:00
ieee1394_types.h ieee1394: safer definition of empty macros 2006-09-17 19:31:20 +02:00
ieee1394-ioctl.h ieee1394: cycle timer read extension for raw1394 2007-02-17 14:39:33 +01:00
ieee1394.h [PATCH] ieee1394: coding style and comment fixes in midlayer header files 2006-07-03 12:02:28 -04:00
init_ohci1394_dma.c x86: early boot debugging via FireWire (ohci1394_dma=early) 2008-01-30 13:34:11 +01:00
iso.c PAGE_ALIGN(): correctly handle 64-bit values on 32-bit architectures 2008-07-24 10:47:21 -07:00
iso.h ieee1394: rawiso: requeue packet for transmission after skipped cycle 2008-04-25 18:15:45 +02:00
Kconfig ieee1394: Kconfig menu touch-up 2008-06-19 00:12:36 +02:00
Makefile x86: early boot debugging via FireWire (ohci1394_dma=early) 2008-01-30 13:34:11 +01:00
nodemgr.c ieee1394: struct device - replace bus_id with dev_name(), dev_set_name() 2008-10-31 08:48:25 +01:00
nodemgr.h ieee1394: survive a few seconds connection loss 2008-10-15 22:21:09 +02:00
ohci1394.c ieee1394: rawiso: requeue packet for transmission after skipped cycle 2008-04-25 18:15:45 +02:00
ohci1394.h ieee1394: remove old isochronous ABI 2007-07-10 00:07:41 +02:00
pcilynx.c ieee1394: Use shorter list_splice_init() for brevity. 2008-04-18 17:55:30 +02:00
pcilynx.h Remove obsolete #include <linux/config.h> 2006-06-30 19:25:36 +02:00
raw1394-private.h ieee1394: raw1394: replace BKL by local mutex, make ioctl() and mmap() thread-safe 2008-10-15 22:21:08 +02:00
raw1394.c ieee1394: raw1394: fix possible deadlock in multithreaded clients 2008-10-31 08:48:26 +01:00
raw1394.h ieee1394: remove old isochronous ABI 2007-07-10 00:07:41 +02:00
sbp2.c ieee1394: sbp2: enforce s/g segment size limit 2008-10-15 22:21:07 +02:00
sbp2.h ieee1394: sbp2: enforce s/g segment size limit 2008-10-15 22:21:07 +02:00
video1394.c ieee1394: dv1394, video1394: remove unnecessary expressions 2008-10-15 22:21:09 +02:00
video1394.h Linux-2.6.12-rc2 2005-04-16 15:20:36 -07:00