Linus Torvalds
bc08b449ee
lockref: implement lockless reference count updates using cmpxchg()
...
Instead of taking the spinlock, the lockless versions atomically check
that the lock is not taken, and do the reference count update using a
cmpxchg() loop. This is semantically identical to doing the reference
count update protected by the lock, but avoids the "wait for lock"
contention that you get when accesses to the reference count are
contended.
Note that a "lockref" is absolutely _not_ equivalent to an atomic_t.
Even when the lockref reference counts are updated atomically with
cmpxchg, the fact that they also verify the state of the spinlock means
that the lockless updates can never happen while somebody else holds the
spinlock.
So while "lockref_put_or_lock()" looks a lot like just another name for
"atomic_dec_and_lock()", and both optimize to lockless updates, they are
fundamentally different: the decrement done by atomic_dec_and_lock() is
truly independent of any lock (as long as it doesn't decrement to zero),
so a locked region can still see the count change.
The lockref structure, in contrast, really is a *locked* reference
count. If you hold the spinlock, the reference count will be stable and
you can modify the reference count without using atomics, because even
the lockless updates will see and respect the state of the lock.
In order to enable the cmpxchg lockless code, the architecture needs to
do three things:
(1) Make sure that the "arch_spinlock_t" and an "unsigned int" can fit
in an aligned u64, and have a "cmpxchg()" implementation that works
on such a u64 data type.
(2) define a helper function to test for a spinlock being unlocked
("arch_spin_value_unlocked()")
(3) select the "ARCH_USE_CMPXCHG_LOCKREF" config variable in its
Kconfig file.
This enables it for x86-64 (but not 32-bit, we'd need to make sure
cmpxchg() turns into the proper cmpxchg8b in order to enable it for
32-bit mode).
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2013-09-02 12:12:15 -07:00
..
fonts
lib: Move fonts from drivers/video/console/ to lib/fonts/
2013-06-28 10:28:22 +02:00
lz4
lib/lz4: correct the LZ4 license
2013-08-23 09:51:22 -07:00
lzo
lib/lzo: Update LZO compression to current upstream version
2013-02-20 19:36:01 +01:00
mpi
alpha: Modernize lib/mpi/longlong.h
2013-07-19 13:54:23 -07:00
raid6
lib/raid6: build proper files on corresponding arch
2012-12-13 19:51:04 +11:00
reed_solomon
xz
decompressors: fix typo "POWERPC"
2013-03-13 15:21:48 -07:00
zlib_deflate
zlib_inflate
.gitignore
argv_split.c
argv_split(): teach it to handle mutable strings
2013-04-29 18:28:19 -07:00
asn1_decoder.c
Nothing all that exciting; a new module-from-fd syscall for those who want
2012-12-19 07:55:08 -08:00
atomic64.c
lib: atomic64: Initialize locks statically to fix early users
2012-12-20 13:50:16 -08:00
atomic64_test.c
audit.c
average.c
bcd.c
bch.c
bitmap.c
bitrev.c
bsearch.c
btree.c
bug.c
taint: add explicit flag to show whether lock dep is still OK.
2013-01-21 17:17:57 +10:30
build_OID_registry
X.509: do not emit any informational output
2013-06-19 17:54:06 +02:00
bust_spinlocks.c
printk: Provide a wake_up_klogd() off-case
2013-03-22 16:41:20 -07:00
check_signature.c
checksum.c
asm-generic headers: Allow yet more arch overrides in checksum.h
2013-02-11 20:00:33 +05:30
clz_ctz.c
lib: add weak clz/ctz functions
2013-07-09 10:33:30 -07:00
clz_tab.c
cmdline.c
cordic.c
cpu-notifier-error-inject.c
cpu_rmap.c
lib: cpu_rmap: avoid flushing all workqueues
2013-01-11 14:54:54 -08:00
cpumask.c
bootmem: fix wrong call parameter for free_bootmem()
2012-12-11 17:22:28 -08:00
crc-ccitt.c
crc-itu-t.c
crc-t10dif.c
Revert "crypto: crct10dif - Wrap crc_t10dif function all to use crypto transform framework"
2013-07-24 17:04:16 +10:00
crc7.c
crc8.c
crc16.c
crc32.c
crc32defs.h
ctype.c
debug_locks.c
mutex: Add support for wound/wait style locks
2013-06-26 12:10:56 +02:00
debugobjects.c
hlist: drop the node parameter from iterators
2013-02-27 19:10:24 -08:00
dec_and_lock.c
decompress.c
lib: add support for LZ4-compressed kernel
2013-07-09 10:33:30 -07:00
decompress_bunzip2.c
decompress_inflate.c
decompress_unlz4.c
lib: add support for LZ4-compressed kernel
2013-07-09 10:33:30 -07:00
decompress_unlzma.c
decompress_unlzo.c
lib/lzo: Rename lzo1x_decompress.c to lzo1x_decompress_safe.c
2013-02-20 19:36:00 +01:00
decompress_unxz.c
devres.c
lib/devres.c: fix misplaced #endif
2013-02-27 19:10:09 -08:00
digsig.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
2013-02-21 08:18:12 -08:00
div64.c
Revert "math64: New div64_u64_rem helper"
2013-04-30 19:13:05 +02:00
dma-debug.c
dma-debug: update DMA debug API to better handle multiple mappings of a buffer
2013-03-22 16:41:20 -07:00
dump_stack.c
dump_stack: serialize the output from dump_stack()
2013-07-03 16:07:41 -07:00
dynamic_debug.c
dynamic_debug: reuse generic string_unescape function
2013-04-30 17:04:03 -07:00
dynamic_queue_limits.c
earlycpio.c
kernel: delete __cpuinit usage from all core kernel files
2013-07-14 19:36:59 -04:00
extable.c
fault-inject.c
debugfs: add get/set for atomic types
2013-06-03 13:55:01 -07:00
fdt.c
fdt_ro.c
fdt_rw.c
fdt_strerror.c
fdt_sw.c
fdt_wip.c
find_last_bit.c
find_next_bit.c
flex_array.c
flex_proportions.c
gcd.c
gen_crc32table.c
genalloc.c
genalloc: add devres support, allow to find a managed pool by device
2013-04-29 18:28:13 -07:00
halfmd4.c
hexdump.c
dynamic_debug: dynamic hex dump
2013-01-17 12:19:09 -08:00
hweight.c
idr.c
idr: print a stack dump after ida_remove warning
2013-07-03 16:08:04 -07:00
inflate.c
int_sqrt.c
lib/int_sqrt.c: optimize square root algorithm
2013-04-29 18:28:19 -07:00
interval_tree.c
interval_tree_test_main.c
random32: rename random32 to prandom
2012-12-17 17:15:26 -08:00
iomap.c
iomap_copy.c
iommu-helper.c
ioremap.c
iovec.c
Hoist memcpy_fromiovec/memcpy_toiovec into lib/
2013-05-20 10:24:22 +09:30
irq_regs.c
is_single_threaded.c
jedec_ddr_data.c
kasprintf.c
Kconfig
lockref: implement lockless reference count updates using cmpxchg()
2013-09-02 12:12:15 -07:00
Kconfig.debug
kernel: delete __cpuinit usage from all core kernel files
2013-07-14 19:36:59 -04:00
Kconfig.kgdb
treewide: Fix typo in printk
2013-06-18 13:48:45 +02:00
Kconfig.kmemcheck
kfifo.c
kfifo: fix kfifo_alloc() and kfifo_init()
2013-02-27 19:10:23 -08:00
klist.c
klist: del waiter from klist_remove_waiters before wakeup waitting process
2013-05-21 10:16:39 -07:00
kobject.c
kobject: sanitize argument for format string
2013-06-07 16:05:50 -07:00
kobject_uevent.c
kstrtox.c
kstrto*: add documentation
2012-12-17 17:15:22 -08:00
kstrtox.h
lcm.c
libcrc32c.c
list_debug.c
list_sort.c
lib/: rename random32() to prandom_u32()
2013-04-29 18:28:42 -07:00
llist.c
llist: fix/simplify llist_add() and llist_add_batch()
2013-07-13 13:29:24 +04:00
locking-selftest-hardirq.h
locking-selftest-mutex.h
locking-selftest-rlock-hardirq.h
locking-selftest-rlock-softirq.h
locking-selftest-rlock.h
locking-selftest-rsem.h
locking-selftest-softirq.h
locking-selftest-spin-hardirq.h
locking-selftest-spin-softirq.h
locking-selftest-spin.h
locking-selftest-wlock-hardirq.h
locking-selftest-wlock-softirq.h
locking-selftest-wlock.h
locking-selftest-wsem.h
locking-selftest.c
mutex: Move ww_mutex definitions to ww_mutex.h
2013-07-12 12:07:46 +02:00
lockref.c
lockref: implement lockless reference count updates using cmpxchg()
2013-09-02 12:12:15 -07:00
lru_cache.c
lru_cache: introduce lc_get_cumulative()
2013-03-22 22:17:36 -06:00
Makefile
lockref: uninline lockref helper functions
2013-09-02 11:58:20 -07:00
md5.c
memory-notifier-error-inject.c
memweight.c
net_utils.c
net: core: move mac_pton() to lib/net_utils.c
2013-06-05 12:00:27 -07:00
nlattr.c
notifier-error-inject.c
mode_t, whack-a-mole at 11...
2013-04-09 14:13:05 -04:00
notifier-error-inject.h
of-reconfig-notifier-error-inject.c
powerpc+of: Rename and fix OF reconfig notifier error inject module
2012-12-14 10:32:52 +11:00
oid_registry.c
Give the OID registry file module info to avoid kernel tainting
2013-05-05 14:38:00 -07:00
parser.c
lib/parser.c: fix up comments for valid return values from match_number
2013-02-21 17:22:25 -08:00
pci_iomap.c
percpu-refcount.c
percpu-refcount: use RCU-sched insted of normal RCU
2013-06-16 16:12:26 -07:00
percpu-rwsem.c
percpu_rw_semaphore: add lockdep annotations
2012-12-17 17:15:18 -08:00
percpu_counter.c
kernel: delete __cpuinit usage from all core kernel files
2013-07-14 19:36:59 -04:00
plist.c
pm-notifier-error-inject.c
prio_heap.c
proportions.c
radix-tree.c
random32.c
prandom: introduce prandom_bytes() and prandom_bytes_state()
2012-12-17 17:15:26 -08:00
ratelimit.c
rational.c
rbtree.c
lib/rbtree.c: avoid the use of non-static __always_inline
2013-01-11 14:54:56 -08:00
rbtree_test.c
rbtree_test: add __init/__exit annotations
2013-04-30 17:04:07 -07:00
reciprocal_div.c
rwsem-spinlock.c
rwsem: simplify __rwsem_do_wake
2013-05-07 07:20:16 -07:00
rwsem.c
rwsem: check counter to avoid cmpxchg calls
2013-05-07 16:11:51 -07:00
scatterlist.c
lib/scatterlist: error handling in __sg_alloc_table()
2013-07-09 10:33:31 -07:00
sha1.c
show_mem.c
mm, show_mem: suppress page counts in non-blockable contexts
2013-04-29 15:54:28 -07:00
smp_processor_id.c
sort.c
spinlock_debug.c
stmp_device.c
string.c
string_helpers.c
lib/string_helpers: introduce generic string_unescape
2013-04-30 17:04:03 -07:00
strncpy_from_user.c
strnlen_user.c
swiotlb.c
x86, kdump: Set crashkernel_low automatically
2013-04-17 12:35:32 -07:00
syscall.c
test-kstrtox.c
test-string_helpers.c
lib/string_helpers: introduce generic string_unescape
2013-04-30 17:04:03 -07:00
textsearch.c
timerqueue.c
ts_bm.c
ts_fsm.c
ts_kmp.c
ucs2_string.c
Move utf16 functions to kernel core and rename
2013-04-15 21:23:03 +01:00
usercopy.c
Kconfig: consolidate CONFIG_DEBUG_STRICT_USER_COPY_CHECKS
2013-04-30 17:04:09 -07:00
uuid.c
uuid: use prandom_bytes()
2013-04-29 18:28:42 -07:00
vsprintf.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
2013-07-09 18:24:39 -07:00