mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull locking updates from Ingo Molnar: - Add 'cross-release' support to lockdep, which allows APIs like completions, where it's not the 'owner' who releases the lock, to be tracked. It's all activated automatically under CONFIG_PROVE_LOCKING=y. - Clean up (restructure) the x86 atomics op implementation to be more readable, in preparation of KASAN annotations. (Dmitry Vyukov) - Fix static keys (Paolo Bonzini) - Add killable versions of down_read() et al (Kirill Tkhai) - Rework and fix jump_label locking (Marc Zyngier, Paolo Bonzini) - Rework (and fix) tlb_flush_pending() barriers (Peter Zijlstra) - Remove smp_mb__before_spinlock() and convert its usages, introduce smp_mb__after_spinlock() (Peter Zijlstra) * 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (56 commits) locking/lockdep/selftests: Fix mixed read-write ABBA tests sched/completion: Avoid unnecessary stack allocation for COMPLETION_INITIALIZER_ONSTACK() acpi/nfit: Fix COMPLETION_INITIALIZER_ONSTACK() abuse locking/pvqspinlock: Relax cmpxchg's to improve performance on some architectures smp: Avoid using two cache lines for struct call_single_data locking/lockdep: Untangle xhlock history save/restore from task independence locking/refcounts, x86/asm: Disable CONFIG_ARCH_HAS_REFCOUNT for the time being futex: Remove duplicated code and fix undefined behaviour Documentation/locking/atomic: Finish the document... locking/lockdep: Fix workqueue crossrelease annotation workqueue/lockdep: 'Fix' flush_work() annotation locking/lockdep/selftests: Add mixed read-write ABBA tests mm, locking/barriers: Clarify tlb_flush_pending() barriers locking/lockdep: Make CONFIG_LOCKDEP_CROSSRELEASE and CONFIG_LOCKDEP_COMPLETIONS truly non-interactive locking/lockdep: Explicitly initialize wq_barrier::done::map locking/lockdep: Rename CONFIG_LOCKDEP_COMPLETE to CONFIG_LOCKDEP_COMPLETIONS locking/lockdep: Reword title of LOCKDEP_CROSSRELEASE config locking/lockdep: Make CONFIG_LOCKDEP_CROSSRELEASE part of CONFIG_PROVE_LOCKING locking/refcounts, x86/asm: Implement fast refcount overflow protection locking/lockdep: Fix the rollback and overwrite detection logic in crossrelease ...
This commit is contained in:
commit
5f82e71a00
108 changed files with 3460 additions and 1112 deletions
|
|
@ -1091,6 +1091,8 @@ config PROVE_LOCKING
|
|||
select DEBUG_MUTEXES
|
||||
select DEBUG_RT_MUTEXES if RT_MUTEXES
|
||||
select DEBUG_LOCK_ALLOC
|
||||
select LOCKDEP_CROSSRELEASE
|
||||
select LOCKDEP_COMPLETIONS
|
||||
select TRACE_IRQFLAGS
|
||||
default n
|
||||
help
|
||||
|
|
@ -1160,6 +1162,22 @@ config LOCK_STAT
|
|||
CONFIG_LOCK_STAT defines "contended" and "acquired" lock events.
|
||||
(CONFIG_LOCKDEP defines "acquire" and "release" events.)
|
||||
|
||||
config LOCKDEP_CROSSRELEASE
|
||||
bool
|
||||
help
|
||||
This makes lockdep work for crosslock which is a lock allowed to
|
||||
be released in a different context from the acquisition context.
|
||||
Normally a lock must be released in the context acquiring the lock.
|
||||
However, relexing this constraint helps synchronization primitives
|
||||
such as page locks or completions can use the lock correctness
|
||||
detector, lockdep.
|
||||
|
||||
config LOCKDEP_COMPLETIONS
|
||||
bool
|
||||
help
|
||||
A deadlock caused by wait_for_completion() and complete() can be
|
||||
detected by lockdep using crossrelease feature.
|
||||
|
||||
config DEBUG_LOCKDEP
|
||||
bool "Lock dependency engine debugging"
|
||||
depends on DEBUG_KERNEL && LOCKDEP
|
||||
|
|
|
|||
|
|
@ -362,6 +362,103 @@ static void rsem_AA3(void)
|
|||
RSL(X2); // this one should fail
|
||||
}
|
||||
|
||||
/*
|
||||
* read_lock(A)
|
||||
* spin_lock(B)
|
||||
* spin_lock(B)
|
||||
* write_lock(A)
|
||||
*/
|
||||
static void rlock_ABBA1(void)
|
||||
{
|
||||
RL(X1);
|
||||
L(Y1);
|
||||
U(Y1);
|
||||
RU(X1);
|
||||
|
||||
L(Y1);
|
||||
WL(X1);
|
||||
WU(X1);
|
||||
U(Y1); // should fail
|
||||
}
|
||||
|
||||
static void rwsem_ABBA1(void)
|
||||
{
|
||||
RSL(X1);
|
||||
ML(Y1);
|
||||
MU(Y1);
|
||||
RSU(X1);
|
||||
|
||||
ML(Y1);
|
||||
WSL(X1);
|
||||
WSU(X1);
|
||||
MU(Y1); // should fail
|
||||
}
|
||||
|
||||
/*
|
||||
* read_lock(A)
|
||||
* spin_lock(B)
|
||||
* spin_lock(B)
|
||||
* read_lock(A)
|
||||
*/
|
||||
static void rlock_ABBA2(void)
|
||||
{
|
||||
RL(X1);
|
||||
L(Y1);
|
||||
U(Y1);
|
||||
RU(X1);
|
||||
|
||||
L(Y1);
|
||||
RL(X1);
|
||||
RU(X1);
|
||||
U(Y1); // should NOT fail
|
||||
}
|
||||
|
||||
static void rwsem_ABBA2(void)
|
||||
{
|
||||
RSL(X1);
|
||||
ML(Y1);
|
||||
MU(Y1);
|
||||
RSU(X1);
|
||||
|
||||
ML(Y1);
|
||||
RSL(X1);
|
||||
RSU(X1);
|
||||
MU(Y1); // should fail
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* write_lock(A)
|
||||
* spin_lock(B)
|
||||
* spin_lock(B)
|
||||
* write_lock(A)
|
||||
*/
|
||||
static void rlock_ABBA3(void)
|
||||
{
|
||||
WL(X1);
|
||||
L(Y1);
|
||||
U(Y1);
|
||||
WU(X1);
|
||||
|
||||
L(Y1);
|
||||
WL(X1);
|
||||
WU(X1);
|
||||
U(Y1); // should fail
|
||||
}
|
||||
|
||||
static void rwsem_ABBA3(void)
|
||||
{
|
||||
WSL(X1);
|
||||
ML(Y1);
|
||||
MU(Y1);
|
||||
WSU(X1);
|
||||
|
||||
ML(Y1);
|
||||
WSL(X1);
|
||||
WSU(X1);
|
||||
MU(Y1); // should fail
|
||||
}
|
||||
|
||||
/*
|
||||
* ABBA deadlock:
|
||||
*/
|
||||
|
|
@ -1056,8 +1153,6 @@ static void dotest(void (*testcase_fn)(void), int expected, int lockclass_mask)
|
|||
if (debug_locks != expected) {
|
||||
unexpected_testcase_failures++;
|
||||
pr_cont("FAILED|");
|
||||
|
||||
dump_stack();
|
||||
} else {
|
||||
testcase_successes++;
|
||||
pr_cont(" ok |");
|
||||
|
|
@ -1933,6 +2028,30 @@ void locking_selftest(void)
|
|||
dotest(rsem_AA3, FAILURE, LOCKTYPE_RWSEM);
|
||||
pr_cont("\n");
|
||||
|
||||
print_testname("mixed read-lock/lock-write ABBA");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_ABBA1, FAILURE, LOCKTYPE_RWLOCK);
|
||||
/*
|
||||
* Lockdep does indeed fail here, but there's nothing we can do about
|
||||
* that now. Don't kill lockdep for it.
|
||||
*/
|
||||
unexpected_testcase_failures--;
|
||||
|
||||
pr_cont(" |");
|
||||
dotest(rwsem_ABBA1, FAILURE, LOCKTYPE_RWSEM);
|
||||
|
||||
print_testname("mixed read-lock/lock-read ABBA");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_ABBA2, SUCCESS, LOCKTYPE_RWLOCK);
|
||||
pr_cont(" |");
|
||||
dotest(rwsem_ABBA2, FAILURE, LOCKTYPE_RWSEM);
|
||||
|
||||
print_testname("mixed write-lock/lock-write ABBA");
|
||||
pr_cont(" |");
|
||||
dotest(rlock_ABBA3, FAILURE, LOCKTYPE_RWLOCK);
|
||||
pr_cont(" |");
|
||||
dotest(rwsem_ABBA3, FAILURE, LOCKTYPE_RWSEM);
|
||||
|
||||
printk(" --------------------------------------------------------------------------\n");
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue