linux/arch/tile/include/asm
Chris Metcalf 3c5ead52ed arch/tile: fix deadlock bugs in rwlock implementation
The first issue fixed in this patch is that pending rwlock write locks
could lock out new readers; this could cause a deadlock if a read lock was
held on cpu 1, a write lock was then attempted on cpu 2 and was pending,
and cpu 1 was interrupted and attempted to re-acquire a read lock.
The write lock code was modified to not lock out new readers.

The second issue fixed is that there was a narrow race window where a tns
instruction had been issued (setting the lock value to "1") and the store
instruction to reset the lock value correctly had not yet been issued.
In this case, if an interrupt occurred and the same cpu then tried to
manipulate the lock, it would find the lock value set to "1" and spin
forever, assuming some other cpu was partway through updating it.  The fix
is to enforce an interrupt critical section around the tns/store pair.

In addition, this change now arranges to always validate that after
a readlock we have not wrapped around the count of readers, which
is only eight bits.

Since these changes make the rwlock "fast path" code heavier weight,
I decided to move all the rwlock code all out of line, leaving only the
conventional spinlock code with fastpath inlines.  Since the read_lock
and read_trylock implementations ended up very similar, I just expressed
read_lock in terms of read_trylock.

As part of this change I also eliminate support for the now-obsolete
tns_atomic mode.

Signed-off-by: Chris Metcalf <cmetcalf@tilera.com>
2011-03-10 16:10:41 -05:00
..
asm-offsets.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
atomic_32.h arch/tile: Various cleanups. 2010-08-13 08:52:19 -04:00
atomic.h arch/tile: Fix atomic_read() definition to use ACCESS_ONCE 2011-02-25 08:46:38 -05:00
auxvec.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
backtrace.h arch/tile: support new info op generated by compiler 2010-10-15 15:39:25 -04:00
bitops_32.h arch/tile: fix some comments and whitespace 2011-03-10 13:14:03 -05:00
bitops.h bitops: make asm-generic/bitops/find.h more generic 2010-10-09 21:51:44 +02:00
bitsperlong.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
bug.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
bugs.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
byteorder.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
cache.h arch/tile: catch up with section naming convention in 2.6.35 2011-03-01 16:18:52 -05:00
cacheflush.h arch/tile: enhance existing finv_buffer_remote() routine 2011-03-01 16:21:06 -05:00
checksum.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
compat.h arch/tile: Use <asm-generic/syscalls.h> 2010-10-14 14:34:33 -04:00
cputime.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
current.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
delay.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
device.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
div64.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
dma-mapping.h dma-mapping: remove dma_is_consistent API 2010-08-11 08:59:21 -07:00
dma.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
edac.h drivers/edac: provide support for tile architecture 2011-03-10 13:30:14 -05:00
elf.h arch/tile: Miscellaneous cleanup changes. 2010-07-06 13:41:51 -04:00
emergency-restart.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
errno.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
fcntl.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
fixmap.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
ftrace.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
futex.h arch/tile: Miscellaneous cleanup changes. 2010-07-06 13:41:51 -04:00
hardirq.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
hardwall.h arch/tile: Add driver to enable access to the user dynamic network. 2010-07-06 13:34:15 -04:00
highmem.h arch/tile: complete migration to new kmap_atomic scheme 2010-11-01 15:30:36 -04:00
homecache.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
hugetlb.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
hv_driver.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
hw_irq.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
ide.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
io.h pci root complex: support for tile architecture 2010-11-24 13:13:49 -05:00
ioctl.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
ioctls.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
ipc.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
ipcbuf.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
irq_regs.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
irq.h arch/tile: Enable more sophisticated IRQ model for 32-bit chips. 2010-07-06 13:34:01 -04:00
irqflags.h Merge git://git.kernel.org/pub/scm/linux/kernel/git/cmetcalf/linux-tile 2010-10-26 17:25:38 -07:00
Kbuild arch/tile: export <asm/hardwall.h> to userspace 2011-03-01 16:20:23 -05:00
kdebug.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
kexec.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
kmap_types.h arch/tile: complete migration to new kmap_atomic scheme 2010-11-01 15:30:36 -04:00
linkage.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
local.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
memprof.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
mman.h arch/tile: provide a definition of MAP_STACK 2010-10-14 15:09:02 -04:00
mmu_context.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
mmu.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
mmzone.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
module.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
msgbuf.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
mutex.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
opcode_constants_32.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
opcode_constants_64.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
opcode_constants.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
opcode-tile_32.h arch/tile: Shrink the tile-opcode files considerably. 2010-07-06 13:40:56 -04:00
opcode-tile_64.h arch/tile: Shrink the tile-opcode files considerably. 2010-07-06 13:40:56 -04:00
opcode-tile.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
page.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
param.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
pci.h pci root complex: support for tile architecture 2010-11-24 13:13:49 -05:00
percpu.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
pgalloc.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
pgtable_32.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
pgtable.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
poll.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
posix_types.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
processor.h arch/tile: fix some comments and whitespace 2011-03-10 13:14:03 -05:00
ptrace.h arch/tile: bug fix: exec'ed task thought it was still single-stepping 2011-03-01 16:19:58 -05:00
resource.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
scatterlist.h tile: remove unused ISA_DMA_THRESHOLD define 2010-08-11 10:38:06 -04:00
sections.h arch/tile: Miscellaneous cleanup changes. 2010-07-06 13:41:51 -04:00
sembuf.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
setup.h arch/tile: export only COMMAND_LINE_SIZE to userspace. 2010-08-15 12:14:41 -04:00
shmbuf.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
shmparam.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
sigcontext.h arch/tile: Change struct sigcontext to be more useful 2010-09-15 11:16:08 -04:00
sigframe.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
siginfo.h arch/tile: Fix a couple of issues with the COMPAT code for TILE-Gx. 2010-08-13 08:32:21 -04:00
signal.h arch/tile: handle rt_sigreturn() more cleanly 2010-12-17 16:59:29 -05:00
smp.h arch/tile: Enable more sophisticated IRQ model for 32-bit chips. 2010-07-06 13:34:01 -04:00
socket.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
sockios.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
spinlock_32.h arch/tile: fix deadlock bugs in rwlock implementation 2011-03-10 16:10:41 -05:00
spinlock_types.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
spinlock.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
stack.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
stat.h asm-generic/stat.h: support 64-bit file time_t for stat() 2010-11-01 15:31:29 -04:00
statfs.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
string.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
swab.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
syscall.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
syscalls.h arch/tile: Use <asm-generic/syscalls.h> 2010-10-14 14:34:33 -04:00
system.h arch/tile: use extended assembly to inline __mb_incoherent() 2011-03-01 16:20:54 -05:00
termbits.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
termios.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
thread_info.h arch/tile: support 4KB page size as well as 64KB 2011-03-10 13:17:53 -05:00
timex.h arch/tile: fix __ndelay etc to work better 2011-03-01 16:20:04 -05:00
tlb.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
tlbflush.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
topology.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
traps.h arch/tile: enable single-step support for TILE-Gx 2010-10-15 15:38:26 -04:00
types.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
uaccess.h arch/tile: Various cleanups. 2010-08-13 08:52:19 -04:00
ucontext.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
unaligned.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
unistd.h asm-generic/stat.h: support 64-bit file time_t for stat() 2010-11-01 15:31:29 -04:00
user.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00
xor.h arch/tile: core support for Tilera 32-bit chips. 2010-06-04 17:11:18 -04:00