Revision 3b6b7813b198b578aa7e04e4047ddb8225c37b7f authored by Mikulas Patocka on 20 March 2013, 17:21:25 UTC, committed by Alasdair G Kergon on 20 March 2013, 17:21:25 UTC
A deadlock was found in the prefetch code in the dm verity map
function.  This patch fixes this by transferring the prefetch
to a worker thread and skipping it completely if kmalloc fails.

If generic_make_request is called recursively, it queues the I/O
request on the current->bio_list without making the I/O request
and returns. The routine making the recursive call cannot wait
for the I/O to complete.

The deadlock occurs when one thread grabs the bufio_client
mutex and waits for an I/O to complete but the I/O is queued
on another thread's current->bio_list and is waiting to get
the mutex held by the first thread.

The fix recognises that prefetching is not essential.  If memory
can be allocated, it queues the prefetch request to the worker thread,
but if not, it does nothing.

Signed-off-by: Paul Taysom <taysom@chromium.org>
Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
Signed-off-by: Alasdair G Kergon <agk@redhat.com>
Cc: stable@kernel.org
1 parent 58051b9
History
File Mode Size
debug
events
gcov
irq
power
sched
time
trace
.gitignore -rw-r--r-- 63 bytes
Kconfig.freezer -rw-r--r-- 52 bytes
Kconfig.hz -rw-r--r-- 1.7 KB
Kconfig.locks -rw-r--r-- 4.3 KB
Kconfig.preempt -rw-r--r-- 2.1 KB
Makefile -rw-r--r-- 6.9 KB
acct.c -rw-r--r-- 16.6 KB
async.c -rw-r--r-- 10.1 KB
audit.c -rw-r--r-- 40.7 KB
audit.h -rw-r--r-- 5.8 KB
audit_tree.c -rw-r--r-- 22.2 KB
audit_watch.c -rw-r--r-- 13.9 KB
auditfilter.c -rw-r--r-- 36.1 KB
auditsc.c -rw-r--r-- 71.9 KB
backtracetest.c -rw-r--r-- 2.1 KB
bounds.c -rw-r--r-- 600 bytes
capability.c -rw-r--r-- 11.7 KB
cgroup.c -rw-r--r-- 147.9 KB
cgroup_freezer.c -rw-r--r-- 12.9 KB
compat.c -rw-r--r-- 30.4 KB
configs.c -rw-r--r-- 2.8 KB
context_tracking.c -rw-r--r-- 4.2 KB
cpu.c -rw-r--r-- 17.5 KB
cpu_pm.c -rw-r--r-- 6.5 KB
cpuset.c -rw-r--r-- 77.0 KB
crash_dump.c -rw-r--r-- 1.2 KB
cred.c -rw-r--r-- 21.2 KB
delayacct.c -rw-r--r-- 5.1 KB
dma.c -rw-r--r-- 3.6 KB
elfcore.c -rw-r--r-- 459 bytes
exec_domain.c -rw-r--r-- 4.3 KB
exit.c -rw-r--r-- 43.0 KB
extable.c -rw-r--r-- 3.9 KB
fork.c -rw-r--r-- 45.7 KB
freezer.c -rw-r--r-- 4.0 KB
futex.c -rw-r--r-- 71.1 KB
futex_compat.c -rw-r--r-- 4.5 KB
groups.c -rw-r--r-- 6.0 KB
hrtimer.c -rw-r--r-- 47.1 KB
hung_task.c -rw-r--r-- 5.3 KB
irq_work.c -rw-r--r-- 4.5 KB
itimer.c -rw-r--r-- 7.3 KB
jump_label.c -rw-r--r-- 10.8 KB
kallsyms.c -rw-r--r-- 14.7 KB
kcmp.c -rw-r--r-- 4.3 KB
kexec.c -rw-r--r-- 40.5 KB
kmod.c -rw-r--r-- 19.2 KB
kprobes.c -rw-r--r-- 59.0 KB
ksysfs.c -rw-r--r-- 5.5 KB
kthread.c -rw-r--r-- 16.9 KB
latencytop.c -rw-r--r-- 7.6 KB
lglock.c -rw-r--r-- 1.9 KB
lockdep.c -rw-r--r-- 103.9 KB
lockdep_internals.h -rw-r--r-- 4.5 KB
lockdep_proc.c -rw-r--r-- 17.0 KB
lockdep_states.h -rw-r--r-- 233 bytes
modsign_certificate.S -rw-r--r-- 467 bytes
modsign_pubkey.c -rw-r--r-- 2.6 KB
module-internal.h -rw-r--r-- 495 bytes
module.c -rw-r--r-- 96.7 KB
module_signing.c -rw-r--r-- 5.9 KB
mutex-debug.c -rw-r--r-- 2.9 KB
mutex-debug.h -rw-r--r-- 1.7 KB
mutex.c -rw-r--r-- 13.3 KB
mutex.h -rw-r--r-- 1.3 KB
notifier.c -rw-r--r-- 16.0 KB
nsproxy.c -rw-r--r-- 6.2 KB
padata.c -rw-r--r-- 27.1 KB
panic.c -rw-r--r-- 11.2 KB
params.c -rw-r--r-- 21.7 KB
pid.c -rw-r--r-- 14.8 KB
pid_namespace.c -rw-r--r-- 8.8 KB
posix-cpu-timers.c -rw-r--r-- 41.4 KB
posix-timers.c -rw-r--r-- 29.3 KB
printk.c -rw-r--r-- 70.4 KB
profile.c -rw-r--r-- 16.1 KB
ptrace.c -rw-r--r-- 27.8 KB
range.c -rw-r--r-- 2.9 KB
rcu.h -rw-r--r-- 4.0 KB
rcupdate.c -rw-r--r-- 13.2 KB
rcutiny.c -rw-r--r-- 10.4 KB
rcutiny_plugin.h -rw-r--r-- 33.2 KB
rcutorture.c -rw-r--r-- 63.5 KB
rcutree.c -rw-r--r-- 98.3 KB
rcutree.h -rw-r--r-- 22.5 KB
rcutree_plugin.h -rw-r--r-- 73.6 KB
rcutree_trace.c -rw-r--r-- 12.9 KB
relay.c -rw-r--r-- 32.8 KB
res_counter.c -rw-r--r-- 4.3 KB
resource.c -rw-r--r-- 27.8 KB
rtmutex-debug.c -rw-r--r-- 4.7 KB
rtmutex-debug.h -rw-r--r-- 1.4 KB
rtmutex-tester.c -rw-r--r-- 8.7 KB
rtmutex.c -rw-r--r-- 26.3 KB
rtmutex.h -rw-r--r-- 1.1 KB
rtmutex_common.h -rw-r--r-- 3.3 KB
rwsem.c -rw-r--r-- 2.6 KB
seccomp.c -rw-r--r-- 13.9 KB
semaphore.c -rw-r--r-- 7.2 KB
signal.c -rw-r--r-- 94.9 KB
smp.c -rw-r--r-- 18.3 KB
smpboot.c -rw-r--r-- 6.6 KB
smpboot.h -rw-r--r-- 564 bytes
softirq.c -rw-r--r-- 20.7 KB
spinlock.c -rw-r--r-- 9.5 KB
srcu.c -rw-r--r-- 19.5 KB
stacktrace.c -rw-r--r-- 1.1 KB
stop_machine.c -rw-r--r-- 14.6 KB
sys.c -rw-r--r-- 52.0 KB
sys_ni.c -rw-r--r-- 5.9 KB
sysctl.c -rw-r--r-- 59.8 KB
sysctl_binary.c -rw-r--r-- 51.0 KB
task_work.c -rw-r--r-- 2.2 KB
taskstats.c -rw-r--r-- 16.4 KB
test_kprobes.c -rw-r--r-- 8.5 KB
time.c -rw-r--r-- 18.8 KB
timeconst.bc -rw-r--r-- 2.7 KB
timer.c -rw-r--r-- 49.6 KB
tracepoint.c -rw-r--r-- 19.7 KB
tsacct.c -rw-r--r-- 5.0 KB
uid16.c -rw-r--r-- 6.0 KB
up.c -rw-r--r-- 413 bytes
user-return-notifier.c -rw-r--r-- 1.3 KB
user.c -rw-r--r-- 5.2 KB
user_namespace.c -rw-r--r-- 22.2 KB
utsname.c -rw-r--r-- 2.9 KB
utsname_sysctl.c -rw-r--r-- 3.0 KB
wait.c -rw-r--r-- 8.3 KB
watchdog.c -rw-r--r-- 13.8 KB
workqueue.c -rw-r--r-- 104.1 KB
workqueue_internal.h -rw-r--r-- 2.0 KB

back to top