diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-03 15:57:53 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-03 15:57:53 -0400 |
commit | 776edb59317ada867dfcddde40b55648beeb0078 (patch) | |
tree | f6a6136374642323cfefd7d6399ea429f9018ade /kernel/locking | |
parent | 59a3d4c3631e553357b7305dc09db1990aa6757c (diff) | |
parent | 3cf2f34e1a3d4d5ff209d087925cf950e52f4805 (diff) |
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip into next
Pull core locking updates from Ingo Molnar:
"The main changes in this cycle were:
- reduced/streamlined smp_mb__*() interface that allows more usecases
and makes the existing ones less buggy, especially in rarer
architectures
- add rwsem implementation comments
- bump up lockdep limits"
* 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (33 commits)
rwsem: Add comments to explain the meaning of the rwsem's count field
lockdep: Increase static allocations
arch: Mass conversion of smp_mb__*()
arch,doc: Convert smp_mb__*()
arch,xtensa: Convert smp_mb__*()
arch,x86: Convert smp_mb__*()
arch,tile: Convert smp_mb__*()
arch,sparc: Convert smp_mb__*()
arch,sh: Convert smp_mb__*()
arch,score: Convert smp_mb__*()
arch,s390: Convert smp_mb__*()
arch,powerpc: Convert smp_mb__*()
arch,parisc: Convert smp_mb__*()
arch,openrisc: Convert smp_mb__*()
arch,mn10300: Convert smp_mb__*()
arch,mips: Convert smp_mb__*()
arch,metag: Convert smp_mb__*()
arch,m68k: Convert smp_mb__*()
arch,m32r: Convert smp_mb__*()
arch,ia64: Convert smp_mb__*()
...
Diffstat (limited to 'kernel/locking')
-rw-r--r-- | kernel/locking/lockdep_internals.h | 6 | ||||
-rw-r--r-- | kernel/locking/rwsem-xadd.c | 49 |
2 files changed, 52 insertions, 3 deletions
diff --git a/kernel/locking/lockdep_internals.h b/kernel/locking/lockdep_internals.h index 4f560cfedc8f..51c4b24b6328 100644 --- a/kernel/locking/lockdep_internals.h +++ b/kernel/locking/lockdep_internals.h | |||
@@ -54,9 +54,9 @@ enum { | |||
54 | * table (if it's not there yet), and we check it for lock order | 54 | * table (if it's not there yet), and we check it for lock order |
55 | * conflicts and deadlocks. | 55 | * conflicts and deadlocks. |
56 | */ | 56 | */ |
57 | #define MAX_LOCKDEP_ENTRIES 16384UL | 57 | #define MAX_LOCKDEP_ENTRIES 32768UL |
58 | 58 | ||
59 | #define MAX_LOCKDEP_CHAINS_BITS 15 | 59 | #define MAX_LOCKDEP_CHAINS_BITS 16 |
60 | #define MAX_LOCKDEP_CHAINS (1UL << MAX_LOCKDEP_CHAINS_BITS) | 60 | #define MAX_LOCKDEP_CHAINS (1UL << MAX_LOCKDEP_CHAINS_BITS) |
61 | 61 | ||
62 | #define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5) | 62 | #define MAX_LOCKDEP_CHAIN_HLOCKS (MAX_LOCKDEP_CHAINS*5) |
@@ -65,7 +65,7 @@ enum { | |||
65 | * Stack-trace: tightly packed array of stack backtrace | 65 | * Stack-trace: tightly packed array of stack backtrace |
66 | * addresses. Protected by the hash_lock. | 66 | * addresses. Protected by the hash_lock. |
67 | */ | 67 | */ |
68 | #define MAX_STACK_TRACE_ENTRIES 262144UL | 68 | #define MAX_STACK_TRACE_ENTRIES 524288UL |
69 | 69 | ||
70 | extern struct list_head all_lock_classes; | 70 | extern struct list_head all_lock_classes; |
71 | extern struct lock_chain lock_chains[]; | 71 | extern struct lock_chain lock_chains[]; |
diff --git a/kernel/locking/rwsem-xadd.c b/kernel/locking/rwsem-xadd.c index 1d66e08e897d..b4219ff87b8c 100644 --- a/kernel/locking/rwsem-xadd.c +++ b/kernel/locking/rwsem-xadd.c | |||
@@ -12,6 +12,55 @@ | |||
12 | #include <linux/export.h> | 12 | #include <linux/export.h> |
13 | 13 | ||
14 | /* | 14 | /* |
15 | * Guide to the rw_semaphore's count field for common values. | ||
16 | * (32-bit case illustrated, similar for 64-bit) | ||
17 | * | ||
18 | * 0x0000000X (1) X readers active or attempting lock, no writer waiting | ||
19 | * X = #active_readers + #readers attempting to lock | ||
20 | * (X*ACTIVE_BIAS) | ||
21 | * | ||
22 | * 0x00000000 rwsem is unlocked, and no one is waiting for the lock or | ||
23 | * attempting to read lock or write lock. | ||
24 | * | ||
25 | * 0xffff000X (1) X readers active or attempting lock, with waiters for lock | ||
26 | * X = #active readers + # readers attempting lock | ||
27 | * (X*ACTIVE_BIAS + WAITING_BIAS) | ||
28 | * (2) 1 writer attempting lock, no waiters for lock | ||
29 | * X-1 = #active readers + #readers attempting lock | ||
30 | * ((X-1)*ACTIVE_BIAS + ACTIVE_WRITE_BIAS) | ||
31 | * (3) 1 writer active, no waiters for lock | ||
32 | * X-1 = #active readers + #readers attempting lock | ||
33 | * ((X-1)*ACTIVE_BIAS + ACTIVE_WRITE_BIAS) | ||
34 | * | ||
35 | * 0xffff0001 (1) 1 reader active or attempting lock, waiters for lock | ||
36 | * (WAITING_BIAS + ACTIVE_BIAS) | ||
37 | * (2) 1 writer active or attempting lock, no waiters for lock | ||
38 | * (ACTIVE_WRITE_BIAS) | ||
39 | * | ||
40 | * 0xffff0000 (1) There are writers or readers queued but none active | ||
41 | * or in the process of attempting lock. | ||
42 | * (WAITING_BIAS) | ||
43 | * Note: writer can attempt to steal lock for this count by adding | ||
44 | * ACTIVE_WRITE_BIAS in cmpxchg and checking the old count | ||
45 | * | ||
46 | * 0xfffe0001 (1) 1 writer active, or attempting lock. Waiters on queue. | ||
47 | * (ACTIVE_WRITE_BIAS + WAITING_BIAS) | ||
48 | * | ||
49 | * Note: Readers attempt to lock by adding ACTIVE_BIAS in down_read and checking | ||
50 | * the count becomes more than 0 for successful lock acquisition, | ||
51 | * i.e. the case where there are only readers or nobody has lock. | ||
52 | * (1st and 2nd case above). | ||
53 | * | ||
54 | * Writers attempt to lock by adding ACTIVE_WRITE_BIAS in down_write and | ||
55 | * checking the count becomes ACTIVE_WRITE_BIAS for successful lock | ||
56 | * acquisition (i.e. nobody else has lock or attempts lock). If | ||
57 | * unsuccessful, in rwsem_down_write_failed, we'll check to see if there | ||
58 | * are only waiters but none active (5th case above), and attempt to | ||
59 | * steal the lock. | ||
60 | * | ||
61 | */ | ||
62 | |||
63 | /* | ||
15 | * Initialize an rwsem: | 64 | * Initialize an rwsem: |
16 | */ | 65 | */ |
17 | void __init_rwsem(struct rw_semaphore *sem, const char *name, | 66 | void __init_rwsem(struct rw_semaphore *sem, const char *name, |