Jason Low
9198f6edfd
locking/rwsem: Fix lock optimistic spinning when owner is not running
...
Ming reported soft lockups occurring when running xfstest due to
the following tip:locking/core commit:
b3fd4f03ca ("locking/rwsem: Avoid deceiving lock spinners")
When doing optimistic spinning in rwsem, threads should stop
spinning when the lock owner is not running. While a thread is
spinning on owner, if the owner reschedules, owner->on_cpu
returns false and we stop spinning.
However, this commit essentially caused the check to get
ignored because when we break out of the spin loop due to
!on_cpu, we continue spinning if sem->owner != NULL.
This patch fixes this by making sure we stop spinning if the
owner is not running. Furthermore, just like with mutexes,
refactor the code such that we don't have separate checks for
owner_running(). This makes it more straightforward in terms of
why we exit the spin on owner loop and we would also avoid
needing to "guess" why we broke out of the loop to make this
more readable.
Reported-and-tested-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Jason Low <jason.low2@hp.com>
Acked-by: Davidlohr Bueso <dave@stgolabs.net>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Jones <davej@codemonkey.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Michel Lespinasse <walken@google.com>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Sasha Levin <sasha.levin@oracle.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Tim Chen <tim.c.chen@linux.intel.com>
Link: http://lkml.kernel.org/r/1425714331.2475.388.camel@j-VirtualBox
Signed-off-by: Ingo Molnar <mingo@kernel.org>
2015-03-07 09:50:49 +01:00
..
bpf
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2015-01-27 13:55:36 -08:00
configs
debug
debug: prevent entering debug mode on panic/exception.
2015-02-19 12:39:03 -06:00
events
Merge branch 'perf-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-02-16 14:58:12 -08:00
gcov
kbuild,gcov: simplify kernel/gcov/Makefile more
2015-01-09 17:25:44 +01:00
irq
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-02-16 15:20:40 -08:00
livepatch
livepatch: add missing newline to error message
2015-02-06 21:28:35 +01:00
locking
locking/rwsem: Fix lock optimistic spinning when owner is not running
2015-03-07 09:50:49 +01:00
power
PM / sleep: Re-implement suspend-to-idle handling
2015-02-13 23:49:36 +01:00
printk
KGDB/KDB New:
2015-02-20 15:13:29 -08:00
rcu
Merge branches 'core-urgent-for-linus' and 'irq-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-02-21 10:36:06 -08:00
sched
Merge branch 'sched-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-02-21 10:40:02 -08:00
time
Merge branch 'timers-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-02-21 11:05:22 -08:00
trace
tracing: use %*pb[l] to print bitmaps including cpumasks and nodemasks
2015-02-13 21:21:37 -08:00
.gitignore
acct.c
new fs_pin killing logics
2015-01-25 23:17:28 -05:00
async.c
kernel/async.c: switch to pr_foo()
2014-10-09 22:26:04 -04:00
audit.c
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
2014-12-30 10:45:47 -08:00
audit.h
audit: replace getname()/putname() hacks with reference counters
2015-01-23 00:23:58 -05:00
audit_tree.c
fsnotify: unify inode and mount marks handling
2014-12-13 12:42:53 -08:00
audit_watch.c
auditfilter.c
Merge branch 'upstream' of git://git.infradead.org/users/pcmoore/audit
2015-02-11 20:07:47 -08:00
auditsc.c
Merge branch 'getname2' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2015-02-17 15:27:47 -08:00
backtracetest.c
bounds.c
capability.c
cgroup.c
kernfs: remove KERNFS_STATIC_NAME
2015-02-13 21:21:36 -08:00
cgroup_freezer.c
compat.c
all arches, signal: move restart_block to struct task_struct
2015-02-12 18:54:12 -08:00
configs.c
context_tracking.c
sched: stop the unbound recursion in preempt_schedule_context()
2014-10-28 10:46:05 +01:00
cpu.c
hotplugcpu: Avoid deadlocks by waking active_writer
2015-01-06 11:01:14 -08:00
cpu_pm.c
cpuset.c
cpuset: use %*pb[l] to print bitmaps including cpumasks and nodemasks
2015-02-13 21:21:37 -08:00
crash_dump.c
cred.c
delayacct.c
dma.c
elfcore.c
exec_domain.c
exit.c
oom, PM: make OOM detection in the freezer path raceless
2015-02-11 17:06:03 -08:00
extable.c
ftrace/x86/extable: Add is_ftrace_trampoline() function
2014-11-19 15:25:26 -05:00
fork.c
mm: do not use mm->nr_pmds on !MMU configurations
2015-02-12 18:54:10 -08:00
freezer.c
freezer: remove obsolete comments in __thaw_task()
2014-10-21 23:44:20 +02:00
futex.c
Linux 34.0-rc1
2015-02-24 08:41:07 +01:00
futex_compat.c
groups.c
userns: Don't allow setgroups until a gid mapping has been setablished
2014-12-09 16:58:40 -06:00
hung_task.c
irq_work.c
percpu: Convert remaining __get_cpu_var uses in 3.18-rcX
2014-10-29 11:18:18 -04:00
jump_label.c
kallsyms.c
kernel/kallsyms.c: use __seq_open_private()
2014-10-14 02:18:16 +02:00
kcmp.c
Kconfig.freezer
Kconfig.hz
Kconfig.locks
locking/mcs: Better differentiate between MCS variants
2015-01-14 15:07:32 +01:00
Kconfig.preempt
kexec.c
kexec: simplify conditional
2015-02-17 14:34:51 -08:00
kmod.c
usermodehelper: kill the kmod_thread_locker logic
2014-12-10 17:41:17 -08:00
kprobes.c
kprobes: makes kprobes/enabled works correctly for optimized kprobes.
2015-02-13 21:21:42 -08:00
ksysfs.c
kthread.c
kernel/kthread.c: partial revert of 81c98869fa ("kthread: ensure locality of task_struct allocations")
2014-10-09 22:25:51 -04:00
latencytop.c
Makefile
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
2015-02-11 20:25:11 -08:00
module-internal.h
module.c
kernel/module.c: do not inline do_init_module()
2015-02-17 14:34:53 -08:00
module_signing.c
notifier.c
rcu: Make SRCU optional by using CONFIG_SRCU
2015-01-06 11:04:29 -08:00
nsproxy.c
bury struct proc_ns in fs/proc
2014-12-04 14:34:54 -05:00
padata.c
padata: use %*pb[l] to print bitmaps including cpumasks and nodemasks
2015-02-13 21:21:38 -08:00
panic.c
livepatch: kernel: add TAINT_LIVEPATCH
2014-12-22 15:40:48 +01:00
params.c
param: fix uninitialized read with CONFIG_DEBUG_LOCK_ALLOC
2015-01-20 11:38:31 +10:30
pid.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2014-12-16 15:53:03 -08:00
pid_namespace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs
2014-12-16 15:53:03 -08:00
profile.c
profile: use %*pb[l] to print bitmaps including cpumasks and nodemasks
2015-02-13 21:21:38 -08:00
ptrace.c
ptrace: remove linux/compat.h inclusion under CONFIG_COMPAT
2015-02-17 14:34:51 -08:00
range.c
kernel: avoid overflow in cmp_range
2015-01-17 10:02:23 +13:00
reboot.c
kernel: add support for kernel restart handler call chain
2014-09-26 00:00:06 -07:00
relay.c
resource.c
resources: Move struct resource_list_entry from ACPI into resource core
2015-02-05 15:09:25 +01:00
seccomp.c
seccomp: cap SECCOMP_RET_ERRNO data to MAX_ERRNO
2015-02-17 14:34:55 -08:00
signal.c
signal: use current->state helpers
2015-02-17 14:34:51 -08:00
smp.c
Merge branch 'for-3.18-consistent-ops' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/percpu
2014-10-15 07:48:18 +02:00
smpboot.c
smpboot: Add missing get_online_cpus() in smpboot_register_percpu_thread()
2015-01-23 11:33:51 +01:00
smpboot.h
softirq.c
Merge branch 'locking-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2015-02-09 15:24:03 -08:00
stacktrace.c
stacktrace: introduce snprint_stack_trace for buffer output
2014-12-13 12:42:48 -08:00
stop_machine.c
sys.c
Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
2015-02-21 19:41:38 -08:00
sys_ni.c
syscalls: implement execveat() system call
2014-12-13 12:42:51 -08:00
sysctl.c
mm, hugetlb: remove unnecessary lower bound on sysctl handlers"?
2015-02-10 14:30:34 -08:00
sysctl_binary.c
kernel: add panic_on_warn
2014-12-10 17:41:10 -08:00
system_certificates.S
system_keyring.c
task_work.c
taskstats.c
netlink: make nlmsg_end() and genlmsg_end() void
2015-01-18 01:03:45 -05:00
test_kprobes.c
torture.c
tracepoint.c
tsacct.c
uid16.c
groups: Consolidate the setgroups permission checks
2014-12-05 17:19:27 -06:00
up.c
user-return-notifier.c
user.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2014-12-17 12:31:40 -08:00
user_namespace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2014-12-17 12:31:40 -08:00
utsname.c
copy address of proc_ns_ops into ns_common
2014-12-04 14:34:47 -05:00
utsname_sysctl.c
watchdog.c
kernel/sched/clock.c: add another clock for use with the soft lockup watchdog
2015-02-12 18:54:13 -08:00
workqueue.c
workqueue: use %*pb[l] to format bitmaps including cpumasks and nodemasks
2015-02-13 21:21:37 -08:00
workqueue_internal.h